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;
}
'SpringBoot' 카테고리의 다른 글
MongoDB 파일 저장소로 사용하기 (1) | 2024.11.18 |
---|---|
확장 가능한 서비스 구현 패턴 (0) | 2024.11.17 |
Spring Batch를 이용한 클러스터링과 분산 처리 설정 및 구현 방법 (0) | 2023.12.26 |
Quartz를 이용한 클러스터링 설정과 구현 방법 (0) | 2023.12.26 |
Blocking IO 와 Non-Blocking IO (0) | 2023.10.29 |