서블릿의 요청 처리 - HttpRequestServlet
HTTP 요청 메세지를 통해 클라이언트에서 서버로 데이터를 전송하는 방법에는 다음과 같은 세 가지 방법이 있다. 그리고 서블릿 객체에 매개변수로 전달되는 HttpRequestServlet 객체를 통해 요청 메세지를 다룰 수 있다.
- GET - 쿼리 파라미터
- /url?username=kyj&age=28
- 메세지 바디 없이 URL의 쿼리 파라미터에 데이터를 포함하여 전달
- 검색, 필터, 페이징 등에서 주로 사용
- POST - HTML Form
- content-type: application/x-www-form-urlencoded
- 메세지 바디에 쿼리 파라미터 형식으로 전달
- 회원 가입, 상품 주문 등에서 HTML Form을 통해 주로 사용
- HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용
- 데이터 형식은 주로 JSON
- HTTP 메서드와 함께 사용할 수 있다.
GET - 쿼리 파라미터
/**
* 1. 파라미터 전송
* http://localhost:8080/request-param?username=kyj&age=28
* <p>
* 2. 이름이 같은 복수 파라미터 전송
* http://localhost:8080/request-param?username=kyj&username=ahl&age=28
*/
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("[전체 파라미터 조회] - Start");
request.getParameterNames().asIterator()
.forEachRemaining(paramName -> System.out.println(paramName + "= " + request.getParameter(paramName)));
System.out.println("[전체 파라미터 조회] - End");
System.out.println();
System.out.println("[단일 파라미터 조회] - Start");
String username = request.getParameter("username");
String age = request.getParameter("age");
System.out.println("username = " + username);
System.out.println("age = " + age);
System.out.println("[단일 파라미터 조회] - End");
System.out.println();
System.out.println("[이름이 같은 복수 파라미터 조회] - Start");
String[] usernames = request.getParameterValues("username");
for (String name : usernames) {
System.out.println("username = " + name);
}
System.out.println("[이름이 같은 복수 파라미터 조회] - End");
}
}
[전체 파라미터 조회] - Start
username= kyj
age= 28
[전체 파라미터 조회] - End
[단일 파라미터 조회] - Start
username = kyj
age = 28
[단일 파라미터 조회] - End
[이름이 같은 복수 파라미터 조회] - Start
username = kyj
username = ahl
[이름이 같은 복수 파라미터 조회] - End
- request.getParameterNames()를 통해 전달된 모든 쿼리 파라미터의 이름을 가져올 수 있다.
- request.getParameter()를 통해 쿼리 파라미터의 값을 가져올 수 있다.
- 만약 동일한 쿼리 파라미터가 2개 이상 전달되었다면 request.getParameterValues()로 값을 가져와야 한다.
POST - HTML Form
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/request-param" method="post">
username: <input type="text" name="username" />
age : <input type="text" name="age" />
<button type="submit">전송</button>
</form>
</body>
</html>

- 위 HTML Form을 전송하면 메세지 바디에 쿼리 파라미터 형식으로 데이터가 전달된다.
- GET과 POST의 차이점은 데이터의 위치(메세지 바디 or 메세지 헤더)일 뿐 메세지 형식은 같으므로 서버 입장에선 동일하다.
- 따라서 GET 전송 방식에서 사용한 HttpRequestServlet의 메서드를 그대로 사용할 수 있다.
API 메세지 바디 - JSON
메세지 바디에는 일반 텍스트, XML, JSON 등을 전송할 수 있다. 그러나 주로 사용하는 것은 JSON이기 때문에 이 예제에서는 JSON을 사용한다.
// JSON 형식의 텍스트를 객체로 변환하기 위한 클래스
@Getter @Setter
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 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("json-ok");
}
}
- request.getInputStream()을 통해 메세지 바디에 있는 정보를 바이트 코드로 가져올 수 있다.
- 위에서 가져온 바이트 코드를 StreamUtils.copyToString()을 통해 문자열로 변환한다.
- StreamUtils는 스프링에서 제공하는 유틸 클래스다.
- Jackson 라이브러리가 제공하는 objectMapper.readValue()를 통해 메세지 바디에 있는 JSON 데이터를 HelloData 객체에 바인딩한다.
- objectMapper는 JSON을 객체로 변환하는 것뿐만 아니라 객체를 JSON으로 변환하는 역할도 수행한다.
Postman을 활용해 JSON 데이터를 서버로 전송하면 다음과 같은 결과를 확인할 수 있다.

messageBody = {"username" : "kyj", "age" : 28}
helloData.username = kyj
helloData.age = 28
'Java' 카테고리의 다른 글
| [Java] 서블릿의 응답 처리 - HttpResponseServlet (0) | 2023.08.15 |
|---|---|
| [Java] 서블릿(Servlet)의 개념과 동작 과정 (0) | 2023.08.13 |
| [Java] 상속과 참조변수 형변환을 활용한 다형성 구현 (0) | 2023.04.29 |
| [Java] 오버로딩 vs 오버라이딩 (0) | 2023.04.21 |
| [Java] 메서드의 기본형 매개변수와 참조형 매개변수 (0) | 2023.04.13 |