본문 바로가기
Spring

Spring ControllerAdvice 활용

by 하르싼 2023. 5. 4.
반응형

목적

Spring ControllerAdvice 사용방법

예제소스

https://github.com/devHjlee/devHjBlog/tree/main/springControllerAdivce

ControllerAdvice

  • 스프링프레임워크에서 예외 처리 코드를 중복해서 작성하지 않고, 전체 컨트롤러에 대한 전역적인 예외처리를 정의 할 수 있다.
  • 컨트롤러 메소드에서 예외가 발생하면 ControllerAdvice가 이를 가로채고 정의된 예외 처리 로직을 적용한다.

RestControllerAdvice

  • ControllerAdvice 와 비슷한 기능을 제공하지만 반환되는 값의 형식이 다르다.
  • ControllerAdvice 는 ModelAndView 객체를 반환하여 뷰를 랜더링 할 수 있지만, RestControllerAdvice는 JSON 형식의 응답을 반환 하기 위해 ReponseEntity나 ReponseBody 를 사용한다.

개발환경

  • IDE : IntelliJ
  • Jdk : OpenJdk 11
  • gradle
  • spring boot : 2.7.9

프로젝트 구조

예제 소스

프로젝트를 진행하다보면 ControllerAdvice 보다 RestControllerAdvice 를 주로 사용하여 RestControllerAdvice 로 예시를 작성.

CustomExceptionHandler

@RestControllerAdvice
public class CustomExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex) {
        ErrorResponse errorResponse = new ErrorResponse(ErrorCode.ERROR_001, HttpStatus.INTERNAL_SERVER_ERROR);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse);
    }

    @ExceptionHandler(MyCustomException.class)
    public ResponseEntity<ErrorResponse> handleMyCustomException(MyCustomException ex) {
        ErrorResponse errorResponse = new ErrorResponse(ErrorCode.ERROR_002, HttpStatus.BAD_REQUEST);
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
    }
}

MyCustomException

*Exception 클래스를 상속받아 정의한 사용자 정의 예외 클래스

public class MyCustomException extends Exception {

    public MyCustomException(String message) {
        super(message);
    }
}

ApiResponse, ErrorResponse

  • 요청한 API 대한 성공, 실패에 따라 클라이언트에 응답하기 위한 객체
public class ApiResponse {
    private String status;
    private String message;

    public ApiResponse(String status, String message) {
        this.status = status;
        this.message = message;
    }
}

public class ErrorResponse {
    private final ErrorCode errorCode;
    private final String errorMessage;

    public ErrorResponse(ErrorCode errorCode, HttpStatus status) {
        this.errorCode = errorCode;
        this.errorMessage = status.getReasonPhrase();
    }

    public ErrorCode getErrorCode() {
        return errorCode;
    }

    public String getErrorMessage() {
        return errorMessage;
    }
}

ErrorCode

  • 에러코드 정의
public enum ErrorCode {
    ERROR_001("An unexpected error occurred."),
    ERROR_002("A custom error occurred."),
    // 추가로 필요한 에러코드를 여기에 선언합니다.
    ;

    private final String message;

    ErrorCode(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

테스트 결과

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/hello")
public class HelloController {
    private final HelloService helloService;

    @GetMapping("/v1/board")
    public ResponseEntity<ApiResponse> helloBoard() {
        return new ResponseEntity<>(new ApiResponse("200","Success"), HttpStatus.OK);
    }

    @GetMapping("/v1/calc")
    public ResponseEntity<ApiResponse> helloCalc() {
        helloService.helloCalc();
        return new ResponseEntity<>(new ApiResponse("200","Success"), HttpStatus.OK);
    }

    @GetMapping("/v1/custom")
    public ResponseEntity<ApiResponse> helloCustom() throws MyCustomException{
        throw new MyCustomException("강제 에러발생");
    }
}


@Service
public class HelloService {

    public void helloBoard() {
      String text = "HELLO";
      System.out.println(text);
    }

    public void helloCalc() {
        int a = 0/0;
    }

}
  • Serivce 에서 0/0을 통해 ArithmeticException 강제로 발생시켜서 @ExceptionHandler(Exception.class) 으로 전달

  • MyCustomException 강제로 발생시켜 @ExceptionHandler(MyCustomException.class) 으로 전달

참고자료

  • 위에 소스들을 직접 작성하다가 ChatGPT 가 생각나서 ChatGPT를 통해 작성한 소스들이다. 잘만 활용하면 역시 편하고 좋다.
반응형

'Spring' 카테고리의 다른 글

WebSocket Client 라이브러리  (0) 2023.09.14
Spring Filter 개념 구현방법  (0) 2023.05.22
Spring Event 활용  (0) 2023.03.21
JPA+QueryDsl 게시판 CRUD 구현(2)  (0) 2023.03.09
JPA Batch JDBC Batch  (0) 2023.03.03

댓글