spring boot로 서버 api 프로젝트를 진행중 exception을 공통으로 처리할 필요가 생겼다.
관련해서 spring에서 공통 로직에서 exception을 처리하는 방법에 대해서 정리해본다.
1. @RestControllerAdvice
@ControllerAdvice + @ResponseBody
2. @ControllerAdvice
모든 @Controller에서 발생하는 예외를 전역적으로 처리하기 위해 사용
annotaions(), basePackageClasses(), basePackages() 를 사용해서 대상 contoller를 지정할수도 있음
3. @ResponseBody
method의 반환값을 http response의 body에 바인딩해서 클라이언트로 전송하기 위해 사용
4. @ExceptionHandler
예외를 처리하는 특정 클래스나 함수를 만들기 위해 사용하는 annotation
Exception의 종류에 따라 실행될 함수를 지정할 수 있음
다양한 파라미터를 받을 수 있음(Model, WebRequest 등)
다양한 반환형식 지원(Map, ModelAndView, Model, String 등)
5. 사용예시
테스트를 위해 controller에서 강제로 Exception을 발생시키게 하였다.
package com.syk531.controller;
import org.springframework.web.bind.annotation.GetMapping;
public class exceptionTestController {
@GetMapping("/commonExceptionTest")
public String commonExceptionTest() throws Exception {
throw new Exception("test exception 발생");
}
}
Exception이 발생할 경우 아래와 같이 처리된다.
1) @RestControllerAdvice으로 인해 @Controller에서 Exception이 발생할 경우 CommonExceptionHandler 클래스안에서 실행될 함수를 찾음
2) @ExceptionHadler(Exception.class)로 인해 Exception이 발생했으므로 commonExceptionHandle 함수가 실행됨
package com.syk531.exception;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class CommonExceptionHandler {
Logger logger = LoggerFactory.getLogger(CommonExceptionHandler.class);
@ExceptionHandler(Exception.class)
public void commonExceptionHandle(Exception e) {
logger.error(e.toString());
}
}
참고자료
'개발 > spring, spring boot' 카테고리의 다른 글
[Spring boot] WebSocket 사용 (0) | 2023.12.13 |
---|---|
spring boot 환경에서 npm 설정하는 방법 (1) | 2023.12.06 |
spring boot 3.2.0 버전 업그레이드 (1) | 2023.12.04 |
View단에서 Form Submit시 Dto 내부에 다른 Dto를 List로 가진 형태일때 처리방법 (0) | 2023.12.04 |
HTTP 상태 코드 500 에러 발생 시 (0) | 2023.09.21 |