오봉이와 함께하는 개발 블로그

스프링 MVC 1 - HTTP 요청 데이터 개요, GET 쿼리 파라미터 본문

BE/Servlet

스프링 MVC 1 - HTTP 요청 데이터 개요, GET 쿼리 파라미터

오봉봉이 2022. 8. 10. 17:54
728x90

HTTP 요청 데이터 - 개요

HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법을 알아보자.
주로 3가지 방법을 사용한다.

  • GET - 쿼리 파라미터
    • /url__?username=hello&age=20__
    • 메시지 바디 없이 URL의 쿼리 파라미터에 데이터릂 포함해서 전달한다.
    • 검색, 필터, 페이징 등에서 많이 사용한다.
  • POST - HTML Form
    • HTTP 메시지 헤더 content-type에 명시된다.
      • content-type: application/x-www-form-urlencoded
    • 메시지 바디에 쿼리 파라미터 형식으로 전달
      • username=hello&age=20
    • 회원 가입, 상품 주문, HTML Form등에서 사용
  • HTTP message body에 데이터를 직접 담아서 요청
    • HTTP API에서 주로 사용한다.
      • JSON, XML,TEXT 등의 형식이 들어간다.
    • 데이터 형식은 주로 JSON을 사용한다.
      • POST, PUT, PATCH 등의 메서드를 사용할 수 있다.

HTTP 요청 데이터 - GET 쿼리 파라미터

검색, 필터, 페이징 등에서 많이 사용하는 방식이다.
예를 들어 다음 데이터를 클라이언트에서 서버로 전송하자.
단, 메시지 바디 없이 URL 쿼리 파라미터를 사용해서 데이터를 전달하자.

  • username=hello
  • age=20

쿼리 파라미터는 URL에 ?``를 시작으로 보낼 수 있다. 추가 파라미터는&```로 구분한다.
http://localhost:8080/request-param?username=hello&age=20

서버에서는 HttpServletRequest가 제공하는 다음 메서드를 통해 쿼리 파라미터를 편리하게 조회할 수 있다.

String username = request.getParameter("username"); //단일 파라미터 조회
Enumeration<String> parameterNames = request.getParameterNames(); //파라미터 이름들 모두 조회
Map<String, String[]> parameterMap = request.getParameterMap(); //파라미터를 Map 으로 조회
String[] usernames = request.getParameterValues("username"); //복수 파라미터 조회
코드
@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        System.out.println("전체 파라미터 조회 - Start");
        request.getParameterNames().asIterator()
                        .forEachRemaining(paramName -> System.out.println(paramName + " = " + request.getParameter(paramName)));
        // request.getParameter(paramName) paramName은 이름을 꺼낸다 (username, age)
        // request.getParameter("파라미터 이름")을 작성하면 값을 꺼낼 수 있다.
        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 = hello
age = 20
전체 파라미터 조회 - End

단일 파라미터 조회 - start
username = hello
age = 20
단일 파라미터 조회 - end

이름이 같은 복수 파라미터 조회 - start
usernames = hello
usernames = hello2
이름이 같은 복수 파라미터 조회 - end

복수 파라미터에서 단일 파라미터 조회

username=hello&username=kim과 같이 파라미터 이름은 동일한데 값이 중복되면 어떻게 될까?
request.getParameter()를 사용하면 파라미터 이름에 값이 하나만 있을 때 사용해야 한다.
지금처럼 중복일 때는 request.getParameterValues()를 사용해야 한다.
값이 중복일 때 request.getParameter()를 사용하면 request.getParameterValues()의 첫 번째 값을 반환한다.

중복으로 보내는 경우는 거의 없다.
하지만 중복을 보낼 때는 확실하게 인지하고 사용하도록 하자.

출처 : 인프런 김영한 지식 공유자님 강의 - 스프링 MVC 1편 백엔드 웹 개발 핵심 기술
728x90
Comments