AccountApiController
@PatchMapping("/auth/account")
public ResponseEntity<?> updateAccountProfile(@RequestBody @Valid InputNicknameRequest inputNicknameRequest,
BindingResult bindingResult,
@AuthenticationPrincipal PrincipalDetails principalDetails) {
accountService.updateAccountNickname(principalDetails.getAccount().getId(), inputNicknameRequest.getNickname());
return new ResponseEntity<>(new ResponseDto<>(1, "닉네임 수정 완료", null), HttpStatus.OK);
}
InputNicknameRequest
@Data
public static class InputNicknameRequest {
@NotEmpty
@Pattern(regexp = "^[ㄱ-ㅎ가-힣a-zA-Z]{1,10}$", message = "한글/영문 1~10자 이내로 작성해주세요")
private String nickname;
}
- 현재 내가 원하는 건 nickname이 'api/auth/account' url에 요청될 때 nickname의 길이가 10이 넘는다면 400 에러를 반환하는 것이다.
AccountApiAccountTest
@WithUserDetails(value = "kakao_1234", setupBefore = TestExecutionEvent.TEST_EXECUTION)
@Test
public void updateAccountProfile_failure_test() throws Exception {
// given
InputNicknameRequest inputNicknameRequest1 = new InputNicknameRequest();
inputNicknameRequest1.setNickname("testNickname");
InputNicknameRequest inputNicknameRequest2 = new InputNicknameRequest();
inputNicknameRequest2.setNickname("test");
InputNicknameRequest inputNicknameRequest3 = new InputNicknameRequest();
inputNicknameRequest3.setNickname("");
String requestBody1 = om.writeValueAsString(inputNicknameRequest1);
String requestBody2 = om.writeValueAsString(inputNicknameRequest2);
String requestBody3 = om.writeValueAsString(inputNicknameRequest3);
// when
ResultActions resultActions1 = mvc.perform(patch("/api/auth/account")
.content(requestBody1)
.contentType(MediaType.APPLICATION_JSON));
ResultActions resultActions2 = mvc.perform(patch("/api/auth/account")
.content(requestBody2)
.contentType(MediaType.APPLICATION_JSON));
ResultActions resultActions3 = mvc.perform(patch("/api/auth/account")
.content(requestBody3)
.contentType(MediaType.APPLICATION_JSON));
String responseBody1 = resultActions1.andReturn().getResponse().getContentAsString();
System.out.println("responseBody1 = " + responseBody1);
String responseBody2 = resultActions2.andReturn().getResponse().getContentAsString();
System.out.println("responseBody2 = " + responseBody2);
String responseBody3 = resultActions3.andReturn().getResponse().getContentAsString();
System.out.println("responseBody3 = " + responseBody3);
// then
resultActions1.andExpect(status().isBadRequest());
resultActions2.andExpect(status().isBadRequest());
resultActions3.andExpect(status().isBadRequest());
}
테스트 실행 결과
Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.DataException: could not execute statement org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.DataException: could not execute statement
- 테스트 결과 validation 체크가 되지 않고 "testNickname"이 데이터베이스에 삽입된 것을 확인할 수 있다.
- 현재 테이블의 nickname 필드 길이제한이 10이라 위와 같은 에러 코드가 발생한다.
원인
- @PatchMapping 대신 @PostMapping으로 변경해 테스트 수행 결과 정상적으로 validation 체크가 수행된다.
- 위와 같은 에러가 발생하는 이유는 @PatchMapping 사용시 validation 체크가 수행되지 않는 것으로 추정된다.
해결 방법
- 구글링을 해봤으나 @PatchMapping에 관한 정보가 많이 없어 찾지 못했다.
- 현재로써는 이 문제를 해결하기 위해 @PatchMapping 대신 @PostMapping을 사용해야 할 것 같다.
'기술 블로그 > MOLLY' 카테고리의 다른 글
@DataJpaTest (1) | 2023.05.15 |
---|---|
사용자 요청 시 권한 처리에 관하여 (0) | 2023.04.09 |
스프링 부트 + 리액트 + JWT + 스프링 시큐리티 + OAUTH2 소셜 로그인 기능 구현 (3) | 2023.04.08 |