HttpServletRequest와 HTTP 요청 데이터

스프링 MVC 1편 강의 정리

HTTP 요청 데이터

  • GET - 쿼리 파라미터
    • /url?username=tom&age=20
    • URL의 쿼리 파라미터에 데이터를 포함해서 전달
    • 검색, 필터, 페이징 등에서 많이 사용하는 방식
  • POST - HTML form
    • username=tom&age=20
    • content-type: application/x-www-form-urnencoded
    • 메세지 바디에 쿼리 파라미터 형식으로 전달
    • 회원가입, 상품 주문 등에서 사용
  • HTTP message body
    • HTTP API에서 주로 사용
    • JSON, XML, TEXT
    • POST, PUT, PATCH 메서드 사용

GET query parameter

  • 메세지 바디 없이 URL의 쿼리 파라미터 사용해서 데이터 전달
  • 쿼리 파라미터는 ?로 시작하며 추가 파라미터는 &로 구분
  • 서버에서는 HttpServletRequest가 제공하는 메서드로 조회 가능
    • getParameter: 단일 파라미터 조회
    • getParameterNames: 파라미터 이름 모두 조회
    • getParameterMap: 파라미터 map으로 조회
    • getParameterValues: 복수 파라미터 조회
  • getParameter는 하나의 파라미터가 값이 하나일 때만 사용하며, 값이 여러개일 경우 첫번째 값 반환
String username = request.getParameter("username");
Enumeratation<String> parameterNames = request.getParameterNames();
Map<String, String[]> parameterMap = request.getParameterMap();
String[] usernames = request.getParameterValues("username")

POST html form

  • content-type: application/x-www-form-urlencoded
    • content-type은 HTTP 메세지 바디의 데이터 형식 지정
    • GET 메서드의 쿼리 파라미터 형식과 동일
    • 쿼리 파라미터 조회 메서드 사용 가능
  • 메세지 바디에 쿼리 파라미터 형식으로 데이터 전달

API message body

  • HTTP 메세지 바디에 데이터 직접 담아서 요청
  • JSON, XML, TEXT 형식
  • POST, PUT, PATCH 메서드에서 사용
@WebServlet(name = "requestBodyStringServlet", urlPatterns = "/request-body-string")
public class RequestBodyStringServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // byte code로 받음
        ServletInputStream inputStream = req.getInputStream();
        String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

        System.out.println("body = " + body);
    }
}

JSON 형식

  • POST http://sample.com/test
  • content-type: application/json
  • message body: `{“username”: “tom”, “age”: 42}
  • Spring MVC에서는 아래의 과정을 추상화해서 편리하게 사용할 수 있도록 제공함
@Data
public class HelloData {
	private String username;
	private int age;
}

@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 body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

		System.out.println("body = " + body);
    // body = {"username": "tom", "age": 42}

		HelloData helloData = objectMapper.readValue(body, HelloData.class);
		System.out.println("helloData = " + helloData);
    // helloData = HelloData(username=tom, age=42)

		response.getWriter().write("200 OK");
	}
}