HTTP 요청파라미터 조회하는 기능 @RequestParam, @ModelAttribute

최주영·2024년 2월 7일
0

@RequestParam : String, int, Integer 같은 단순 타입을 받을 때 사용
@ModelAttribute : 위에서 적은 외 나머지 (객체)를 받을 때 사용


@RequestParam

  • v1

    HttpServlet 객체를 이용해서 데이터를 받음

  • v2

    @RequestParam 어노테이션을 통해서 데이터 받음

  • v3

    HTTP 파라미터 이름이 변수명이 동일하면 어노테이션 안의 생략 가능

  • v4

    HTTP 파라미터 이름이 변수명이 동일하면 어노테이션 자체를 생략 가능

  • required

    기본적으로 required는 true가 기본값으로, 해당 파라미터가 넘어오지 않으면 오류 발생한다
    하지만 false로 설정할 경우, 데이터가 넘어오지 않아도 오류가 발생하지 않고 null값으로 저장

  • defaultValue

    파라미터 값을 보내지 않으면 기본 지정한 값으로 들어옴
    defaultValue는 빈 문자의 경우에도 설정한 기본 값이 적용됨

  • @RequestParam Map

    파라미터 값을 Map으로 저장할 수 있음


소스코드

@Slf4j
@Controller
public class RequestParamController {
    @RequestMapping("/request-param-v1") // v1 버전 -> HttpServlet을 이용해서 데이터 받음
    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");
    }

    @ResponseBody // RestController와 같은역할로 뷰조회가 아닌, HTTP message body에 직접 해당 리턴문자로 반환
    @RequestMapping("/request-param-v2") // v2버전 -> @RequestParam 어노테이션을 통해서 데이터 받음
    public String requestParamV2(
            @RequestParam("username") String memberName,
            @RequestParam("age") int memberAge){
        log.info("username={}, age={}",memberName,memberAge);
        return "ok";
    }

    @ResponseBody
    @RequestMapping("/request-param-v3") // v3버전 -> HTTP 파라미터 이름이 변수명이 동일하면 어노테이션 안의 값 생략 가능
    public String requestParamV3(
            @RequestParam String username,
            @RequestParam int age){
        log.info("username={}, age={}",username,age);
        return "ok";
    }

    @ResponseBody
    @RequestMapping("/request-param-v4") // v4버전 -> HTTP 파라미터 이름이 변수명이 동일하면 어노테이션 자체를 생략 가능
    public String requestParamV4(String username, int age){
        log.info("username={}, age={}",username,age);
        return "ok";
    }

    @ResponseBody
    @RequestMapping("/request-param-required")
    public String requestParamRequired(
            @RequestParam(required = true) String username,
            @RequestParam(required = false) Integer age){  // default = true값으로 파라미터를 보내지 않으면 오류남
        // null을 int에 입력하는것을 불가능 (500에러) -> Integer로 변경하거나, defaultValue 사용
        log.info("username={}, age={}",username,age);
        return "ok";
    }

    @ResponseBody
    @RequestMapping("/request-param-default")
    public String requestParamDefault(
            @RequestParam(required = true, defaultValue = "guest") String username, // 파라미터값을 보내지않으면 guest로 보내짐
            @RequestParam(required = false,  defaultValue = "-1") int age){  // 파라미터값을 보내지 않으면 -1로 보내짐
        log.info("username={}, age={}",username,age);
        return "ok";
    }


    @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";
    }

@ModelAttribute

    @ResponseBody
    @RequestMapping("/model-attribute-v1")
    public String modelAttributeV1(@ModelAttribute HelloData helloData){
        // 1. HelloData 객체를 생성함   2. 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다.
        // 3. 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력한다.
        // 4. 파라미터 이름이 username이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다
        log.info("username={}, age={}",helloData.getUsername(), helloData.getAge());
        return "ok";
    }
    
    @ResponseBody
    @RequestMapping("/model-attribute-v2") // @ModelAttribute 어노테이션 자체를 생략가능
    public String modelAttributeV2(HelloData helloData){
        log.info("username={}, age={}",helloData.getUsername(), helloData.getAge());
        return "ok";
    }
  //  @PostMapping("/add")   // form으로 넘어온 값들을 @RequestParam을 통해 값을 저장
    public String addItemV1(@RequestParam String itemName,
                       @RequestParam int price,
                       @RequestParam Integer quantity,
                       Model model){
        Item item = new Item();
        item.setItemName(itemName);
        item.setPrice(price);
        item.setQuantity(quantity);

        itemRepository.save(item);

        model.addAttribute("item",item);

        return "basic/item";
    }


    //@PostMapping("/add")
    public String addItemV2(@ModelAttribute("item") Item item){

        itemRepository.save(item);
       // model.addAttribute("item",item);  // @ModelAttribute로 인해서 자동으로 추가되므로 생략 가능함
                                            // @ModelAttribute 안에 "item"은  model.addAttribute("item",item); 도 포함되있음
        return "basic/item";
    }

    //@PostMapping("/add")
    public String addItemV3(@ModelAttribute Item item){ // ModelAttribute 이름 생략시 -> model에 저장되는 name은 클래스명 첫글자만 소문자로 등록
                                                    // 위 클래스명은 Item 이므로  Item -> item
                                                    // @ModelAttribute에 item으로 담기게 됨
        itemRepository.save(item);
        return "basic/item";
    }

    @PostMapping("/add")
    public String addItemV4(Item item){ // ModelAttribute 어노테이션 자체를 생략 가능
        itemRepository.save(item);
        return "basic/item";
    }
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글