Backend

[스프링 MVC] HTTP 요청 데이터 - API 메세지 바디 (단순 텍스트, JSON)

햣둘 2025. 3. 2. 23:55

API 메세지 바디 : 단순 텍스트

HTTP message body에 데이터를 직접 담아서 요청

- HTTP API에서 주로 사용, JSON, XML, TEXT

- 데이터 형식은 주로 JSON 사용

- POST, PUT, PATCH

 

먼저 가장 단순한 텍스트 메세지를 HTTP 메세지 바디에 담아서 전송하고, 읽어보자

HTTP 메세지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다.

 

RequestBodyStringServlet

package hello.servlet.basic.request;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

@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();
        String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
        System.out.println("messageBody = " + messageBody);
        response.getWriter().write("ok");
    }
}

 

Postman을 사용해서 테스트 해보자.

참고) inputStream은 byte코드를 반환한다. byte코드를 우리가 읽을 수 있는 문자(String)로 보려면 문자표(Charset)를 지정해주어야 한다. 여기서는 UTF_8 Charste을 지정해주었다.

 

문자전송

POST http://localhost:8080/request-body-string

content-type: text/plain

message body: hello

결과: messageBody=hello

 

API 메세지 바디 : JSON

이번에는 HTTP API에서 주로 사용하는 JSON 형식으로 데이터를 전달해보자.

 

JSON 형식 전송

POST http://localhost:8080/request-body-json

content-type: application/json

message body: {"username": "hello", "age":20}

결과: messageBody = {"username": "hello", "age":20}

 

JSON 형식 파싱 추가

Json 형식으로 파싱할 수 있게 객체를 하나 생성하자. 

 

hello.servlet.basic.HelloData

package hello.servlet.basic;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class HelloData {
    private String username;
    private int age;

}

 

lombok이 제공하는 @Getter, @Setter 덕분에 다음 코드가 자동으로 추가된다.

(눈에 보이지는 않는다.)

package hello.servlet.basic;

public class HelloData {

	private String username;
	private int age;

	//==== lombok 􀢤􀢿 􀯏􀙘 ====//
	public String getUsername() {
		return username;
	}
	
    	public void setUsername(String username) {
		this.username = username;
	}
	
    	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}
```

 

참고) 만약 잘 동작하지 않는다면 프로젝트 생성에 롬복 부분을 다시 확인하자.

package hello.servlet.basic.request;

import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

@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("messageBody = " + messageBody);
        HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);

        System.out.println("helloData.username = " + helloData.getUsername());
        System.out.println("helloData.age = " + helloData.getAge());

        response.getWriter().write("ok");
    }
}

 

Postman으로 실행해보자.

POST http://localhost:8080/request-body-json

content-type: application/json (Body -> raw, 가장 오른쪽에서 JSON 선택)

message boy: {"username": "hello", "age":20}

 

출력결과

messageBody={"username": "hello", "age": 20}

data.username=hello

data.age=20

 

참고) JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson 같은 JSON 변환 라이브러리를 추가해서 사용해야 한다. 스프링 부트로 Spring MVC를 선택하면 기본으로 Jackson 라이브러리 (ObjectMapper)를 함께 제공한다.

 

참고) HTML form 데이터도 메세지 바디를 통해 전송되므로 직접 읽을 수 있다. 하지만 편리한 파라미터 조회 기능(request.getParameter(...))을 이미 제공하기 때문에 파라미터 조회 기능을 사용하면 된다.