1) HTTP 요청 데이터 - 개요
HTTP의 요청 메세지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법을 알아봅시다.
주로 다음 3가지 방법을 사용하게 됩니다
1) GET - 쿼리 파라미터
- /url?username=hello&age=20
- 메세지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
- 예) 검색, 필터, 페이징 등에서 많이 사용하는 방식에 해당함.
2) POST - HTML Form
- Content-Type: application/x-www-form-urlencoded
- 메세지 바디에 쿼리 파라미터 형식으로 전달 username=hello&age=20
- 예) 회원가입, 상품주문, HTML Form 사용
3) HTTP Message Body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용, JSON, XML, TEXT (API, JSON - 서버간 통신에도 주로 사용됨)
- 데이터 형식은 주로 JSON을 사용한다
4) POST PUT PATCH
HTTP 요청 데이터 - GET 쿼리 파라미터
다음 데이터를 클라이언트에서 서버로 전송해보자.
전달 데이터는 다음과 같다 1) username = hello 2) age = 20
메세지 바디 없이, URL의 쿼리 파라미터만을 이용하여 데이터를 전달한다
예) 검색, 필터, 페이징 등에서 많이 사용하는 방식에 해당한다.
쿼리 파라미터는 URL에 다음과 같이 ?를 시작으로 보낼 수 있고 쿼리 파라미터간 delimeter는 &로 구분한다.
서버에서는 HttpServletRequest가 제공하는 다음 메서드를 통해 파라미터를 편리하게 조회할 수 있다.
package hello.servlet.basic.request;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@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");
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
String paramName = parameterNames.nextElement();
System.out.println("paramName = " + request.getParameter(paramName));
}
request.getParameterNames().asIterator()
.forEachRemaining(paramName -> System.out.println("request.getParameter(paramName) = " + request.getParameter(paramName)));
System.out.println("[전체 파라미터 조회] - end");
System.out.println();
System.out.println("[단일 파라미터 조회]");
String username = request.getParameter("username");
System.out.println("request.getParameter(username) = " + username);
String age = request.getParameter("age");
System.out.println("request.getParameter(age) = " + age);
System.out.println();
System.out.println("[이름이 같은 복수 파라미터 조회]");
System.out.println("request.getParameterValues(username)");
String[] usernames = request.getParameterValues("username");
for (String s : usernames) {
System.out.println("s = " + s);
}
response.getWriter().write("ok");
}
}
이름이 같은 복수 파라미터의 경우 내부 우선순위에 의해 결정된다.
복수파라미터에서 단일 파라미터 조회하는 방법
request.getParamter()의 경우 파라미터 이름에 대해서 단 하나의 값만 있을때 사용해야한다.
지금처럼 중복이 있을때는 request.getParameterValues()를 사용한다.
참고로 중복일 때 request.getParameter()를 사용하면 request.getParameterValues()의 첫번째 값을 반환한다.
-> 모호한 건 하지 말자, 안쓰는게 좋고 실무에서 중복 파라미터를 받아오는 경우는 거의 없다고 봐도 된다.
누누하게 말하지만 계속 강조하시는 부분은 애매하거나 명확하지 않으면 사용하지 말자는 것이였다
HTTP 요청 데이터 - POST HTML FORM
이번에는 HTML의 Form을 사용해서 클라이언트에서 서버로 데이터를 전송하는 과정을 담아보겠다.
주로 회원가입, 상품주문등에서 사용하는 방식이다.
POST의 HTML Form을 전송하면 웹 브라우저는 다음 형식으로 HTTP 메세지를 생성한다.
요청 URL을 다음과 같이 설정한다 : http://localhost:8080/request-param
content-type : application/x-www-form-urlencoded
message-body: username=hello&age=20
HTTP 요청 데이터 - API 메세지 바디 - 단순 텍스트
HTTP message body에 데이터를 직접 담아서 요청
HTTP API에서 주로 사용 JSON, XML, TEXT
데이터 형식은 주로 JSON 사용(레거시 코드의 경우 XML 사용할 수 있음)
POST PUT PATCH가 주로 사용됨
먼저, 가장 단순한 텍스트 메세지를 HTTP 메세지 바디에 담아서 전송하고 읽어보자.
HTTP 메세지 바디의 데이터를 InputStream을 사용해서 직접 읽을 수 있다.
package hello.servlet.basic.request;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;
@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");
}
}
inputStream은 byte 코드를 반환하기 때문에 byte코드를 우리가 읽을 수 있는 문자로 변환하기 위해서는 문자표(Charset)의 지정이 필요하다.
HTTP 요청 데이터 - API 메세지 바디 JSON
JSON 형식 전송
POST http://localhost:8080/request-body-json
Content-Type: application/json
message-body : {"username":"hello", "age": 20}
JSON 형식으로 파싱 추가
package hello.servlet.basic.request;
import com.fasterxml.jackson.databind.ObjectMapper;
import hello.servlet.basic.HelloData;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.StreamUtils;
@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.getUsername() = " + helloData.getUsername());
System.out.println("helloData.getAge() = " + helloData.getAge());
response.getWriter().write("ok");
}
}
JSON 결과를 파싱해서 객체로 생성하기 위해서는 Jackson 라이브러리의 도움을 필요로 한다.
스프링 MVC를 선택하면 기본으로 Jackson 라이브러리의 매퍼인 ObjectMapper를 기본으로 제공한다
HTML Form 데이터도 메세지 바디를 통해 전송되기 때문에 직접 읽을 수 있는데,
편리한 파라미터 기능(request.getParameter())을 이미 제공하기 때문에 이것을 이용하면 된다.
'스프링 공부 (인프런 김영한 선생님) > 스프링 MVC 1편' 카테고리의 다른 글
[스프링 웹 MVC 1편] 7. 서블릿 구현 (0) | 2023.05.21 |
---|---|
[스프링 웹 MVC 1편] 6. HTTPServletResponse - 기본 사용법 (0) | 2023.05.20 |
[스프링 웹 MVC 1편] 5. HttpServletRequest - 개요/기본사용법 (0) | 2023.05.19 |
[스프링 웹 MVC 1편] 4. Hello 서블릿 (0) | 2023.05.17 |
[스프링 웹 MVC 1편] 3. 동시요청 - 멀티스레드 (0) | 2023.05.17 |