본문 바로가기
Spring/Spring MVC

[Spring MVC] 9. HTTP 요청 데이터 - GET 쿼리 파라미터

by Kloong 2022. 11. 23.
더보기

Spring Boot & Thymeleaf 시리즈는 김영한 님의 "스프링 MVC 2편 - 백엔드 웹 개발 활용 기술" 강의를 정리한 글입니다. 글에 첨부된 사진은 해당 강의의 강의 자료에서 캡쳐한 것입니다. 제 Github에만 올려뒀다가, 정보 공유와 강의 홍보(?)를 위해 블로그에도 업로드합니다.

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com

 

마크다운 형식으로 작성한 글을 블로그에 다시 올리는 거라 가독성이 많이 떨어집니다. 조금더 편하게 보시려면 아래의 Github repository에서 보시면 됩니다.

 

GitHub - Kloong1/TIL: Today I Learned.

Today I Learned. Contribute to Kloong1/TIL development by creating an account on GitHub.

github.com

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

다음 데이터를 클라이언트에서 서버로 전송해보자.

  • username=hello
  • age=20

이 데이터를 메시지 바디 없이, URL의 쿼리 파라미터를 사용해서 데이터를 전달하자. 쿼리 파라미터 방식은 검색, 필터, 페이징등에서 많이 사용한다.

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

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

HttpServletRequest로 쿼리 파라미터 조회

package com.kloong.servlet.basic.request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

/**
 * 1. 쿼리 파라미터 조회 기능
 * http://localhost:8080/request-param?username=hello&age=20 요청에 대한 파라미터 조회
 * 2. 동일한 이름의 쿼리 파라미터 조회
 * username 파라미터가 여러개 들어온 요청에 대해서 파라미터 조회
 * http://localhost:8080/request-param?username=hello&username=kim&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()
                .forEachRemaining(paramName -> System.out.println(paramName + " = " + request.getParameter(paramName)));

        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 uname : usernames)
            System.out.println("username = " + uname);

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

        response.getWriter().write("OK");
    }
}
  • request.getParameterNames() : 모든 쿼리 파라미터의 이름 조회
  • request.getParameter() : 특정 쿼리 파라미터의 값 조회
  • request.getParameterValues() : 이름이 같은 파라미터가 여러개 존재하는 경우, 해당 파라미터의 모든 값 조회

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

<URL>?username=hello&username=kim 과 같이 동일한 이름을 가진 파라미터가 여러개 존재할 수도 있다. 이런 경우에는 request.getParameter() 를 사용해선 안된다. request.getParameter() 는 하나의 파라미터 이름에 대해서 하나의 값만 있을 때 사용해야 한다.
위의 상황처럼 동일한 이름의 파라미터가 여러개 존재할 때는 request.getParameterValues() 를 사용해서 해당 파라미터의 값을 전부 조회할 수 있다.

참고: 이렇게 동일한 이름을 가진 파라미터가 여러개 존재할 때 request.getParameter() 를 사용하면 request.getParameterValues() 의 첫 번째 값을 반환한다.

댓글