@ExceptionHandler
📌 컨트롤러 클래스 내에서 특정 예외를 처리하는 메서드를 정의하는 Annotation으로 예외가 발생했을 때 설정된 메서드가 호출되어 예외를 처리한다.
- 특정 컨트롤러에서 발생한 예외를 처리하기 위한 메서드를 지정한다.
- 단일 컨트롤러 내에서 예외를 처리한다.
- 계층별로 알맞은 예외를 발생(throw new)시키기만 하면된다.
더보기
@RestController
@RequiredArgsConstructor
public class ExceptionHandlerController {
private final ExceptionHandlerService exceptionHandlerService;
@RequestMapping("/v1/exception")
public void illegalArgumentException() {
throw new IllegalArgumentException("IllegalArgumentException 발생");
}
@RequestMapping("/v2/exception")
public void nullPointerException() {
throw new NullPointerException("NPE 발생");
}
@RequestMapping("/v3/exception")
public void serviceLayerException() {
exceptionHandlerService.throwNewIllegalArgumentException();
}
// IllegalArgumentException을 처리하는 메서드
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<Map<String, String>> handleIllegalArgumentException(IllegalArgumentException ex) {
Map<String, String> response = new HashMap<>();
response.put("error", ex.getMessage());
return ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.body(response);
}
}
@RestController
public class NonExceptionHandlerController {
@RequestMapping("/v4/exception")
public void illegalArgumentException() {
throw new IllegalArgumentException("IllegalArgumentException 발생");
}
}
@Service
public class ExceptionHandlerService {
public void throwNewIllegalArgumentException() {
throw new IllegalArgumentException("ServiceLayer Exception");
}
}
- 문제점
- Controller 코드에 Exception 처리를 위한 책임이 추가된다.(단일 책임 원칙 위반)
- 단일 컨트롤러 내의 예외만 처리가 가능하다.(컨트롤러 예외처리 중복코드)
- 코드 재사용, 유지보수성 부족
CustomException 사용자 정의 Exception을 만들어서 처리할 수 있다. |
@ControllerAdvice
📌 @ControllerAdvice와 동일한 기능을 제공하지만 @RestController를 포함하고 있어 반환 값이 자동으로 JSON 형태로 변환되며 REST API에서 발생하는 예외를 처리할 때 사용한다.
- Application 전역에서 발생한 예외를 처리한다.
- @RestControllerAdvice
- REST API의 예외를 처리한다.
- 반환 값이 JSON이다.
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<Map<String, String>> handleIllegalArgumentException(IllegalArgumentException ex) {
Map<String, String> response = new HashMap<>();
response.put("error", ex.getMessage());
return ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.body(response);
}
}
- @ExceptionHandler 이 선언되지 않은 컨트롤러의 예외처리 가능
일반적으로 문자열이 아닌 공통된 응답 형태를 만들어서 반환한다.
Annotation 정리
Annotation
|
용도
|
반환 형식
|
예시 처리 범위
|
@ExceptionHandler
|
특정 컨트롤러 내에서 발생한 예외 처리
|
뷰 이름, String 등
|
단일 컨트롤러 내
|
@ControllerAdvice
|
애플리케이션 전체에서 발생한 예외 처리
|
뷰 이름, String 등
|
모든 컨트롤러에 전역 적용
|
@RestControllerAdvice
|
REST API에서 발생한 예외를 JSON 형식으로 처리
|
ResponseEntity (JSON)
|
모든 컨트롤러에 전역 적용 (RESTful 서비스)
|
'Back-End (Web) > Spring' 카테고리의 다른 글
fetch join (1) | 2025.01.21 |
---|---|
Formatter (0) | 2025.01.11 |
TypeConverter (0) | 2025.01.10 |
HttpMessageConverter (0) | 2025.01.09 |
ArgumentResolver (0) | 2025.01.08 |