애플리케이션에서 발생하는 예외를 처리하고, 적절한 응답을 반환하기 위해 사용되는 메커니즘입니다. 주로 예외가 발생했을 때 애플리케이션이 비정상적으로 종료되지 않고, 예외 상황을 적절히 처리할 수 있도록 도와줍니다.
중앙집중식 예외 처리
유지보수성 향상
코드의 여러 부분에서 발생하는 예외를 중앙에서 처리함으로써 유지보수가 쉬워집니다.
일관성
모든 예외에 대해 일관된 응답 형식을 제공할 수 있습니다.
응답 코드 관리
적절한 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를 사용하지 말고 전체적으로 예외 처리를 해보라고 하셔서 예외 핸들러를 구현하는 방법을 익혔다. 내일 깃허브에 대해서 자세히 공부좀 해야겠다.