백엔드/Spring

StreamUtils.copyToString() - InputStream을 String으로 쉽게 변환하는 방법

manchesterandthecity 2025. 4. 7. 16:23

📌 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}

⚠️ 주의할 점

  1. InputStream은 한 번만 읽을 수 있음!
    • copyToString()을 사용한 후에는 같은 InputStream을 다시 읽을 수 없습니다.
    • 여러 번 사용하려면 RequestWrapper를 만들어 캐싱하거나 별도 처리를 해야 합니다.
  2. 인코딩 설정은 반드시 명시해야 함
    • 클라이언트가 보낸 데이터가 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