본문 바로가기
TIL

@RequestBodyAdvice로 Spring API 데이터 전처리와 후처리 완벽히 관리하기

by 긍고 2024. 11. 5.
반응형

개요


최근 프로젝트에서 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에서 데이터 바인딩을 확장하고, 특정 컨트롤러의 요청 본문을 일관되게 관리할 수 있는 좋은 도구인 만큼, 다양한 데이터 전처리 및 후처리 요구사항에 맞춰 활용할 수 있을 것 같다.

 

댓글