스프링MVC

HTTP 요청 데이터

salmon16 2023. 8. 2. 00:45

HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 3가지 방법이 있다.

  • GET -퀴리 파라미터
    • /url?name=kim&sex=male 같은 형식으로 URL의 쿼리 파라미터에 데이터를 포함해서 전달한다.
    • 메시지 바디 없이 전송한다.
  • POST -HTML Form
    • 메시지 바디에 쿼리 파라미터 형식으로 전달한다
    • content-type:application/x-www-form-urlencoded
  • HTTP message body에 데이터 담아서 요청
    • HTTP API에서 주로 사용한다. 주로 JSON사용

 

GET 쿼리 파라미터

전달 데이터 username = kim, age = 20을 서버로 전송해 보자

메시지 바디 없이 URL의 쿼리 파라미터를 사용해서 데이터를 전달한다

쿼리 파라미터는 URL에 ?를 시작으로 보낸다 그리고 추가 파라미터는 &로 구분한다.

 

전달 데이터를 localhost:8080 서버로 보내려면

http://localhost:8080/request-param?username=hello&age=20

하면 서버의 request-param페이지에 get방식으로 데이터가 보내진다.

 

이제 서버에서 데이터를 사용해 보자.

먼저 @WebServlet 애노테이션을 클래스 위에 붙여준다.

@WebServlet(name = "RequestParamServlet", urlPatterns = "/request-param")

서버에서 데이터를 조회하는 방법은 여러 가지가 있다.

전체 데이터 조회 방법

request.getParameterNames().asIterator()
                .forEachRemaining(paramName -> System.out.println(paramName + "=" + request.getParameter(paramName)));

 

단일 파라미터를 조회하고 싶을 땐 request.getParameter함수를 사용해서 key값을 넣어서 value를 얻는다.

String username = request.getParameter("username");
String age = request.getParameter("age");

만약 파라미터로 URL?username=kim&username=park처럼 파라미터 이름은 하나인데 값이 중복일 때 모두 조회하는 방법을 알아보자.  처리를 하지 않으면 먼저 들어온 kim이 조회된다.

String[] usernames = request.getParameterValues("username");
for (String name : usernames) {
    System.out.println("username=" + name);
}

getParmeterValues메서드를 사용하면 같은 key값의 value들을 배열로 반환해 모두 조회가능하다.

 

POST HTML Form 방식

html의 form을 사용해서 클라이언트에서 서버로 데이터를 전달했을 때를 알아보자

이때 HTTP의 content-type은 application/x-www-form-urlencoded가 된다.

메시지 바디에 username=kim&age=20 형식으로  데이터가 전송된다.

POST의 Form의 형식으로 전송하면 웹 브라우저는 요청 url, content-type, message body으로 HTTP 메시지를 만든다.

 

메시지 바디의 username=kim&age=20형식은 앞에서 본 Get방식의 쿼리 파라미터 형식과 같다 그래서 쿼리 파라미터 조회 메서드를 Get방식과 동일한 메서드를 사용하면 된다.

API 메시지 바디

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

가장 단순한 text를 주고받아보자

text를 클라이언트에서 서버로 전송하기 위해 postman을 사용해서 보내 주자.

 

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);
}

스트링을 받아오기 위해 getInputStream() 메서드를 사용해서 byte코드를 받아와서 byte코드를 StreamUtils.copyToString메서드를 통해 string으로 변환해 주면 된다.

 

이젠 json을 요청하고 받아보자! 동일하게 postman을 사용한다

 

content-type:application/json

보낼 json {"username": "hello", "age":20}

JSON형식은 보통 파싱 해서 많이 사용하므로 파싱할 수 있는 객체를 만들자


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

}

JSON결과를 파싱해서 자바 객체로 변환해서 사용하려면 JSON변환 라이브러리를 추가해서 사용해야 한다. 보통 Spring MVC를 선택하면 jackson라이브러리 objectMapper를 제공하므로 이것을 사용해 보자

@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());
    }
}

 

getInputStream()메서드를 통해 byte코드를 받은 후 StreamUtils.copyToString()메서드를 통해 string으로 변환 후 이를 objectMapper.readValue(string, 객체클래스) 메서드를 통해 객체로 파싱해 준다.

그럼 자바 객체처럼 사용할 수 있다.

 

출처 : 스프링MVC 1편 - 백엔드 웹 개발 핵심 기술 김영한

'스프링MVC' 카테고리의 다른 글

JSP 사용하기  (0) 2023.08.02
HttpServletResponse 사용  (0) 2023.08.02
서블릿 사용해 보기  (0) 2023.08.01
멀티 쓰레드  (0) 2023.07.31
웹 애플리케이션과 서블릿  (0) 2023.07.31