📌 StreamUtils.copyToString() — InputStream을 String으로 쉽게 변환하는 방법
Spring 기반 웹 애플리케이션을 개발하다 보면, 클라이언트로부터 전달받은 HTTP 요청의 InputStream을 문자열로 읽어야 할 때가 있습니다. 이때 유용하게 사용할 수 있는 도구가 바로 StreamUtils.copyToString()입니다.
🔍 StreamUtils.copyToString()이란?
StreamUtils.copyToString()은 Spring Framework에서 제공하는 유틸리티 메서드로, InputStream으로부터 전달받은 바이트 데이터를 문자열(String)로 간편하게 변환해주는 기능을 합니다.
public static String copyToString(InputStream in, Charset charset) throws IOException
- in: 읽을 대상 InputStream (예: 요청 본문)
- charset: 변환 시 사용할 문자 인코딩 (예: StandardCharsets.UTF_8)
✅ 어떤 상황에서 쓰일까?
- 클라이언트가 POST나 PUT 방식으로 JSON, XML, 혹은 일반 텍스트 데이터를 보낼 때
- 필터나 인터셉터에서 요청 본문을 직접 읽어야 하는 경우
- 서블릿에서 InputStream을 문자열로 바꾸고 싶을 때
💡 사용 예제
@PostMapping("/example")
public void example(HttpServletRequest request) throws IOException {
String body = StreamUtils.copyToString(request.getInputStream(), StandardCharsets.UTF_8);
System.out.println("요청 본문: " + body);
}
위 코드는 다음과 같은 요청에서:
POST /example
Content-Type: application/json
{"name":"철준", "age":35}
다음과 같은 출력 결과를 만듭니다:
요청 본문: {"name":"철준", "age":35}
⚠️ 주의할 점
- InputStream은 한 번만 읽을 수 있음!
- copyToString()을 사용한 후에는 같은 InputStream을 다시 읽을 수 없습니다.
- 여러 번 사용하려면 RequestWrapper를 만들어 캐싱하거나 별도 처리를 해야 합니다.
- 인코딩 설정은 반드시 명시해야 함
- 클라이언트가 보낸 데이터가 UTF-8이 아닐 경우 StandardCharsets.UTF_8로 읽으면 깨질 수 있습니다.
- Content-Type의 charset 정보를 확인하거나, UTF-8로 통일되게 처리하는 것이 좋습니다.
📦 어디에 정의되어 있나?
StreamUtils는 Spring Core 모듈에 포함되어 있으며, 다음 패키지에 위치해 있습니다:
org.springframework.util.StreamUtils
의존성은 따로 추가할 필요 없이, 스프링 부트 프로젝트에서는 기본적으로 포함되어 있습니다.
✨ 요약
항목 | 설명 |
목적 | InputStream → String 변환 |
위치 | org.springframework.util.StreamUtils |
주요 사용 예 | 요청 본문 읽기, JSON 처리, 필터/인터셉터 처리 등 |
주요 주의 사항 | InputStream은 한 번만 읽을 수 있음, 인코딩 주의 |
✅ 마무리
StreamUtils.copyToString()은 간단하지만 스프링 개발에서 꽤 자주 쓰이는 핵심 유틸 메서드입니다.
특히 요청 본문을 직접 다루거나, 인터셉터에서 로그를 찍을 때 매우 유용하게 사용할 수 있으니 기억해두면 실무에서 큰 도움이 될 것 입니다.
참조:
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/StreamUtils.html
'백엔드 > Spring' 카테고리의 다른 글
@PostConstruct란? (0) | 2025.04.30 |
---|---|
@RequestBody, @ResponseBody vs HttpEntity(RequestEntity, ResponseEntity) (0) | 2025.04.11 |
Spring MVC에서 HTTP 응답을 반환하는 두 가지 방식 (0) | 2025.04.03 |