인프런 커뮤니티 질문&답변

강프로그래머님의 프로필 이미지
강프로그래머

작성한 질문수

스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션

회원가입 컨트롤러 유효성검사 AOP 적용

스프링 버전업일 경우에는 Pointcut @PostMapping 조건이 달라질까요?

작성

·

309

·

수정됨

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 조건이 달라지는 것과는 무관하며, 오히려 유효하지 않은 요청 데이터 때문에 발생하는 문제로 보입니다.

올바른 해결을 위해서는 다음과 같은 점을 확인해야 합니다:

  1. @Valid를 사용하여 데이터 검증을 수행하기 전에 요청 데이터가 올바른지 확인해야 합니다.

  2. 만약, @Valid에 의한 검증을 AOP 로직 실행 후에 수행하고 싶다면, AOP의 Pointcut을 조정하거나 다른 방법을 고려해야 할 수도 있습니다.

  3. Spring Boot 버전을 업그레이드 했다면, 이와 관련된 변경 사항을 확인해보는 것도 좋을 것입니다.

더 자세한 정보는 Spring Boot Reference Documentation의 적절한 섹션을 참고하시길 바랍니다.

말씀해주신 내용과 다르게

강의에서는 @Valid를 사용했을 때 유효성 검증을 수행하기 전에 @Around 어드바이스에서 먼저 실행되었습니다.

 

그래서 여러가지로 테스트 결과

@RequestBody 애노테이션과 BindingResult bindingResult를 매개변수로 받을 경우에는

@Around 어드바이스에서 먼저 실행되지만

 

@RequestPart일 경우에는 말씀해주신 이유로 @Valid가 먼저 실행되는 것 같습니다

방법이 있는지 찾아봐야될 것 같습니다..ㅠㅠ

강프로그래머님의 프로필 이미지
강프로그래머

작성한 질문수

질문하기