지난 포스팅에서 웹서비스에서 요청(Request)이 처리되는 원리에 대해서 다루어 보았다. 이번 포스팅에서는 요청은 어떤 형태로 들어오는지를 알아보겠다. 웹서비스에 요청은 여러 형태로 들어오지만 4가지를 기본으로 알고 있으면 된다.
1) GET 방식
2) POST 방식
3) JSON 방식
4) Message Body방식
HTTP는 대략 Header 영역과 Body영역으로 나뉜다. 4가지 방식 중 GET 방식만이 데이터를 Header 영역에 담아 전달한다. POST, Message Body, JSON 방식은 모두 Body 영역에 데이터를 담아 전달한다. Body 영역에 데이터를 담아 전달하는 방식은 Header 영역에 정의된 Content-Type에 따라 종류가 구분된다.
GET 방식, POST 방식
- GET 방식
GET방식은 URL에 key와 value 형식으로 구성된 쿼리스트링을 달아 데이터를 전달하는 방식이다. Header 영역에 데이터가 담겨 전달되고 Body 영역은 비어있다.
- POST방식
POST방식은 Body 영역에 데이터를 담아 전달하는 방식으로, Header 영역의 Content-Type은 application/x-www-form-urlencoded 로 설정되어 있다.
application/x-www-form-urlencoded 타입은 데이터가 key와 value로 구성되어 있고 '&'로 구분된다. 그리고 데이터가 전달 될 때 데이터가 인코딩되어 전달된다. GET방식과 POST 방식은 데이터를 담는 영역은 다르지만 전달하는 데이터 형식은 동일하다고 볼 수 있다. 그래서 JAVA 환경의 서버는 GET방식과 POST방식 구분없이 동일한 방법으로 요청 데이터를 가져온다.
Servlet 코드
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServletTest extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username"); // KEY-VALUE 구조 ( GET, POST 동일 )
String age = request.getParameter("age"); // KEY-VALUE 구조 ( GET, POST 동일 )
System.out.println("username = " + username);
System.out.println("age = " + age);
response.getWriter().write("ok");
}
}
위 서블릿을 보면, Request의 getParameter 메소드에 key값을 주어 value를 얻는 것을 확인할 수 있다. GET방식과 POST 방식이 모두 key-value 데이터를 전달하므로 위 방법으로 간단히 요청 데이터를 가져올 수 있다.
JSON 방식
GET방식, POST 방식은 웹브라우저와 서버간의 통신에서 주로 사용되는 방식이다. HTTP API 같이, 프로그램과 프로그램 간의 통신에서 HTTP 프로토콜로 데이터를 서로 주고 받을 때, 주로 JSON 방식을 사용한다.
JSON방식도 HTTP Body 영역에 데이터를 담아 전달하는 방식이다. Content-Type은 application/json이다.
포스트맨을 이용하여 JSON 방식 요청을 해보았다. HTTP 요청에 Content-Type이 application/json이고 HTTP Body에 JSON 데이터가 담겨있다. 그렇다면 JAVA 환경의 서버는 어떻게 JSON 형식으로 들어온 데이터를 사용할 수 있을까?
JSON 데이터는 GET 방식이나 POST 방식 같은 key-value 구조가 아니다. JSON 문법의 key-value 구조로 이루어져있다. GET방식이나 POST방식은 Request객체가 getParameter 메소드를 지원하지만, JSON은 지원하지 않는다. 그래서 우선은 Body 영역에 있는 데이터를 이진데이터(BinaryData)로 읽어와야 한다. 읽어온 이진데이터를 인코딩 후 문자열로 변환한다. 문자열로 변환하는 이유는 JSON데이터를 JSON 데이터 객체와 매핑하는 ObjectMapper에게 전달하기 위해서이다. JSON 문자열 데이터를 토대로 ObjectMapper가 JSON 데이터 객체를 생성하면 JSON 형식으로 요청이 들어온 데이터를 JAVA 환경의 서버에서 사용 가능해진다.
그럼 이를 코드로 확인해보자.
Servlet 코드
@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(); // HTTP Body 영역의 데이터를 BinaryData로 읽어오기
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); // BinaryData를 UTF-8로 인코딩 후 문자열로 변환하기
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class); //문자열로 표현된 JSON데이터를 HelloData 클래스와 매핑하기
// 요청데이터 출력
System.out.println("helloData.getUsername() = " + helloData.getUsername());
System.out.println("helloData.getAge() = " + helloData.getAge());
response.getWriter().write("ok");
}
}
request의 InputStream으로 HTTP Body 영역의 데이터를 이진데이터로 읽어온다. 그리고 StreamUtils의 copyToString 메소드로 이진데이터를 UTF-8로 인코딩하고 문자열로 변환한다. ObjectMapper는 JSON 문자열 데이터를 매핑하여 JSON 데이터를 가진 JSON 객체를 생성한다. 이런 방식으로 JSON 방식의 요청 데이터를 JAVA 환경에서도 사용 가능해진다.
Message Body 방식
Message Body은 HTTP Body 영역의 데이터가 일정한 구조가 없는 text 형식으로 전달되는 방식이다. Content-Type은 text/plain이다. 일정한 구조가 없는 데이터이므로 Server는 우선 HTTP Body 영역에 있는 데이터를 이진데이터(BinaryData)로 가져와야 한다. 그리 이를 문자열로 변환해서 사용하면 된다.
@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(); // HTTP Body 영역에 있는 데이터를 이진데이터로 가져오기
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); // UTF-8로 인코딩하여 문자열로 변환하기
response.getWriter().write(messageBody);
}
}
이번 포스팅에서는 웹서비스에 요청(Request)이 들어오는 4가지 방식을 정리해보았다. 다음 포스팅에서는 응답(Response)에 대해서 다루어보겠다.
'SPRING > Spring MVC' 카테고리의 다른 글
[SpringMVC] MVC 패턴 구현하기(3) - Model (0) | 2023.08.09 |
---|---|
[SpringMVC] MVC 패턴 구현하기(2) - Controller (0) | 2023.08.08 |
[SpringMVC] MVC 패턴 구현하기(1) - View (0) | 2023.08.08 |
[SpringMVC] 응답(Response)의 종류 ( Text, Html, Json ) (0) | 2023.08.08 |
[SpringMVC] 웹서비스에서 요청(Request)이 처리되는 원리 ( + Servlet ) (0) | 2023.08.01 |