ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 요청 파라미터 - @RequestParam, @ModelAttribute
    스프링/스프링 MVC 패턴 2023. 2. 14. 14:18

    쿼리 파라미터에 들어온 값들을 재사용하거나 출력해야할 때가 있다.

    그럴 때 사용하는 것이 @RequestParam 애노테이션이다.

     

     

    @RequestParam 사용 x

    @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"); // return "ok"; 와 비슷
    }

    @RequestParam 애노테이션을 사용하기 전에는 HttpServlet에서 request와 response를 받아와서 사용했다.

     

     

     

    @RequestParam 사용

    @ResponseBody     // ok라는 문자를 http에 바로 반환 @RestController와 같은 효과
    @RequestMapping("/request-param-v2")
    public String requestParamV2(
            @RequestParam("username") String memberName,
            @RequestParam("age") int memberAge) {
    
        log.info("username={}, age={}", memberName, memberAge);
        return "ok";
    }

    @RequestParam을 메서드의 파라미터로 받으면 username은 memberName에 저장되고, age는 memberAge에 저장된다.

    http://localhost:8080/request-param-v2?username=hello&age=20 이라는 url을 입력하면

    username=hello, age=20 이라는 로그가 출력되는 것이다.

     

     

     

    @RequestParam의 생략

    @ResponseBody     // ok라는 문자를 http에 바로 반환 @RestController와 같은 효과
    @RequestMapping("/request-param-v3")
    public String requestParamV3(String username, int age) {
        // @RequestParam도 생략가능
    
        log.info("username={}, age={}", username, age);
        return "ok";
    }

    username의 값을 위의 방식처럼 memberName 등 변수로 저장하지 않고 그냥 파라미터값과 똑같이 사용하려면 @RequestParam 애노테이션을 생략 가능하다.

    하지만 저러면 명확하게 한 눈에 확인하기 어렵기 때문에 되도록 생략하지 않는게 좋다고 생각한다.

     

     

     

    @RequestParma(required = true/false) 로 필수 값 지정

    @ResponseBody     // ok라는 문자를 http에 바로 반환 @RestController와 같은 효과
    @RequestMapping("/request-param-required")
    public String requestParamRequired(
            @RequestParam(required = true) String username,
            @RequestParam(required = false) Integer age) {
            // required false로 설정하면 쿼리 파라미터에 age를 입력하지 않아도 오류나지 않음
            // 하지만 자바에서 int는 null이 못들어가서 int를 Integer로 바꿔야함 (Integer는 객체라 null이 자동으로 들어감)
    
        log.info("username={}, age={}", username, age);
        return "ok";
    }

    애노테이션 안에 requried = true / false로 꼭 입력되어야 하는지 아니면 입력되지 않아도 되는지 설정할 수 있다.

    http://localhost:8080/request-param-requried?username=hello로 url에 접근하면

    username=hello, age=null로 로그가 출력된다.

     

     

     

    @RequestParam 기본 값 지정

    @ResponseBody
    @RequestMapping("/request-param-default")
    public String requestParamDefault(
            @RequestParam(defaultValue = "guest") String username,
            @RequestParam(defaultValue = "-1") int age) {
    
        log.info("username={}, age={}", username, age);
        return "ok";
    }

    defualt 값을 지정해두면 파라미터를 입력하지 않아도 자동으로 기본값이 지정이 된다.

    username만 파라미터로 넘겨준다고 가정을 하면 username=hello, age=-1이라고 로그에 출력된다.

     

     

     

    @RequestParam의 Map 이용

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

    여러 값들을 동시에 받고 싶을 때는 Map을 이용하면 된다.

    paramMap이라는 Map을 만들었을 뿐인데 get() 메서드를 통해 username과 age를 받아올 수 있었다.

     

     

     

    @ModelAttribute 애노테이션

     

     

    HelloData class

    package hello.springmvc.basic;
    
    import lombok.Data;
    
    @Data
    public class HelloData {
        private String username;
        private int age;
    }
    

    HelloData를 만들고 @ModelAttribute 애노테이션을 사용해 볼 것이다.

     

     

     

     

    @ResponseBody
    @RequestMapping("/model-attribute-v1")
    public String modelAttributeV1(@ModelAttribute HelloData helloData) {
        log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
        return "ok";
    }
    
    @ResponseBody
    @RequestMapping("/model-attribute-v2")
    public String modelAttributeV2(HelloData helloData) { // @ModelAttribute 생략 가능
        log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
        return "ok";
    }

     

    @RequetsParam과 비슷한 방식으로 파라미터 값들을 받아올 수 있다. @ModelAttribute도 생략이 가능하며 객체를 생성하고 set, get 방식으로 데이터를 설정, 조회할 때 많이 사용한다.

    '스프링 > 스프링 MVC 패턴' 카테고리의 다른 글

    HTTP 요청 메서드 - JSON  (0) 2023.02.14
    HTTP 요청 메시지 - 텍스트  (0) 2023.02.14
    API 요청 매핑 타입  (0) 2023.02.14
    특정 조건 매핑  (0) 2023.02.14
    로그 출력  (0) 2023.02.13
Designed by Tistory.