Spring Boot에서 에러 처리하기
Overview
Spring Boot는 강력하고 유연한 에러 처리 메커니즘을 제공합니다. 애플리케이션 개발 중에는 다양한 종류의 에러가 발생할 수 있으며, 이를 효율적으로 처리하는 방법을 아는 것이 중요합니다. 이번 설명에서는 Spring Boot에서 에러를 처리하는 방법을 상세히 다루고, 일반적인 에러 처리 전략과 예외 처리 구현 방법에 대해 구체적으로 설명하겠습니다.
Spring Boot 에러 처리의 기본 개념
Spring Boot는 기본적으로 HTTP 상태 코드와 에러 메시지를 반환하는 기본적인 에러 처리 기능을 제공합니다. 하지만 이를 더 세밀하게 제어하려면, 다양한 방법을 활용하여 에러를 처리하고 사용자에게 적절한 정보를 제공해야 합니다.
1. 기본 에러 처리
Spring Boot 애플리케이션에서는 기본적으로 BasicErrorController
를 통해 에러를 처리합니다. 이 컨트롤러는 다음과 같은 기본 기능을 제공합니다:
- HTTP 상태 코드에 따라 적절한 에러 페이지를 렌더링합니다.
- 기본적인 에러 메시지를 포함한 JSON 응답을 제공합니다.
예제
기본적인 에러 처리 설정은 별도로 하지 않아도 Spring Boot가 자동으로 처리합니다. 예를 들어, 존재하지 않는 URL로 요청을 보내면 404 Not Found
에러 페이지를 반환합니다.
@GetMapping("/test")
public String test() {
throw new ResourceNotFoundException("Resource not found");
}
위와 같은 코드에서 ResourceNotFoundException
을 던지면, Spring Boot는 기본적으로 404
에러 페이지를 반환합니다.
2. 사용자 정의 에러 페이지
Spring Boot는 src/main/resources/templates
디렉토리 아래에 error.html
파일을 배치하여 사용자 정의 에러 페이지를 설정할 수 있습니다. 이 파일을 통해 애플리케이션의 에러 페이지를 HTML로 디자인할 수 있습니다.
예제
src/main/resources/templates/error.html
파일을 생성하여 다음과 같은 내용을 추가할 수 있습니다:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Error</title>
</head>
<body>
<h1>An error occurred</h1>
<p th:text="'Error code: ' + ${status}"></p>
<p th:text="'Message: ' + ${error}"></p>
</body>
</html>
이렇게 설정하면, 애플리케이션에서 에러가 발생할 때 사용자 정의 에러 페이지가 표시됩니다.
3. 예외 처리
Spring Boot에서는 @ControllerAdvice
와 @ExceptionHandler
를 사용하여 글로벌 예외 처리를 구현할 수 있습니다. 이를 통해 애플리케이션 전역에서 발생하는 예외를 처리하고, 공통적인 에러 응답을 정의할 수 있습니다.
예제
다음은 @ControllerAdvice
와 @ExceptionHandler
를 사용하여 예외를 처리하는 방법입니다:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex) {
ErrorResponse errorResponse = new ErrorResponse("RESOURCE_NOT_FOUND", ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(Exception ex) {
ErrorResponse errorResponse = new ErrorResponse("INTERNAL_SERVER_ERROR", "An unexpected error occurred");
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
위의 코드에서 ResourceNotFoundException
과 일반 Exception
을 처리하고 있습니다. 각 예외에 대해 적절한 에러 응답을 JSON 형태로 반환합니다.
ErrorResponse
클래스는 다음과 같이 정의될 수 있습니다:
public class ErrorResponse {
private String errorCode;
private String message;
// 생성자, getter, setter 생략
}
4. 사용자 정의 예외 처리
애플리케이션의 요구 사항에 맞춰 사용자 정의 예외를 생성하고 이를 처리하는 방법도 가능합니다. 사용자 정의 예외를 통해 더 구체적인 에러 처리를 할 수 있습니다.
예제
먼저, 사용자 정의 예외 클래스를 작성합니다:
public class CustomException extends RuntimeException {
private String errorCode;
public CustomException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
public String getErrorCode() {
return errorCode;
}
}
그 다음, @ControllerAdvice
에서 이를 처리하는 핸들러를 추가합니다:
@ControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler(CustomException.class)
public ResponseEntity<ErrorResponse> handleCustomException(CustomException ex) {
ErrorResponse errorResponse = new ErrorResponse(ex.getErrorCode(), ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}
}
5. 에러 로깅
에러가 발생했을 때, 이를 로깅하는 것은 매우 중요합니다. Spring Boot에서는 @ControllerAdvice
에서 에러를 처리하면서 로깅할 수 있습니다. SLF4J와 Logback을 사용하여 로깅을 처리할 수 있습니다.
예제
@ControllerAdvice
public class LoggingExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(LoggingExceptionHandler.class);
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(Exception ex) {
logger.error("Exception occurred: ", ex);
ErrorResponse errorResponse = new ErrorResponse("INTERNAL_SERVER_ERROR", "An unexpected error occurred");
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
이렇게 하면, 예외가 발생했을 때 로그 파일에 에러 정보가 기록됩니다.
참고문서
이러한 설명을 통해 Spring Boot 애플리케이션에서 에러를 어떻게 처리할 수 있는지, 그리고 이를 보다 효과적으로 관리하는 방법을 이해할 수 있을 것입니다.
'Study Information Technology' 카테고리의 다른 글
Python의 argparse를 활용한 커맨드라인 인자 파싱 (0) | 2024.08.18 |
---|---|
Spring Boot와 Apache Kafka 통합하기 이벤트 기반 아키텍처 구축 (0) | 2024.08.17 |
Spring Boot와 Apache ActiveMQ 통합하기 (1) | 2024.08.17 |
Spring Boot와 Spring Security로 안전한 애플리케이션 구축하기 (0) | 2024.08.17 |
Python 예외 처리의 마스터링 try except finally와 사용자 정의 예외 (1) | 2024.08.17 |