개요
최근 프로젝트에서 JSON 형식의 데이터를 처리하는 API를 개발하게 되었는데, 데이터가 요청 본문(@RequestBody)으로 전달되는 상황을 자주 접하게 되었다. 대부분의 경우 Spring MVC의 기본적인 데이터 바인딩으로 충분했지만, 특정 요청 본문에 대해 데이터를 전처리하거나 예외 상황을 세밀하게 제어해야 하는 요구사항이 생겼다. 이때 유용하게 활용할 수 있는 기능이 바로 @RequestBodyAdvice였다.
@RequestBodyAdvice란?
@RequestBodyAdvice는 Spring에서 제공하는 인터페이스로, @RequestBody에 의해 바인딩되는 요청 데이터를 전처리하거나 후처리할 수 있는 기능을 제공한다. 특정 컨트롤러에 들어오는 요청 데이터를 한 곳에서 전처리 및 후처리할 수 있어 코드의 재사용성과 유지보수성을 높여준다. @RequestBodyAdvice는 여러 곳에서 중복되는 처리 로직을 한 곳에 모아두고, 데이터 검증이나 필터링, 변환과 같은 로직을 컨트롤러 외부에서 수행하고 싶을 때 유용하게 사용할 수 있다.
@RequestBodyAdvice의 주요 메서드
@RequestBodyAdvice를 구현할 때 주로 사용하는 메서드는 다음과 같다:
- supports(): 특정 컨트롤러나 데이터 타입에만 이 Advice가 적용되도록 설정할 수 있다. 예를 들어, 특정 API 버전에만 적용하려면 해당 API 버전을 포함하는 컨트롤러 클래스나 요청 본문 타입을 조건으로 설정할 수 있다.
- beforeBodyRead(): 본문 데이터가 읽히기 전에 호출된다. 여기서 데이터의 유효성을 검증하거나 필요한 변환 작업을 수행할 수 있다.
- afterBodyRead(): 본문 데이터가 바인딩된 후에 호출된다. 주로 요청 데이터의 일부를 수정하거나 추가적인 변환 작업을 수행하는 데 유용하다.
- handleEmptyBody(): 요청 본문이 비어 있을 때 처리 로직을 정의할 수 있다. 이를 통해 빈 요청을 허용할지 여부를 설정할 수 있다.
간단한 예제: JSON 필드 전처리
@RequestBodyAdvice의 실제 사용 예로, 특정 필드 값이 반드시 소문자로 들어와야 하는 요구사항이 있다고 가정해보자. 이럴 때 beforeBodyRead() 메서드에서 해당 필드를 전처리하여 소문자로 변환할 수 있다.
@RestControllerAdvice
public class CustomRequestBodyAdvice implements RequestBodyAdvice {
@Override
public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
return true; // 모든 요청에 대해 Advice 적용
}
@Override
public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
// JSON 필드 전처리 로직 구현
return inputMessage;
}
@Override
public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
// 필요한 후처리 로직 구현
return body;
}
@Override
public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
return body == null ? new CustomDefaultObject() : body;
}
}
@RequestBodyAdvice를 활용할 때 주의할 점
- 필요할 때만 적용하기: 모든 요청 본문에 일괄적으로 전처리/후처리를 적용하면 성능에 영향을 줄 수 있다. 꼭 필요한 API나 데이터 타입에만 적용하여 불필요한 처리 시간을 줄이는 것이 중요하다.
- 데이터 변조 주의: 전처리나 후처리 과정에서 의도치 않게 데이터를 변조하면 예상하지 못한 버그가 발생할 수 있다. 항상 테스트를 충분히 진행하고, 변경사항을 문서화하는 습관이 필요하다.
- 유효성 검증과의 조화: @Valid와 같은 어노테이션을 활용한 검증과 @RequestBodyAdvice의 전처리 로직이 충돌하지 않도록 주의해야 한다. 필요한 경우 순서를 명확히 지정하고, 검증 단계에서 추가적인 로직을 구현하는 것이 좋다.
정리
이번 TIL을 통해 @RequestBodyAdvice의 유용성과 활용 방안을 간단히 알아보았다. Spring MVC에서 데이터 바인딩을 확장하고, 특정 컨트롤러의 요청 본문을 일관되게 관리할 수 있는 좋은 도구인 만큼, 다양한 데이터 전처리 및 후처리 요구사항에 맞춰 활용할 수 있을 것 같다.
'TIL' 카테고리의 다른 글
Optional.ifPresentOrElse로 자바의 조건 분기 깔끔하게 처리하기 (0) | 2024.11.19 |
---|---|
오라클 SQL 성능 개선하기: 스칼라 서브쿼리 vs 인라인 뷰 (0) | 2024.11.11 |
스프링부트 @ConfigurationProperties 매핑 오류(null) (2) | 2024.10.15 |
Spring Boot에서 Multipart 파일 업로드 시 파일 크기 제한 오류(MaxUploadSizeExceededException ) (0) | 2024.09.30 |
[Redis] SET 값 조회 및 삭제하기 (0) | 2024.09.27 |
댓글