스프링 부트에서의 기본 예외 처리 이해

LeeYulhee·2023년 11월 3일
0

👉 기본 예외 처리 구조


  • 스프링 부트는 내장 서버(예: 톰캣, 제티, 언더토우)와 함께 제공
  • 이 내장 서버는 기본적인 오류 처리를 위한 메커니즘을 내장하고 있음
  • 이것이 바로 애플리케이션이 예외를 만나도 종료되지 않고 계속 작동할 수 있는 이유



👉 스프링의 기본 오류 처리


  • 스프링 부트는 모든 예외를 처리하기 위해 BasicErrorController라는 기본 컨트롤러를 사용
    • BasicErrorController
      • 스프링 부트가 제공하는 기본 에러 컨트롤러로, 일반적인 HTTP 에러 응답을 처리하는 데 사용
  • 이 컨트롤러는 /error 경로에 매핑되어 있고, 다음과 같은 작업을 수행
    • HTTP 요청에서 발생한 오류에 대해 적절한 HTTP 상태 코드를 설정
    • 요청을 /error 경로로 리디렉션하여 오류 응답을 생성
    • 오류에 대한 정보를 담고 있는 ErrorAttributes 객체를 사용하여 오류 상세 정보를 가져옴
    • Accept 헤더나 요청의 종류에 따라 JSON, XML, HTML 등 다양한 포맷으로 오류 정보를 반환
    • 개발자는 BasicErrorController를 상속받아 커스텀 오류 처리 컨트롤러를 만들 수 있으며, 오류 페이지를 자유롭게 수정할 수 있음



👉 톰캣과 같은 서블릿 컨테이너의 기본 오류 페이지


  • 톰캣과 같은 서블릿 컨테이너는 서블릿 스펙에 정의된 대로 기본 오류 페이지를 제공
  • 오류 발생 시 다음과 같은 작업을 수행
    • 서블릿 컨테이너는 오류 코드에 해당하는 내장 오류 페이지를 사용자에게 보여줌
    • 이 페이지는 일반적으로 기술적인 오류 메시지를 포함한 기본적인 HTML 페이지
    • 개발자는 web.xml 파일을 통해 오류 코드나 예외 타입별로 커스텀 오류 페이지를 정의할 수 있음
    • 커스텀 오류 페이지를 사용하지 않으면, 사용자는 서버가 제공하는 기본 오류 페이지를 보게 됨



👉 정리


  • 이 두 메커니즘 덕분에 스프링 부트 애플리케이션은 예외 상황에서도 사용자에게 적절한 피드백을 제공하고, 개발자가 커스텀 오류 처리 로직을 구현하기 용이하도록 지원
  • 예외가 발생해도 애플리케이션이 전체적으로 중단되는 것을 방지
  • 개발자가 원하는 대로 예외를 핸들링하고 로깅할 수 있는 유연성을 제공



👉 궁금해진 부분 : GlobalExceptionHandler 클래스를 사용했을 때, BasicErrorController를 상속받지 않고도 예외 처리가 됐었음


@Controller
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(value = IllegalArgumentException.class)
    public String illegalArgumentException(Exception e, Model model){
        model.addAttribute("errorMessage",e.getMessage());
        log.info("e.getMessage = {} ", e.getMessage());
        return "error/commonError";
    }

    @ExceptionHandler(value = NoSuchElementException.class)
    public String noSuchElementException(Exception e, Model model){
        model.addAttribute("errorMessage",e.getMessage());
        log.info("e.getMessage = {} ", e.getMessage());
        return "error/commonError";
    }

		// 그 외 Exception
}
  • @ControllerAdvice 어노테이션을 사용한 클래스는 BasicErrorController를 상속받지 않아도 예외를 처리할 수 있음
    • @ControllerAdvice
      • 스프링 프레임워크의 AOP(Aspect-Oriented Programming) 기능 중 하나
      • 전역적으로 예외를 관리할 수 있는 메커니즘을 제공
      • 스프링 컨테이너가 관리하는 모든 컨트롤러에 적용되는 공통의 관심사(예외 처리 로직 등)를 정의할 때 사용
      • 이 어노테이션이 붙은 클래스 내부에 정의된 @ExceptionHandler 메소드들은 해당 클래스에서 발생하는 예외를 처리할 때 사용
      • 비즈니스 로직 중 발생하는 예외를 처리하고, 클라이언트에게 보다 구체적인 에러 페이지나 응답을 제공
    • 실행 흐름
      • 해당 클래스에서 정의한 각 메소드는 특정 예외 타입을 처리하고, 예외가 발생했을 때 실행
      • 예외가 발생하면 스프링 프레임워크는 해당 예외 타입에 매칭되는 @ExceptionHandler가 정의된 메소드를 찾아서 실행
      • 이 메소드는 예외 정보를 받아서 적절한 로깅을 하고, 모델 객체에 에러 메시지를 추가한 후 에러 페이지의 이름을 리턴
  • 정리
    • BasicErrorController는 스프링 부트가 제공하는 표준 예외 처리 방식
    • GlobalExceptionHandler를 통해 제공되는 @ControllerAdvice는 표준 이외의 사용자 정의 예외 처리를 가능하게 해줌
profile
끝없이 성장하고자 하는 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보