HTTP 요청 파라미터

기존 방식

  • request.getParamter로 쿼리 파라미터와 HTML Form 모두 받음

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

Spring MVC

01. @RequestParam 사용

  •  // 단순 타입이 파라미터로 들어오면 @RequestParam도 생략가능
        @ResponseBody // 문자를 그대로 반환하기 위함 (RestController와 같은 효과)
        @RequestMapping("/request-param-required")
        public String requestParamRequired(
                @RequestParam(required = true, value="username") String username,
                @RequestParam(required = false, value="age") Integer age) {
            log.info("username={}, age={}", username, age);
            return "ok";
        }
    
  • required 옵션 : 파라미터의 필수 여부를 설정할 수 있음 (default: true)

  • defaultValue 옵션 : 파라미터의 기본값을 설정 (빈문자열을 입력해도 기본값이 들어감)

  • 변수명과 HTML 태그 name이 일치하면 value 생략 가능

  • => 타입이 단순 타입(String, int, Integer, …)이면 @RequestParam도 생략 가능

  • => 너무 많이 생략한 느낌이 없지 않아 있어서 가독성이 살짝 부족할 수도 있음…

  •  @ResponseBody // 문자를 그대로 반환하기 위함 (RestController와 같은 효과)
     @RequestMapping("/request-param-v4")
     public String requestParamV4(String username, int age) {
         log.info("username={}, age={}", username, age);
         return "ok";
     }
    
  • 파라미터를 Map으로 조회하여 한 번에 받아오기

  •  @ResponseBody
     @RequestMapping("/request-param-map")
     public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
         log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
         return "ok";
     }
    

02. @ModelAttribute 적용

  • 아래 과정을 @ModelAttribute로 자동화 가능

  •  @ResponseBody
     @RequestMapping("/request-param-map")
     public String requestParamMap(@RequestParam String username, @RequestParam int age) {
         HelloData data = new HelloData();
      	 data.setUsername(username);
      	 data.setAge(age);
         log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
         return "ok";
     }
    
  • @ModelAttribute 적용

  • @ResponseBody
    @RequestMapping("/model-attribute-v1")
    public String modelAttributeV1(@ModelAttribute HelloData helloData) {
        log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
      
         return "ok";
    }
    
  • 과정

    1. HelloData 생성
    2. 요청 파라미터의 이름으로 HelloData 객체 프로퍼티 탐색
    3. 같은 이름을 찾아서 setter를 찾아 바인딩
  • @ModelAttribute는 생략 가능

    • 단순 타입인 경우 @RequestParam
    • 나머지 @ModelAttribute (argument resolver 지정해둔 타입 제외)



인프런 - 김영한님의 Spring MVC 강의를 정리한 내용입니다.


김영한님 인프런 강의

댓글남기기