HTTP 요청 데이터를 메시지 바디에서 직접 읽기
메시지 바디를 통한 데이터 전송과 처리✨
HTTP 메시지 바디에서 직접 읽기
이번 포스팅에서는 HTTP 요청 데이터를 웹브라우저에서 사용하는 일반적인 방식(GET Query String, Form Data) 외에, HTTP 메시지 바디에 데이터를 담아 전송하는 방법을 살펴보겠습니다.
REST API나 HTTP API를 구현할 때 자주 쓰이는 방식이며, 최근에는 JSON 형식으로 데이터를 주고받는 경우가 많습니다.
저는 이 포스팅에서 문자 기반 데이터 전송부터 JSON 형식 전송까지 단계별로 자세히 설명하겠습니다.
문자 기반 메시지 바디 처리
우선 가장 단순한 예시로, 텍스트를 메시지 바디에 실어 서버로 전송해 보겠습니다.
HTTP 메시지는 크게 스타트 라인
, 헤더
, 그리고 메시지 바디
로 구성됩니다. 메시지 바디는 request.getInputStream()
을 통해 읽을 수 있습니다.
예시 코드를 간단히 살펴보면 다음과 같습니다:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@WebServlet(name = "requestBodyStringServlet", urlPatterns = "/request-body-string")
public class RequestBodyStringServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 메시지 바디를 바이트 코드로 읽음
ServletInputStream inputStream = request.getInputStream();
// 스프링이 제공하는 StreamUtils로 바이트 코드를 문자열로 변환
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("메시지 바디: " + messageBody);
response.getWriter().write("ok");
}
}
Postman과 같은 툴을 사용해 POST
요청을 전송하면 다음과 같은 형태의 텍스트 데이터를 확인할 수 있습니다:
- Content-Type:
text/plain
- 메시지 바디:
"hello"
서버에서는 messageBody
변수를 통해 해당 텍스트를 확인할 수 있습니다.
이렇게 문자 기반 전송은 테스트나 간단한 확인 용도로 자주 활용됩니다.
JSON 기반 메시지 바디 처리
텍스트 전송보다 JSON 형식으로 데이터를 주고받는 경우가 훨씬 일반적입니다.
특히, HTTP API를 구현할 때 JSON 형식이 사실상 표준으로 자리 잡았습니다.
이번에는 JSON 문자열을 자바 객체로 변환하여 활용하는 과정을 살펴보겠습니다.
1. 객체 생성
JSON 데이터를 매핑할 자바 클래스를 하나 만듭니다.
예를 들어 HelloData
라는 클래스를 아래와 같이 작성하겠습니다.
1
2
3
4
5
6
@Getter
@Setter
public class HelloData {
private String username;
private int age;
}
(@Getter
, @Setter
는 Lombok 라이브러리를 통해 자동 생성합니다.)
2. JSON 데이터 읽기
이제 Servlet에서 메시지 바디에 담긴 JSON을 자바 객체로 변환해 봅시다.
스프링 부트 환경에서 기본 제공되는 Jackson 라이브러리를 활용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@WebServlet(name = "requestBodyJsonServlet", urlPatterns = "/request-body-json")
public class RequestBodyJsonServlet extends HttpServlet {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
System.out.println("JSON 메시지 바디: " + messageBody);
// JSON -> 자바 객체 변환
HelloData data = objectMapper.readValue(messageBody, HelloData.class);
System.out.println("username = " + data.getUsername());
System.out.println("age = " + data.getAge());
response.getWriter().write("ok");
}
}
이제 Postman 등으로 JSON 형식의 요청을 전송해보세요.
- Content-Type:
application/json
- 메시지 바디 예시:
1 2 3 4
{ "username": "hello", "age": 20 }
서버 콘솔에는 JSON을 파싱한 결과로 username
과 age
가 정상적으로 출력됩니다.
JSON 이외에
XML
을 사용하는 시스템도 있지만, 최근에는 거의JSON
이 기본으로 사용되고 있습니다.
HTML Form 데이터도 결국 메시지 바디
HTML Form을 통해 전송되는 데이터 역시 메시지 바디에 담깁니다.
다만, 이 경우 application/x-www-form-urlencoded
헤더를 사용하고, key=value
형태로 데이터를 전송하게 됩니다.
예를 들자면 username=kim&age=20
형태의 데이터가 담기게 됩니다.
하지만 JSON 형태가 아니므로, ObjectMapper
로 파싱하려 시도하면 오류가 발생합니다.
HTML Form 전송은
request.getParameter()
메서드를 활용해 쉽게 처리할 수 있으므로, 일반적인 상황에서는 직접 바이트 스트림을 다루지 않아도 됩니다.
정리
이 포스팅에서는 HTTP 메시지 바디를 직접 읽어 문자 기반 데이터와 JSON 형식을 처리하는 방법을 살펴봤습니다.
이해해야 할 핵심 포인트는 다음과 같습니다:
request.getInputStream()
을 통해 메시지 바디를 바이트 스트림으로 읽어들인다.- JSON은 문자열이므로 우선 문자열로 변환한 뒤, ObjectMapper 등을 활용해 자바 객체로 변환한다.
- HTML Form 데이터 역시 메시지 바디에 들어오지만,
request.getParameter()
같은 기존 메서드로 접근 가능하다.
다음 포스팅에서는 HTTP 응답을 구성하고 전송하는 방법에 대해 알아보겠습니다. 감사합니다.