RestControllerAdvice를 통한 예외 관리

2024. 10. 27. 16:46·Spring

전역적인 예외 처리를 위해 기존 프로젝트에 Controller Advice를 도입하였다.

 

기존의 Controller 코드

@GetMapping("/list")
public ResponseEntity<List<UserCardDTO>> list(@AuthenticationPrincipal MemberDetailsImpl memberDetails) { // 사용자카드 리스트 가져오기
    try{
        return new ResponseEntity<>(userCardService.getUserCardByUserId(memberDetails.getMember().getId()), HttpStatus.OK);
    } catch (RuntimeException e){
        return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

 

기존에는 위와 같이 컨트롤러 기능 마다 try catch문으로 예외 처리를 진행하였다.

 

service에 인위적으로 예외를 발생시켜 기존 코드의 에러를 출력해보자

 

에러 발생 시 다음과 같은 결과를 얻게 된다.

 

다음으로는 RestControllerAdvice가 적용하고 컨트롤러를 수정한다.

 

ErrorResponse

// 에러 응답 클래스
import java.util.List;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class ErrorResponse {
    private String code;
    private String message;
    private int status;
    private List<String> errors;
}

 

GlobalExceptionHandler

// ExceptionHandler 클래스
@RestControllerAdvice
@Log4j2
public class GlobalExceptionHandler {
	
    // 명시된 예외 이외의 모든 예외
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception e) {
        log.error(e);
        return createErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR, "SERVER_ERROR", "Internal server error occurred");
    }
    
    // 400 잘못된 요청 데이터
    @ExceptionHandler(HttpMessageNotWritableException.class)
    public ResponseEntity<ErrorResponse> handleHttpMessageNotWritableException(HttpMessageNotWritableException e) {
        log.error(e);
        return createErrorResponse(HttpStatus.BAD_REQUEST, "INVALID_REQUEST_DATA", "잘못된 요청 데이터입니다");
    }

    private ResponseEntity<ErrorResponse> createErrorResponse(HttpStatus status, String code, String message) {
        ErrorResponse response = ErrorResponse.builder()
                .code(code)
                .message(message)
                .status(status.value())
                .build();
        return new ResponseEntity<>(response, status);
    }

}

 

Controller

@GetMapping("/list")
public ResponseEntity<List<UserCardDTO>> list(@AuthenticationPrincipal MemberDetailsImpl memberDetails) { // 사용자카드 리스트 가져오기
    return new ResponseEntity<>(userCardService.getUserCardByUserId(memberDetails.getMember().getId()), HttpStatus.OK);
}

 

예외 발생 결과

1. 코드 중복 감소

2. 비즈니스 로직과 예외 처리의 관심사 분리

3. 일관된 예외 처리

'Spring' 카테고리의 다른 글

의존관계 자동 주입  (1) 2024.12.25
Spring Security - 인증 및 권한 부여  (0) 2024.12.16
'Spring' 카테고리의 다른 글
  • 의존관계 자동 주입
  • Spring Security - 인증 및 권한 부여
mint723dev
mint723dev
mint723dev 님의 블로그 입니다.
mint723dev 님의 블로그mint723dev 님의 블로그 입니다.
  • mint723dev
    mint723dev 님의 블로그
    mint723dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (88)
      • Computer Science (16)
        • Computer Architecture (0)
        • Data Structure (2)
        • Database (4)
        • Network (4)
        • Operating System (6)
        • Software Engineering (0)
      • Java (6)
      • 자료 구조 (0)
      • 코딩테스트 (62)
        • LeetCode (1)
        • 프로그래머스 (29)
        • 백준 (32)
      • Spring (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    JVM
    BFS
    deque
    탐욕법
    오블완
    DP
    티스토리챌린지
    DFS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
mint723dev
RestControllerAdvice를 통한 예외 관리

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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