ControllerAdvice는 특정 컨트롤러에 종속되지 않고, 애플리케이션 전체에서 공통된 예외 처리 로직을 적용할 수 있습니다.
1. 예외 클래스 만들기
package com.example.blog._core.error.ex;
public class Exception404 extends RuntimeException {
public Exception404(String msg) {
super(msg);
}
}
- RuntimeException 을 상속하면 됩니다.
2. ControllerAdvice 소스 코드
@ControllerAdvice
public class MyControllerAdvice {
// 이 클래스의 책임 : 에러처리
@ResponseBody // 문자 그대로 반환
@ExceptionHandler(Exception400.class)
public String err400(Exception400 e) {
System.out.println("err400");
String body = """
<script>
alert('${msg}');
history.back();
</script>
""".replace("${msg}", e.getMessage());
return body;
}
@ResponseBody // 문자 그대로 반환
@ExceptionHandler(Exception404.class)
public String err404(Exception404 e) {
System.out.println("err404");
String body = """
<script>
alert('${msg}');
history.back();
</script>
""".replace("${msg}", e.getMessage());
return body;
}
}
- ControllerAdvice
- SRP 원칙에 따라 이 클래스는 예외 처리 책임만을 가집니다.
- @ResponseBody
- 컨트롤러 메서드의 반환 값을 HTTP 응답 본문으로 변환해줍니다.
- @ExceptionHandler
- 특정 예외 유형을 처리할 메서드를 정의할 때 사용됩니다.
자바스크립트 명령어
- alert('${msg}') → 경고 대화 상자를 msg를 포함해서 표시합니다.
- history.back() → 사용자를 브라우저의 히스토리 스택에서 이전 페이지로 되돌립니다.
3. Service에서 예외 날리기
public BoardResponse.DetailDTO 게시글상세보기(int id) {
Board board = boardRepository.findById(id)
.orElseThrow(() -> new Exception404("해당 id의 게시글이 없습니다 : " + id));
return new BoardResponse.DetailDTO(board);
}
- 해당 id의 게시글이 없을 경우 Exception404 예외를 발생시킵니다.
- 발생한 예외는 다른 클래스에서 catch하지 않을 경우 Controller와 DispatcherServlet을 거쳐 ControllerAdvice에서 처리됩니다.
Share article