inblog logo
|
devleekangho
    스프링부트

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

    KangHo Lee's avatar
    KangHo Lee
    Nov 21, 2024
    [스프링 부트] 18. ControllerAdvice로 예외 처리 - 웹 게시판 v3.0
    Contents
    1. 예외 클래스 만들기2. ControllerAdvice 소스 코드3. Service에서 예외 날리기
    💡
    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
    Contents
    1. 예외 클래스 만들기2. ControllerAdvice 소스 코드3. Service에서 예외 날리기

    devleekangho

    RSS·Powered by Inblog