SPRING
[SPRING] HttpServletRequest InputStream의 주의사항
steadyMan
2022. 8. 1. 00:33
Filter에서 요청정보에 대한 로그를 출력하기 위한 작업을 한 후 컨트롤러에서 데이터 매핑이 안 되는 현상이 발생했다.
확인 결과 HttpServletRequest의 InputStream을 읽은 게 화근이었다. 스프링의 컨버터가 요청 Body의 데이터를 읽을 수 없으니 데이터 매핑이 될 수가 없는 것이었다. 사실상 유실이라고 봐야겠다
HttpServletRequest의 InputStream은 한 번 읽으면 다시 읽을수 없다고 한다 - 톰캣의 정책
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
HttpServletRequestWrapper
InputStream을 읽어서 필요한 작업을 수행한 후 HttpServlertRequestWrapper라는 클래스는 HttpServlertRequest를 래핑 할 때 사용되는데 이를 extends 하여 새로운 Wrapper를 만들어서 요청 바디에 대한 InputStream 요청이 오면
새로 만든 클래스를 리턴해주는 방식이다.
하지만 Wrapper클래스를 요청 때마다 생성해줘야 하니 많은 리소스를 소모할 것이고 작업량이 상당하다.
물론 x-www-form-urlencoded 타입의 데이터만 처리해야된다고 하면 직접 Stream을 다룰필요도 없겠지만
그 외의 데이터를 처리해야 할 때에는 해당 방식 혹은 아예 다른 구현 방식을 생각해봐야겠다.
참고&소스코드
https://www.baeldung.com/spring-reading-httpservletrequest-multiple-times