@validated
는 스프링에서 관리하는 어노테이션, @valid
는 자바에서 관리하는 어노테이션이므로 쿼리파람을 매핑해줄 DTO를 만들어서 @valid
를 쓰는 게 좋을 것 같다는 리뷰를 받고 아래와 같이 EmailRequest 클래스를 만들고 컨트롤러를 수정해주었다. 컨트롤러에서는 @RequestParam
을 넣어주지 않는다.
http://dolszewski.com/spring/how-to-bind-requestparam-to-object/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class EmailRequest {
@Email
@NotEmpty
private String email;
}
@RestController
// @Validated <- 더 이상 쓰지 않으므로 주석 처리
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping("/validate/email")
public EmailValidationResponse validateEmail(@Valid EmailRequest email) {
return userService.validateEmail(email.getEmail());
}
}
@Validated
를 썼을 땐 ConstraintViolationException이 발생했으므로 @Valid
를 쓰면 프레디가 만들어 둔 MethodArgumentNotValidException에 걸려 핸들링이 될 줄 알았는데 BindException이 떴고 ControllerAdvice에서 BindExceptionHandler 메서드도 추가해주었지만 핸들이 되지 않고 DefaultHandlerExceptionResolver에서 핸들이 되고 그 안에서 리스폰스를 던져줘서 커프텀 에러 리스폰스로 매핑되지 않았다.. 아래는 에러 내용
2021-08-13 01:46:56.571 WARN 95466 --- [o-auto-1-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'emailRequest' on field 'email': rejected value []; codes [NotEmpty.emailRequest.email,NotEmpty.email,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [emailRequest.email,email]; arguments []; default message [email]]; default message [비어 있을 수 없습니다]]
HTTP/1.1 400
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 12 Aug 2021 16:46:56 GMT
Connection: close
{
"timestamp": "2021-08-12T16:46:56.584+00:00",
"status": 400,
"error": "Bad Request",
"path": "/api/validate/email"
}
이것저것 시도해 본 결과 쿼리파람이 아닌 @RequestBody
에 넣어주거나 @Validated
를 이용하는 수밖에 없었다. 다시 Validated로 돌아왔당..
머지 전 충돌 해결을 위해 메인에서 pull을 하고, 다시 기능 구현 브랜치로 돌아와 rebase를 하는데 이상한데서 충돌이 생겼다. 프레디의 리뷰를 받기 전에 메인 브랜치와 리베이스를 하는 과정에서 뭐가 잘못됐나보다. 그 때 시점으로 다시 돌아가 코드가 엉망이 되어버렸다. 프레디에게 도움을 요청해서 리베이스를 하기는 어렵겠다는 결론을 내고 머지로 현 시점 메인 브랜치와 컨플릭트 나는 파일만 해결하고 끝냈다. 여럿이 하는 팀 프로젝트인만큼 깃 공부도 해야겠다. 특히 리베이스와 머지 관련!