ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC - 쿼리 파라미터(Parameter) 전달(요청 파라미터 주입받기)
    Spring/Spring MVC 2021. 12. 25. 22:37
    728x90
    반응형

     

     

     

    요청 파라미터(Parameter) 추출

     클라이언트에서 서버로 요청 데이터를 전달할 때는 주로 다음 3가지 방법을 사용한다.

     

    1. GET - 쿼리 파라미터
      - URL의 쿼리 파라미터에 데이터를 전달
      - 검색, 필터, 페이징 등에서 사용
      - EX) /users?username=hello&age=20

    2. POST -HTML Form
      - HTTP content-type: application/x-www-form-urlencoded
      - message body에 쿼리 파라미터 형식으로 전달
      - 회원 가입, 상품 주문 등에서 사용
      - EX) payload: username=hello&age=20

    3. HTTP API
      - message body에 데이터를 직접 담아서 전달
      - JSON, XML, TEXT, 주로 JSON을 사용
      - POST, PUT, PATCH

     

     

    GET - 쿼리 파라미터, POST - HTML Form

     쿼리 파라미터와 HTML Form 데이터 전송 방식은 둘 다 형식이 같으므로 같은 방법으로 데이터를 조회할 수 있다.

     

    1. HttpServletRequest을 이용한 요청 파라미터 조회
    2. @RequestParam을 이용한 요청 파라미터 조회
    3. Map, MultiValueMap을 이용한 요청 파라미터 조회
    4. @ModelAttribute을 이용한 쿼리 파라미터 조회

     

    위와 같은 4가지 방법이 있으며 하나씩 어떻게 편리하게 요청 파라미터 조회할 수 있는지 하나씩 알아보자.

     

     

    HttpServletRequest을 이용한 요청 파라미터 조회

     

     요청 url에 쿼리 파라미터로 데이터를 전송하는 GET 방식과 Form 태그로 요청 message body에 쿼리 파라미터 형식으로 전달하는 POST 방식 모두 HttpServletRequest를 이용하여 요청 파라미터를 조회할 수 있다.

     

    요청 URL /request-param-v1?username=userA&age=20 

    @Slf4j
    @RestController
    public class RequestParamController {
    
        @GetMapping("/request-param-v1")
        public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException, IOException {
            String username = request.getParameter("username");
            int age = Integer.parseInt(request.getParameter("age"));
            log.info("username={}, age={}", username, age);
            response.getWriter().write("ok");
        }
    
    }

    로그를 이용하여 해당 요청 파라미터가 잘 넘어왔는지 확인

     이와 같은 방법은 HttpServletRequest 객체를 주입받고 해당 쿼리 파라미터를 추출 및 타입 변환까지 모두 처리해줘야 한다. 

     


     

     

    @RequestParam을 이용한 요청 파라미터 조회

     

    • @RequestParam 속성
            value : 파라미터의 이름과 변수의 이름이 다를 경우 파라미터의 이름을 지정해준다.
            required : false를 설정하면 지정된 이름의 파라미터가 없을 경우 null이 주입된다.
            defaultValue : 값이 넘어오지 않을 경우 default값 설정

     

     스프링이 제공하는 @RequestParam은 HttpServletRequest 객체를 이용하는 것보다 요청 파라미터를 매우 쉽게 조회할 수 있다. 또한 @RequestParam은 자동으로 형 변환을 해준다.

     

    요청 URL /request-param-v2?username=userA&age=20 

    @Slf4j
    @RestController
    public class RequestParamController {
    
        @GetMapping("/request-param-v2")
        public String requestParamV2(
                @RequestParam("username") String memberName,
                @RequestParam("age") int memberAge) {
            log.info("username={}, age={}", memberName, memberAge);
            return "ok";
        }
    
    }

    로그를 이용하여 해당 요청 파라미터가 잘 넘어왔는지 확인

     

     또 이보다 편하게 작성할 수 있는데 그 방법은 String, int, Integer 등의 단순 타입일 때 쿼리 파라미터 변수명(username, age)과 매핑된 메서드 파라미터의 변수명과 같으면 @RequestParam("변수명")을 생략해도 되며 보통 파라미터 변수명과 쿼리 파라미터의 변수명을 일치시킨다.

     

    요청 URL /request-param-v2?username=userA&age=20 

    @Slf4j
    @RestController
    public class RequestParamController {
        
        @GetMapping("/request-param-v4")
        public String requestParamV4(String username, int age) {
            log.info("username={}, age={}", username, age);
            return "ok";
        }
    
    }

     여기서 중요한 점은 int age에 null값이나 빈문자(공백)가 안 들어가도록 주의해야 한다.


     

    Map, List, MultiValueMap을 이용한 요청 파라미터 조회

     

     마찬가지로 @RequestParam을 사용하는 방법이다. Map과 MultiValueMap은 쿼리 파라미터의 변수가 많을 경우 사용하며 List의 경우는 쿼리 파라미터에 같은 이름의 변수가 2개 이상일 경우 모두 조회하기 위해 사용한다. 주의할 점은 컬렉션을 통해 파라미터를 조회할 경우 자동 형 변환해서 파라미터를 받을 수 없다.

     

    MultiValueMap의 경우는 같은 이름의 변수가 존재해도 해당 key에 value들을 저장할 수 있다.

    (MultiValueMap(key=[value1, value2, ...] ex) (key=userIds, value=[id1, id2]))

     

    요청 URL /request-param-map?username=userA&age=20 

    요청 URL /request-param-list?username=userA&username=userB 

    요청 URL /request-param-multimap?username=userA&age=20 

    @Slf4j
    @RestController
    public class RequestParamController {
    
        @GetMapping("/request-param-map")
        public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
            log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
            return "ok";
        }
    
        @GetMapping("/request-param-list")
        public String requestParamList(@RequestParam List<String> username) {
            for (String s : username) {
                log.info("username={}", s);
            }
            return "ok";
        }
    
        @GetMapping("/request-param-multimap")
        public String requestParamMultiValueMap(@RequestParam MultiValueMap<String, Object> paramMap) {
            log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
            return "ok";
        }
    }

     

     

     

    728x90
    반응형

    댓글

Designed by Tistory.