예외처리(ExceptionHandler)

dev-jjun·2023년 8월 13일
0

Server

목록 보기
12/33
post-thumbnail

@RestControllerAdvice

@ControllerAdvice + @ResponseBody → Response Body로 값을 리턴!

*@Component 어노테이션을 가지고 있어 마찬가지로 컴포넌트 스캔을 통한 스프링 빈 등록이 가능하다.

💡 `@ControllerAdvice`

모든 컨트롤러에 대해 전역적으로 발생할 수 있는 예외를 잡아서 처리하도록 하는 AOP 기반의 핸들러

→ @ExceptionHandler, @ModelAttribute, @InitBinder가 적용된 메서드들에 AOP를 적용해 Controller 단에 적용하기 위해 고안되었다.

@ExceptionHandler

@Controller@RestController가 적용된 Bean 내에서 발생한 예외를 받아서 처리하도록 하는 어노테이션

@ModelAttribute

HTTP 요청을 받을 때, 필요한 파라미터 정보를 @RequestParam으로 전달받으면 일일이 요청 파라미터를 매핑해줘야 한다. 이때 검색 조건에 대한 변경사항이 발생하면 코드를 일일이 수정해줘야 하는 번거로움이 있는데, @ModelAttribute를 사용하면 이러한 문제점을 해결하여 한번에 매핑하는 것이 가능해지고 변경 시에도 따로 수정할 필요가 없다.

public BaseResponse getPage(@RequestParam int id,
                              @RequestParam String name,
                              @RequestParam String email) { ... }

public BaseResponse getPage(@ModelAttribute SearchForm searchForm) { ... }

@InitBinder

Spring Validator를 사용 시 @Valid 어노테이션으로 검증이 필요한 객체를 가져오기 전에 수행할 메소드를 지정해주는 어노테이션이다. → 데이터 검증을 위해 Validator 인터페이스의 구현체를 따로 만들어 validate() 메소드를 직접 호출하여 사용하지 않아고, 스프링 프레임워크에서 호출이 가능하다.

왜! 이 어노테이션을 사용해야 하는가

예외 클래스를 사용하는 방식은 크게 두 가지로 나눠서 볼 수 있다.

💡 Checked Exception VS Unchecked Exception

최근 예외 클래스 사용의 트렌드는 Unchecked Exception을 사용하는 것이다 !

  • Checked Exception : try-catch를 사용하여 예외를 처리하도록 강제하는 방식

    → 아는 try-catch를 남발하게 되며, 의미없는 catch 구문을 쓰게 되고 불필요한 코드가 많아진다는 단점이 있다.

  • Unchecked Exception : try-catch를 강제하지 않는 방식

🤔 그렇다면, 예외를 catch한 이후에는?

로그를 남겨줍시다! → 발생한 문제에 대해 예외 종류에 따라 로깅 레벨을 지정해준 후, 로그 메시지로 원인을 파악할 수 있도록 함과 동시에, stack race를 남겨서 해결할 수 있도록 해야 한다

레벨설명
DEBUG개발 단계에서 프로세스의 흐름을 체크하는 경우 등에 사용
INFO디버깅 정보 외에 필요한 정보(설정 정보 등)를 기록할 떄 사용
WARN오류 상황은 아니지만, 추후 확인이 필요한 정보 등을 남길 때 사용
ERROR가장 우선순위로 처리해야 하는 예외 상황에 사용
FATAL매우 심각한 상황에 사용 (개발자가 사용할 일은 거의 無

*log4j를 사용하면, 따로 처리해주지 않고 마지막에 Exception 객체만 넘겨줘도 stack race를 남길 수 있다.

*참고 자료 - https://velog.io/@midas/Exception-처리-방법

profile
서버 개발자를 꿈꾸며 성장하는 쭌입니다 😽

0개의 댓글