스프링부트 예외 처리하기: 쉽고 깔끔하게!

스프링 부트에서 예외를 처리하는 방법에 대해 이야기해보려고 해요. 애플리케이션을 개발하다 보면 예외 상황을 만나는 건 피할 수 없죠. 이때 예외를 어떻게 처리하느냐가 정말 중요해요. 잘못된 예외 처리는 사용자 경험을 망칠 수 있고, 시스템의 안정성에도 영향을 줄 수 있답니다. 그래서, 예외를 쉽고 깔끔하게 처리하는 방법을 알려드릴게요!
스프링부트 예외 처리하기: 쉽고 깔끔하게!
Photo by Nubelson Fernandes / Unsplash

On this page

오늘은 스프링 부트에서 예외를 처리하는 방법에 대해 이야기해보려고 해요. 애플리케이션을 개발하다 보면 예외 상황을 만나는 건 피할 수 없죠. 이때 예외를 어떻게 처리하느냐가 정말 중요해요. 잘못된 예외 처리는 사용자 경험을 망칠 수 있고, 시스템의 안정성에도 영향을 줄 수 있답니다. 그래서, 예외를 쉽고 깔끔하게 처리하는 방법을 알려드릴게요!

기본적인 예외 처리

스프링 부트에서는 예외를 처리하는 여러 가지 방법을 제공하고 있어요. 그 중에서도 가장 많이 사용하는 방법은 @ControllerAdvice@ExceptionHandler를 이용하는 거예요. 함께 살펴볼까요?

1. @ControllerAdvice와 @ExceptionHandler 사용하기

@ControllerAdvice는 전역 예외 처리를 가능하게 해주는 아주 멋진 어노테이션이에요. 이와 함께 @ExceptionHandler를 사용하면 특정 예외를 잡아서 처리할 수 있어요.

먼저, 간단한 예외 처리 클래스를 만들어볼게요.

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = { IllegalArgumentException.class, IllegalStateException.class })
    protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest request) {
        String bodyOfResponse = "이 요청은 처리할 수 없습니다.";
        return handleExceptionInternal(ex, bodyOfResponse, new HttpHeaders(), HttpStatus.CONFLICT, request);
    }
}

위 코드에서 GlobalExceptionHandler 클래스는 전역 예외 처리기로 동작해요. handleConflict 메서드는 IllegalArgumentExceptionIllegalStateException 예외를 처리해요. 예외가 발생하면 **이 요청은 처리할 수 없습니다.**라는 메시지와 함께 409 CONFLICT 상태 코드를 반환해요.

2. 사용자 정의 예외 처리

때때로, 내 애플리케이션에 맞는 사용자 정의 예외를 만들어야 할 때가 있어요. 사용자 정의 예외를 처리하는 방법도 간단해요.

먼저, 사용자 정의 예외 클래스를 만들어볼게요.

public class CustomException extends RuntimeException {
    private static final long serialVersionUID = 1L;

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

그리고 나서, 이 예외를 처리하는 핸들러를 추가해요.

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class CustomExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<String> handleCustomException(CustomException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
}

이제 CustomException이 발생하면 400 BAD_REQUEST 상태 코드와 함께 예외 메시지를 반환하게 돼요.

3. RestTemplate 예외 처리

API 통신을 할 때 RestTemplate을 많이 사용하죠. RestTemplate을 사용할 때 발생하는 예외도 처리할 수 있어요. 예를 들어, API 호출 중 HttpClientErrorException이 발생했을 때 처리하는 방법을 알아볼게요.

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.client.HttpClientErrorException;

@ControllerAdvice
public class RestTemplateExceptionHandler {

    @ExceptionHandler(HttpClientErrorException.class)
    protected ResponseEntity<String> handleHttpClientErrorException(HttpClientErrorException ex) {
        String responseBody = ex.getResponseBodyAsString();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(ex.getResponseHeaders().getContentType());
        return new ResponseEntity<>(responseBody, headers, ex.getStatusCode());
    }
}

이 코드는 HttpClientErrorException을 처리하고, API 서버로부터 받은 응답을 클라이언트에게 그대로 전달해요. 이렇게 하면 클라이언트가 API 서버로부터 받은 에러 메시지를 그대로 볼 수 있답니다.

결론

스프링 부트에서 예외를 처리하는 방법은 정말 다양하고, 그만큼 강력해요. @ControllerAdvice@ExceptionHandler를 이용하면 예외를 쉽게 관리할 수 있고, 사용자 정의 예외도 깔끔하게 처리할 수 있어요. API 통신 중 발생하는 예외도 RestTemplateExceptionHandler를 통해 처리할 수 있답니다.

예외 처리를 잘해두면 애플리케이션의 안정성이 높아지고, 사용자에게도 더 나은 경험을 제공할 수 있어요. 여러분도 스프링 부트에서 예외 처리를 깔끔하게 해보세요! 궁금한 점이 있으면 언제든지 댓글로 남겨주세요. 감사합니다!

Subscribe to Keun's Story newsletter and stay updated.

Don't miss anything. Get all the latest posts delivered straight to your inbox. It's free!
Great! Check your inbox and click the link to confirm your subscription.
Error! Please enter a valid email address!