230817_ GlobalExceptionHandler

hoy_·2023년 8월 17일
0

Today, I Learned

목록 보기
34/36

1. 오늘의 일정

  1. 최종 프로젝트 기능 작업

  2. cs 공부




2. 배운 내용

  1. cs 공부 - cpu와 메모리 바로가기

  2. 기술면접 바로가기 // 작성 예정




3. 발생한 오류


이번에 새로운 프로젝트를 하게 되면서 지금까지 GlobalExceptionHandler에 대한 방법과 개념을 착각한 채 사용하고 있었다는 것을 깨달았다.

1. GlobalExceptionHandler가 주가 되어 독자적인 역할을 하는 줄 알았다. :개념
2. Controller 안에서 처리해야 GlobalExceptionHandler에 잡히는 줄 알았다. :방법

이 두 가지 사고의 오류가 있었는데,



기존 코드에서는 이처럼 GlobalExceptionHandler가 이미 존재하는데도 불구하고 try-catch로 감싸 IllegalArgumentException을 처리해주고 있었다.
GlobalExceptionHandlerController에서 발생한 예외를 처리해준다는 것을 잘못 이해해 Controller에서 무조건 처리해주어야 하는 줄 알았던 것.

저런 try-catch를 메서드마다 달아줬으니 코드의 중복이 엄청나게 늘어난 셈이다.
비효율적이라고 생각했던 게 사실은 내가 잘못 사용하고 있던 거였다니...

새 프로젝트에서 똑같이 GlobalExceptionHandler를 적용하고 Controller를 수정했다.


그렇다면 제대로 된 GlobalExceptionHandler의 개념은 무엇일까?

전역에서 예외를 처리하기 위해 사용하는 것은 @ControllerAdvice 혹은 @RestControllerAdvice 이다.
이 애너테이션은 AOP(Aspect Oriented Programming) 방식이고, Application 전역에 발생하는 모든 컨트롤러의 예외를 한 곳에서 관리할 수 있게 해준다.

// ex)
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(LineException.class)
    public ResponseEntity<ErrorResponse> handleLineException(final LineException error) {
        // ...
    }
  
    // ...
}

컨트롤러에서 발생하는 모든 예외는 @RestControllerAdvice가 잡고, @ExceptionHandler가 개별적으로 예외를 잡아 처리한다.




4. 앞으로의 나는

  1. 백오피스 게시글 기능 구현
  2. 기술면접 공부
profile
배우는 사람

0개의 댓글