SpringMVC - 요청 파라미터

hangs·2022년 10월 5일
0

클라이언트에서 서버로 데이터를 전달하는 방법은 3가지 방법뿐이다.

  • GET - 쿼리 파라미터
    • /url?username=hello&age=20
    • 메세지 바디 없이 URL의 쿼리 파라미터에 데이터를 포함해서 전달
    • 검색, 필터, 페이지 등에서 많이 사용하는 방식
  • POST - HTML FORM
    • content-type: application/x-www-form-urlencoded
    • 메시지 바디에 쿼리 파라미터 형식으로 전달 username=kim&age=20
    • 예) 회원가입, 상품 주문, HTML FORM 사용
  • HTTP message body에 데이터를 직접 담아서 요청
    • HTTP API에서 주로 사용, JSON

HTTP 요청 파라미터 - @RequestParam

@ResponseBody
    @RequestMapping("/request-param-v2")
    public String requestParamV2(
            @RequestParam("username") String memberName,
            @RequestParam("age") int memberAge) {
        return "ok";
    }

쿼리 파라미터로 username=kim&age=20 온 데이터가 memberName, memberAge에 바인딩되게 된다. 결국은 @RequestParam("username") String memberNamerequest.getParameter("username")과 같은 효과이다.

public String requestParamV2(
            @RequestParam String memberName,
            @RequestParam int age
            ) {
            return "ok";
            }

@RequestParam(name="xx") 생략 가능하다. @RequestParam String username으로 쓸 수 있다. 대신 쿼리 파라미터 키 값(username)과 파라미터 username이 일치해야한다.

public String requestParamV4(String username, int age) {
return "ok"

더 나아가서 , String, int, Integer 단순 타입이면 @RequestParam도 생략 가능.

파라미터 필수 여부와 Default Value

@RequestParam(required = false, defaultValue = "-1") int age 와 같이 파라미터 필수 여부를 정하는 required(디폴트는 true)와 파라미터가 필수라는 조건이 있어도 defaultValue로 기본값으로 적용할 수 있다.



HTTP 요청 파라미터 - @ModelAttribute

요청 파라미터를 객체로 받아서 바인딩할 수 있다.
바인딩 받을 객체를 만들어 보자.

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

@ModelAttribute는 다음과 같이 실행한다.

  • HelloData 객체를 생성한다.
  • 요청 파라미터 이름으로 HelloData객체의 프로퍼티를 찾는다. 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 바인딩 한다.
  • 예) 파라미터 이름이 username이면 setUsername()메소드를 찾아서 호출하면서 값을 입력한다.

@ModelAttribute도 생략할 수 있다.

프로퍼티
객체에 getUsername(), setUsername()메소드가 있으면, username이라는 프로퍼티를 가지고 있다.
username프로퍼티 값을 변경하려면 setUsername()가 호출되고, 조회하면 getUsername()가 호출된다.

@ModelAttribute - Model 추가

@PostMapping("/add")
  public String addItemV2(@ModelAttribute("item") Item item, Model model) {
itemRepository.save(item); 
model.addAttribute("item", item); //자동 추가, 생략 가능
      return "basic/item";
  }

@ModelAttributemodel.attribute()의 역할도 한다.
모델에 데이터를 담을때는 이름이 필요하다. @ModelAttributename속성을 사용한다. 그래서 @ModelAttribute("item") Item itemmodel.addAttribute("item",item)과 같은 역할을 한다.
@ModelAttribute("hello") Item item이면 model.addAttribute("hello",item) 모델 hello의 이름으로 item데이터가 담긴다.

@ModelAttribute의 name 속성 생략

@PostMapping("/add")
  public String addItemV3(@ModelAttribute Item item) {
      itemRepository.save(item);
      return "basic/item";
  }

@ModelAttributename속성을 생략하면 모델에 저장될때 클래스명을 사용한다. 클래스의 첫글자만 소문자로 변경해서 등록한다.

  • @ModelAttribute Item item이면 model.addAttribute("item",item) 의미한다.
  • @ModelAttribute HelloData helloData이면 model.addAttribute("helloData",helloData)도 마찬가지다.



Reference

0개의 댓글