[스프링 부트] 18. ControllerAdvice로 예외 처리 - 웹 게시판 v3.0

KangHo Lee's avatar
Nov 21, 2024
[스프링 부트] 18. ControllerAdvice로 예외 처리 - 웹 게시판 v3.0
💡
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

devleekangho