[TIL] 35. 익셉션 핸들러(예외 처리기)란?

김지수·2024년 6월 11일

TIL

목록 보기
35/53

익셉션 핸들러

애플리케이션에서 발생하는 예외를 처리하고, 적절한 응답을 반환하기 위해 사용되는 메커니즘입니다. 주로 예외가 발생했을 때 애플리케이션이 비정상적으로 종료되지 않고, 예외 상황을 적절히 처리할 수 있도록 도와줍니다.

익셉션 핸들러를 사용하는 이유

중앙집중식 예외 처리

유지보수성 향상

코드의 여러 부분에서 발생하는 예외를 중앙에서 처리함으로써 유지보수가 쉬워집니다.

일관성

모든 예외에 대해 일관된 응답 형식을 제공할 수 있습니다.

응답 코드 관리

적절한 HTTP 상태 코드

특정 예외 상황에 대해 적절한 HTTP 상태 코드를 반환할 수 있습니다. 예를 들어, 인증 오류에 대해 401 Unauthorized, 잘못된 입력에 대해 400 Bad Request 등을 반환할 수 있습니다.

사용자 친화적인 에러 메시지:

명확한 에러 메시지

사용자가 이해할 수 있는 명확한 에러 메시지를 제공할 수 있습니다.

보안

내부 예외 메시지를 숨기고 사용자에게 보안상 안전한 메시지를 제공할 수 있습니다.

로깅 및 모니터링

문제 진단

예외 발생 시 로깅을 통해 문제를 진단하고 추적할 수 있습니다.

시스템 모니터링

예외 발생 빈도나 종류를 모니터링하여 시스템의 건강 상태를 파악할 수 있습니다.

ExceptionController: 예외를 처리하는 컨트롤러를 정의합니다.

package com.sparta.lck_news.exception;

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

@Slf4j
@RestControllerAdvice
public class ExceptionController {

  @ExceptionHandler(IllegalArgumentException.class)
  public ResponseEntity<ErrorResponse> handleIllegalArgumentException(IllegalArgumentException e) {
    log.error("잘못된 입력: {}", e.getMessage());
    return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ErrorResponse(e.getMessage()));
  }

  @ExceptionHandler(CommonException.class)
  public ResponseEntity<ErrorResponse> handleCommonException(CommonException e) {
    log.error("예외 발생: {}", e.getMessage());
    return ResponseEntity.status(e.getStatus()).body(new ErrorResponse(e.getMessage()));
  }

  @ExceptionHandler(Exception.class)
  public ResponseEntity<ErrorResponse> handleException(Exception e) {
    log.error("예외 발생: {}", e.getMessage());
    return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new ErrorResponse("서버 오류"));
  }
}

ErrorResponse: 에러 응답을 위한 클래스를 정의합니다.

public class ErrorResponse {
  private String message;

  public ErrorResponse(String message) {
    this.message = message;
  }

  // getter, setter
}

CommonException: 커스텀 예외 클래스를 정의합니다.

public class CommonException extends RuntimeException {
  private final int status;

  public CommonException(String message, int status) {
    super(message);
    this.status = status;
  }

  public int getStatus() {
    return status;
  }
}

오늘의 회고

과제 마감일이라 바쁜 하루였다. 튜터님께서 컨트롤러에서 try-catch를 사용하지 말고 전체적으로 예외 처리를 해보라고 하셔서 예외 핸들러를 구현하는 방법을 익혔다. 내일 깃허브에 대해서 자세히 공부좀 해야겠다.

profile
서툴고 부족한 점이 많지만, 배우고 발전하며 성장하기 위해 노력하겠습니다.

0개의 댓글