본문 바로가기
PlayGround/마실가실 리팩토링

[1년 후 마실가실] @Valid와 @RestControllerAdvice

by HJ0216 2024. 9. 29.

1년 전 진행했던 마실가실 프로젝트를 🛠️리팩토링하며 정리한 내용입니다.

 

 

최근에 마실가실 리팩토링 보완점을 들을 수 있던 좋은 기회가 있어서 관련된 내용을 리리팩토링하고 있습니다👩‍🏫!

 

현재 프로젝트에서는 유효성 검증을 전역으로 하고 있었습니다.

무슨 말이냐면.. SignUpDto에서 이메일, 전화번호, 비밀번호 등을 받을 때, 유효성 검증이 들어가는데 저는

'ValidationUtils'를 통해서 빈 값은 아닌지 형식은 맞는지 검증을 했었죠.

 

하지만, 회원가입 시 한 번만 쓰이는 Validation은 전역보다는 해당 DTO에서 처리하는 좋은 방법도 있다는 걸 알게 되었는데..

 

문제는.. 기존에 @RestControllerAdvice 설정들이 움직이지 않는다는 것,,

이 참에 예외 처리를 제대로 정리해 보고자 합니다,,🌟

 

SignUpRequestDTO.java

* Validation

  * ValidationUtils → Annotation 활용(@NotNull, @Pattern 등)

  * UserType: String → Enum 값 유효성 검사로 변경

 

🚨 Annotation 사용을 통해 CustomErrorCode의 검증이 이뤄지지 않음

  🔨 이참에 Exception 처리 방식을 공부하면서 고치자

 

 

GlobalExceptionHandler.java

* @RestControllerAdvice를 선언하여 여러 컨트롤러에 대해 전역적으로 ExceptionHandler를 적용

  * ExceptionHandler: Exception 클래스들을 속성으로 받아 처리할 예외를 지정할 수 있음

 

 

ErrorCode.java

* 클라이언트에게 보내줄 에러 코드를 정의

  * ErrorCode: 인터페이스를 이용해 추상화

  * CommonErrorCode: 애플리케이션에서 전역적으로 사용

  * UserErrorCode: 특정 도메인에 대해 구체적 사용

 

 

 

BusinessException.java

* ErrorCode를 받아서 처리해줄 CustomException class

* RuntimeException을 상속

  * 예외가 발생했을 때, 프로그램을 종료하기보다는 해당 예외를 적절히 처리하여 비즈니스 로직을 올바르게 진행하거나 사용자의 잘못된 요청에 대한 피드백을 제공하는 것이 목표

 

  🚨 스프링 프레임워크가 제공하는 선언적 트랜잭션(@Transactional)안에서 에러 발생 시 체크 예외는 롤백이 되지 않고, 언체크 예외는 롤백됨

 

 

ErrorResponse.java

* 클라이언트에 반환할 ErrorResponse 설정

* ValidationError

  * @Valid를 사용했을 때 에러가 발생한 경우 어느 필드에서 에러가 발생했는지 응답을 위한 내부 정적 클래스

  * FieldError

    * Spring에서 유효성 검사가 실패한 필드에 대한 정보를 제공하는 클래스

 

 

GlobalExceptionHandler.java

* ResponseEntityExceptionHandler

  * 스프링 예외에 대한 ExceptionHandler가 모두 구현되어 있음

  * 에러 메세지는 반환하지 않으므로 스프링 예외에 대한 에러 응답을 보내려면 handleExceptionInternal()를 오버라이딩

* @Valid에 의한 MethodArgumentNotValidException

  * @Valid 관련 정보: MethodArgumentNotValidException의 getBindingResult 참조

 

 

 

🙋‍♀️

본 포스트는 공부 목적으로 작성하였습니다.
보시는 도중 잘못된 부분이나 개선할 부분이 있다면 댓글로 알려주시면 수정하도록 하겠습니다.

 

📑

참고 자료

https://mangkyu.tistory.com/205

 

[Spring] @RestControllerAdvice를 이용한 Spring 예외 처리 방법 - (2/2)

예외 처리는 robust한 애플리케이션을 만드는데 매우 중요한 부분을 차지한다. Spring 프레임워크는 매우 다양한 에러 처리 방법을 제공하는데, 앞선 포스팅에서 @RestControllerAdvice를 사용해야 하는

mangkyu.tistory.com