hyeonga_code

Project_02_예외 처리하기 @ControllerAdvice, @RestControllerAdvice, @ExceptionHandler 본문

Project_HYEONGARL

Project_02_예외 처리하기 @ControllerAdvice, @RestControllerAdvice, @ExceptionHandler

hyeonga 2024. 5. 30. 05:59
반응형

 

 

예외를 처리하기 위해 @ContollreAdvice와 @ExceptionHandler를 사용하려고 한다.

관련되어 구글링을 하다 보니 Enum 으로 에러코드를 모아 관리하는 방식을 많이 사용한 것을 볼 수 있었다.

처음에는 Enum 클래스로 CODE/MESSAGE를 작성하고, ErrorResponse를 만들어 ExceptinoHandler에서 처리하도록 작업했다.

문제. 

ErrorResponse가 가지고 있는 메세지와 코드는 메인 로직과는 상관이 없는 내용이다.

 

 

1. ErrorResponse 

클라이언트로 넘겨줄 ErrorResponse 를 작성

package com.hyeongarl.error;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class ErrorResponse {
    private String message;
    private String code;
} //end class

 

예외가 발생했을 때 클라이언트에게 반환할 오류 응답의 구조를 정의한다.

응답의 일관성을 유지할 수 있다.

 

2. BaseException 

package com.hyeongarl.error;

import lombok.Getter;
import org.springframework.http.HttpStatus;

@Getter
public class BaseException extends RuntimeException {

    private final ErrorResponse errorResponse;
    private final HttpStatus httpStatus;

    public BaseException(ErrorResponse errorResponse, HttpStatus httpStatus) {
        super(errorResponse.getMessage());
        this.errorResponse = errorResponse;
        this.httpStatus = httpStatus;
    } //end BaseException()
} //end class

 

RuntimeException을 상속받아 런타임 예외로 사용한다.

 

 

3. GlobalExceptionHandler

package com.hyeongarl.error;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    // @ExceptionHandler : 특정 예외 상황에 대한 처리를 정의할 수 있습니다.
    // 예외를 @ExceptionHandler에서 잡아 적절한 ErrorResponse로 변환하여 
    // 일관성 있는 예외를 처리할 수 있습니다.

    // 던질 때 전달하는 ErrorCode를 바탕으로 ErrorResponse를 만들어 발생하고 
    // 다른 예외 발생 시 500
    @ExceptionHandler(BaseException.class)
    public ResponseEntity<ErrorResponse> handleBaseException(BaseException e) {
        log.error("BaseException", e);
        return new ResponseEntity<>(e.getErrorResponse(), e.getHttpStatus());
    } //end handleBaseException()
} //end class

 

 

4. 사용할 예외 작성

BaseException을 상속받아 필요한 예외를 작성하여 사용할 수 있다.

package com.hyeongarl.error;

import org.springframework.http.HttpStatus;

public class CustomException extends BaseException {
    private static final String DEFAULT_MESSAGE = "에러 메세지";
    private static final String DEFAULT_CODE = "client에 보여질 코드";

    public CustomException() {
        super(new ErrorResponse(DEFAULT_MESSAGE, DEFAULT_CODE), HttpStatus.CODE);
    }

    public CustomException(String message) {
        super(new ErrorResponse(message, DEFAULT_CODE), HttpStatus.CODE);
    }
}

 

 

현재는 하나의 ExceptionHandler에서 처리하지만 추후 다양한 예외를 처리해야하는 경우 분리될 수 있다.

반응형