본문 바로가기

Spring/SpringMVC

SpringMVC- HTTP 요청 데이터

HTTP 요청 메시지를 통해서 클라이언트에서 서버로 데이터 전송하는 법

  1. GET: 쿼리 파라미터
  2. POST: HTML FORM
  3. HTTP message body

1) GET- 쿼리 파라미터

url의 파라미터에 값을 직접 넣어서 이를 전송하는 방식이다.

파라미터 username,age의 값을 넣어 전송

이는 따로 메시지 바디가 존재하지 않고 URL의 쿼리 파라미터에 직접 데이터를 넣어서 전송하는 방식이다. 주로 검색, 필터, 페이징등에서 자주 사용한다.

 참고로 content-type은 HTTP 메시지 바디의 데이터 형식을 지정한다. 이때 GET URL 쿼리 파라미터 형식은 별도의 HTTP 메시지 바디가 존재하지 않으므로 content-type이 없다.

2) POST- HTML Form

 메시지 바디에 데이터를 넣어서 이를 전송하는 방식이다. 주로 회원 가입과 상품 주문등에서 사용한다.

다음과 같이 예제 HTML을 작성한다.

 

hello-form.html

<!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>

<!--localhost:8080/basic/hello-form.html에서 데이터를 post 방식으로 localhost:8080/request-param에 전달-->
<!-- POST HTML Form 형태로 전달함 -->
<!--주로 회원 가입, 상품 주문 등에서 사용하는 방식이다.-->

 html form의 경우 메시지 바디에 쿼리 파리미터 형식으로 데이터를 전달한다. 지금 body를 보면 username과 age를 받아서 POST 방식으로 /request-param에 전달하고 있다.

 

RequestParamServlet.java

package hello.servlet.basic.request;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.Enumeration;

/**
 * 1.파라미터 전송 기능
 * http://localhost:8080/request-param?username=hello&age=20
 */
@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()  // 요청 파라미터들 가져오기 eg)username, age
                .forEachRemaining(paramName -> System.out.println(paramName + ":" + request.getParameter(paramName)));

        System.out.println("[전체 파라미터 조회] - end");
        System.out.println();


        System.out.println("[단일 파라미터 조회] - start");

        System.out.println("username:" + request.getParameter("username"));
        System.out.println("age:" + request.getParameter("age"));
        System.out.println("height:"+request.getParameter("height"));

        System.out.println("[단일 파라미터 조회] - end");
        System.out.println();


        System.out.println("[이름이 같은 복수 파라미터 조회] - start");
        //localhost:8080/request-param?username=hello&username=hello2

        String[] usernames = request.getParameterValues("username");  //parameter 명이 username인 모든 값들을 가져옴
        for (String username : usernames) {
            System.out.println("username:"+username);
        }

        System.out.println("[이름이 같은 복수 파라미터 조회] - end");
        System.out.println();


        response.getWriter().write("ok");


    }

    /**
     * request.getParameter(): 중복일 때 request.getParameterValues()의 첫번째 값을 반환한다.
     */
}

위의 코드는 /request-param (URI가 "/request-param"에 해당)인 주소에 대한 servlet 코드이다. 해당 html로 username=kim, age=20을 전송했다고 하면 servlet에 의한 출력결과는 다음과 같다.

 

실행결과

[전체 파라미터 조회] - start
username:kim
age:20
[전체 파라미터 조회] - end

[단일 파라미터 조회] - start
username:kim
age:20
height:null
[단일 파라미터 조회] - end

[이름이 같은 복수 파라미터 조회] - start
username:kim
[이름이 같은 복수 파라미터 조회] - end

html form으로 전달한 파라미터가 /request-param으로 전달되어 service 메서드가 잘 실행되었음을 확인 가능하다.

 

꼭 위와 같이 별도의 html 없이 간단히 테스트 하고 싶다면 Postman 프로그램으로 테스트도 가능하다.

1.HTTP 메서드 = POST,  2.content-type = application/x-www-form-urlencoded

 

바디의 파라미터에 데이터를 넣는다면 웹 브라우저는 오른쪽과 같은 요청 HTTP 메시지를 생성해서 이를 POST로 전달한다. 여기서 주목할 점은 데이터의 전송이 "username=kim&age=20"이라는 것이다. 즉 데이터 전송방식이 GET 방식에서 사용하는 쿼리파라미터와 동일하다. 때문에 RequestParamServlet.java에서 처럼 request 객체로 얼마든지 해당 데이터를 꺼내어 사용할 수 있다.

POST HTML Form 형식의 content-type은 "application/x-www-form-urlencoded"이다

정리) request.getParameter() 

application/x-www-form-urlencoded 형식은 앞서 GET에서 살펴본 쿼리 파라미터 형식과 같다. 따라서 쿼리 파라미터 조회 메서드를 그대로 사용하면 된다.

클라이언트(웹 브라우저) 입장에서는 두 방식에 차이가 있지만, 서버 입장에서는 둘의 형식이 동일하므로, `request.getParameter()` 로 편리하게 구분없이 조회할 수 있다.

정리하면 'request.getParameter()' GET URL 쿼리 파라미터 형식도 지원하고, POST HTML Form 형식도 둘 다 지원한다.