1. @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로 돌아왔당..

  2. 머지 전 충돌 해결을 위해 메인에서 pull을 하고, 다시 기능 구현 브랜치로 돌아와 rebase를 하는데 이상한데서 충돌이 생겼다. 프레디의 리뷰를 받기 전에 메인 브랜치와 리베이스를 하는 과정에서 뭐가 잘못됐나보다. 그 때 시점으로 다시 돌아가 코드가 엉망이 되어버렸다. 프레디에게 도움을 요청해서 리베이스를 하기는 어렵겠다는 결론을 내고 머지로 현 시점 메인 브랜치와 컨플릭트 나는 파일만 해결하고 끝냈다. 여럿이 하는 팀 프로젝트인만큼 깃 공부도 해야겠다. 특히 리베이스와 머지 관련!