[Spring] Spring MVC(4): @ControllerAdvice로 애플리케이션 전체에서 예외를 처리해보자!

2023. 4. 20. 08:10· Spring
반응형

💋 인트로

 

 

이전 포스팅에서 Spring의 @Controller에서 예외 처리를 하는 방법에 대해서 공부했다. 

 

지정한 예외를 잡아서 처리할 수 있는 기능을 얻었지만, 우리가 만드는 애플리케이션은 여러 개의 컨트롤러를 가질 때가 많다. 컨트롤러가 여러 개인 경우, 어떻게 될까?

 

@ExceptionHandler는 코드가 작성된 @Controller 내에서만 작동한다. 다른 컨트롤러에서 동일한 예외가 발생했더라도 잡을 수가 없다. IllegalArgumentException에 대해 동일한 처리를 해주고 싶더라도, 그 예외가 다른 컨트롤러에서 발생한다면 같은 작업을 중복해서 넣어 주어야 하기 때문에 상당히 번거롭다. 

 

이것을 해결하기 위해 등장한 것이 @ControllerAdvice이다!

 


 

 

💋 @ControllerAdvice가 등장한 이유

 

@ControllerAdvice는 애플리케이션에서 전역적으로 예외를 처리하기 위해 만들어졌다. 

 

이 어노테이션을 사용하여 예외 처리 과정을 중앙 집중화할 수 있어서, 모든 컨트롤러에서 발생하는 예외를 한 곳에서 처리할 수 있다.

 

 

💋 @ControllerAdvice 사용 방법

 

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(NullPointerException.class)
    public ResponseEntity<String> handleNullPointerException(NullPointerException e) {
        return new ResponseEntity<>("NullPointerException occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

 

@ControllerAdvice는 많은 컨트롤러에서 공통으로 발생할 수 있는 예외 상황에 대해 반복적인 예외 처리 코드 작성을 방지한다. @ControllerAdvice 어노테이션은 모든 컨트롤러에서 예외가 발생한다면 핸들링을 담당할 핸들링 전용 Controller에 선언하는 어노테이션이며, 전역적으로 ExceptionHandler를 적용해준다. 

 

참고: 스프링 3.2 버전 이상부터 추가된 기능이므로, 만약 해당 어노테이션이 import 되지 않는다면 버전을 확인해야 한다.

 

@ControllerAdvice는 @Controller 어노테이션이 있는 모든 클래스에서 발생하는 예외를 잡을 수 있다.

하지만 특정 컨트롤러나 패키지에서만 예외를 잡도록 하고싶다면??? 

 

💋 특정 클래스에서 발생하는 예외만 받아서 처리하게 하는 @ControllerAdvice

 

basePackageClasses나 basePackages 속성을 이용하여 특정 클래스에서 발생하는 예외만을 받아서 처리할 수 있다. 

 

예를 들어, com.example.controller 패키지 내의 MyController 클래스에서 발생하는 예외만을 처리하도록 하려면, 다음과 같이 @ControllerAdvice 어노테이션을 사용할 수 있다. 

 

@ControllerAdvice(basePackageClasses = MyController.class) // 속성 추가
public class MyControllerAdvice {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
    }
}

 

이렇게 하면, MyController 클래스에서 발생하는 예외와 그 하위 클래스들만을 처리하는 MyControllerAdvice 클래스가 정의된다. 

 

 

이 방법도 만능은 아니다. 

패키지는 구조가 달라지는 경우가 있는데, 패키지 구조가 달라지는 경우 예외 처리가 제대로 안될 수 있다.

또한, 패키지 구조가 복잡해지면 basePackages 속성으로 여러 패키지를 지정해 줘야 하는 번거로움도 있다. 

 

 

 

 

참고로, @ControllerAdvice가 할 수 있는 일은 아래와 같다.

 

  • @ExceptionHandler 어노테이션을 사용하여 예외 처리 메소드를 정의할 수 있다. 
  • @InitBinder 어노테이션을 사용하여 모든 컨트롤러에서 사용할 수 있는 바인딩 설정 메소드를 정의할 수 있다.
  • @ModelAttribute 어노테이션을 사용하여 모든 컨트롤러에서 사용할 수 있는 모델 어트리뷰트 메소드를 정의할 수 있다.
반응형
저작자표시 비영리 변경금지

'Spring' 카테고리의 다른 글

[Spring] Spring JDBC(2): JdbcTemplate으로 Query와 Update을 해보자! (queryForObject, query, update, PreparedStatementCreator, KeyHolder)  (0) 2023.04.20
[Spring] Spring JDBC(1): Spring JDBC가 뭘까? 좋은점? DB에 접근하는 여러 가지 방법  (2) 2023.04.20
[Spring] @Repository를 final class로 만들면 안되는 이유: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dbGameDao'  (1) 2023.04.19
[Spring] Spring의 의존성 주입이 기존 자바 코드의 의존성 주입에 비해서 '더' 좋은 점은 무엇일까?  (0) 2023.04.19
[Spring] Spring MVC(3): 요청에 대한 예외 처리를 하자! @ExceptionHandler  (1) 2023.04.18
'Spring' 카테고리의 다른 글
  • [Spring] Spring JDBC(2): JdbcTemplate으로 Query와 Update을 해보자! (queryForObject, query, update, PreparedStatementCreator, KeyHolder)
  • [Spring] Spring JDBC(1): Spring JDBC가 뭘까? 좋은점? DB에 접근하는 여러 가지 방법
  • [Spring] @Repository를 final class로 만들면 안되는 이유: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dbGameDao'
  • [Spring] Spring의 의존성 주입이 기존 자바 코드의 의존성 주입에 비해서 '더' 좋은 점은 무엇일까?
깃짱
깃짱
연새데학교 컴퓨터과학과 & 우아한테크코스 5기 백엔드 스타라이토 깃짱
반응형
깃짱
깃짱코딩
깃짱
전체
오늘
어제
  • 분류 전체보기
    • About. 깃짱
    • Weekly Momentum
      • 2024
    • PROJECT
      • AIGOYA LABS
      • Stamp Crush
      • Sunny Braille
    • 우아한테크코스5기
    • 회고+후기
    • Computer Science
      • Operating System
      • Computer Architecture
      • Network
      • Data Structure
      • Database
      • Algorithm
      • Automata
      • Data Privacy
      • Graphics
      • ETC
    • WEB
      • HTTP
      • Application
    • C, C++
    • JAVA
    • Spring
      • JPA
      • MVC
    • AI
    • MySQL
    • PostgreSQL
    • DevOps
      • AWS
      • 대규모 시스템 설계
    • frontend
      • HTML+CSS
    • NextJS
    • TEST
    • Industrial Engineering
    • Soft Skill
    • TIL
      • 2023
      • 2024
    • Linux
    • Git
    • IntelliJ
    • ETC
      • 日本語

블로그 메뉴

  • 홈
  • 깃허브

인기 글

최근 글

태그

  • 조합
  • Java
  • 우아한테크코스5기
  • 상속
  • 람다
  • 함수형프로그래밍
  • 우테코
  • 우테코5기
  • 우아한테크코스
  • OOP
  • 레벨로그
  • TDD
  • lamda
  • 스트림
  • 예외
  • 컴포지션
  • Stream
  • 람다와스트림
  • Composition
  • 상속과조합
hELLO · Designed By 정상우.v4.2.0
깃짱
[Spring] Spring MVC(4): @ControllerAdvice로 애플리케이션 전체에서 예외를 처리해보자!
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.