본문 바로가기
SpringBoot

Spring Boot에서 RestControllerAdvice 사용 방법

by ByteBridge 2024. 11. 17.
반응형

Spring Boot에서 RestControllerAdvice 사용 방법과 예시 코드

Spring Boot로 REST API를 개발하다 보면 예외 처리가 중요한 역할을 합니다. 예외 처리를 효과적으로 구현하면 클라이언트에게 일관된 에러 메시지를 전달하고, 서버 측에서도 코드의 가독성을 높일 수 있습니다. 이번 글에서는 RestControllerAdvice를 활용하여 예외 처리를 중앙집중식으로 구현하는 방법을 다루고, 실전 예시로 결제 요청을 받아 특정 필드 값을 변경하는 핸들링을 추가해보겠습니다.

RestControllerAdvice란?

RestControllerAdvice는 Spring에서 제공하는 어노테이션으로, 모든 컨트롤러에 대한 예외 처리를 중앙에서 처리할 수 있도록 도와줍니다. 이를 통해 코드 중복을 줄이고, 에러 핸들링을 하나의 클래스에서 통합적으로 관리할 수 있습니다.

간단히 말해, @RestControllerAdvice는 REST API의 오류 처리를 간결하고 일관되게 만들어 주는 도구입니다.

RestControllerAdvice 설정하기

RestControllerAdvice를 사용하면 발생하는 예외를 별도의 클래스에서 처리할 수 있습니다. 예를 들어, 다음과 같은 방식으로 글로벌 예외 처리 핸들러를 정의할 수 있습니다:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> handleValidationExceptions(MethodArgumentNotValidException ex) {
        String errorMessage = ex.getBindingResult().getAllErrors().stream()
                .map(DefaultMessageSourceResolvable::getDefaultMessage)
                .collect(Collectors.joining(", "));
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorMessage);
    }
}

위 예시에서는 MethodArgumentNotValidException이 발생했을 때 해당 오류를 처리하고, HTTP 400 상태 코드와 함께 오류 메시지를 클라이언트로 반환합니다.

결제 요청 예시 코드

이번에는 결제 요청이 들어올 때 해당 요청의 특정 필드 값을 변경하는 핸들러를 만들어 보겠습니다. 이 예시에서는 @RestControllerAdvice를 사용해 결제 요청의 바디에서 특정 필드를 수정하도록 만들어 봅니다.

결제 요청 DTO

먼저 결제 요청에 사용될 DTO(Data Transfer Object)를 정의합니다:

public class PaymentRequest {
    private String userId;
    private double amount;
    private String currency;

    // Getter와 Setter
    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public double getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }

    public String getCurrency() {
        return currency;
    }

    public void setCurrency(String currency) {
        this.currency = currency;
    }
}

결제 요청 처리 컨트롤러

이제 결제 요청을 처리하는 컨트롤러를 작성합니다:

@RestController
@RequestMapping("/api/payments")
public class PaymentController {

    @PostMapping
    public ResponseEntity<String> processPayment(@RequestBody PaymentRequest paymentRequest) {
        // 결제 처리 로직 (예: 결제 게이트웨이에 요청 보내기 등)
        return ResponseEntity.ok("결제 요청 처리 완료");
    }
}

RestControllerAdvice로 특정 필드 변경하기

여기서 결제 요청이 들어올 때 userId 필드를 처리 전에 수정하는 로직을 RestControllerAdvice로 추가할 수 있습니다. 다음은 해당 로직을 구현한 예시입니다:

@RestControllerAdvice(assignableTypes = PaymentController.class)
public class PaymentRequestModifier {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.addCustomFormatter(new PaymentRequestFormatter());
    }
}

public class PaymentRequestFormatter implements Formatter<PaymentRequest> {
    @Override
    public PaymentRequest parse(String text, Locale locale) throws ParseException {
        // Custom parsing logic here
        return null;
    }

    @Override
    public String print(PaymentRequest object, Locale locale) {
        return null;
    }
반응형