작성
·
299
·
수정됨
0
안녕하세요 강사님
현재 스프링부트 3.2.2 버전을 사용하고 있습니다.
배운대로 개인적인 프로젝트에 적용해보고 있는데
@Around 애노테이션의 메서드 실행이
@GetMapping일 경우에는 AOP가 잘 작동하나
@PostMapping일 경우에는 작동하지 않고
@Validation 애노테이션에서 오류가 먼저 터집니다..
무슨 문제일까요..?
.m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public org.springframework.http.ResponseEntity<?> com.board.www.app.board.controller.api.BoardApiController.create(com.board.www.app.board.dto.BoardDto,org.springframework.web.multipart.MultipartFile) with 2 errors: [Field error in object 'dto' on field 'content': rejected value []; codes [NotBlank.dto.content,NotBlank.content,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dto.content,content]; arguments []; default message [content]]; default message [내용을 입력해 주세요]] [Field error in object 'dto' on field 'title': rejected value []; codes [NotBlank.dto.title,NotBlank.title,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dto.title,title]; arguments []; default message [title]]; default message [제목을 입력해 주세요]] ]
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
님께서 문의하신 내용은 Spring Boot에서 @PostMapping
을 사용할 때 AOP가 작동하지 않고, @Valid
애노테이션에서 오류가 나는 문제를 말씀하시는 것 같습니다. 보내주신 이미지 내용을 바탕으로, MethodArgumentNotValidException
은 Spring에서 @Valid
애노테이션을 사용하여 요청 데이터의 검증 과정에서 빈 값 혹은 잘못된 형식의 데이터가 입력되었을 때 발생하는 예외입니다.
AOP의 @Around
어드바이스는 메서드 실행 전후로 추가적인 로직을 삽입할 수 있는데, @Validation
오류가 나는 것은 AOP가 작동하지 않기 때문이 아니라, 실제로 @Valid
애노테이션에 의해 검증이 실패하여 예외가 발생하기 때문입니다.
스프링 버전 업그레이드와는 별개로 @PostMapping
핸들러 메서드에서 유효성 검증을 수행할 때, AOP가 작동하기 전에 @Valid
에 의해 입력 데이터가 먼저 검증되며, 이 과정에서 오류가 발생하면 해당 예외가 발생하여 핸들러 메서드로 제어가 넘어가지 않습니다. 따라서 AOP의 Pointcut 조건이 달라지는 것과는 무관하며, 오히려 유효하지 않은 요청 데이터 때문에 발생하는 문제로 보입니다.
올바른 해결을 위해서는 다음과 같은 점을 확인해야 합니다:
@Valid
를 사용하여 데이터 검증을 수행하기 전에 요청 데이터가 올바른지 확인해야 합니다.
만약, @Valid
에 의한 검증을 AOP 로직 실행 후에 수행하고 싶다면, AOP의 Pointcut을 조정하거나 다른 방법을 고려해야 할 수도 있습니다.
Spring Boot 버전을 업그레이드 했다면, 이와 관련된 변경 사항을 확인해보는 것도 좋을 것입니다.
더 자세한 정보는 Spring Boot Reference Documentation의 적절한 섹션을 참고하시길 바랍니다.
말씀해주신 내용과 다르게
강의에서는 @Valid를 사용했을 때 유효성 검증을 수행하기 전에 @Around 어드바이스에서 먼저 실행되었습니다.
그래서 여러가지로 테스트 결과
@RequestBody 애노테이션과 BindingResult bindingResult를 매개변수로 받을 경우에는
@Around 어드바이스에서 먼저 실행되지만
@RequestPart일 경우에는 말씀해주신 이유로 @Valid가 먼저 실행되는 것 같습니다
방법이 있는지 찾아봐야될 것 같습니다..ㅠㅠ