Spring MVC - 요청 파라미터, @RequestParam, @ModelAttribute

2021. 4. 7. 16:54SPRING/SPRING MVC

요청 파라미터

Http 통신에서 요청 파라미터가 넘어오는 경우가 두 가지가 있다.

1. Get 메서드로 쿼리 파라미터가 넘어오는 경우

예) www.naver.com/exp?username=yoon&age=33  

 

2. Html의 Form태그를 통해 Http 메시지의 바디부분으로 들어오는 경우

쿼리 파라미터와 양식이 같다. 다만 URI뒤에 붙는게 아닌, http 메시지 바디에 들어가게 된다.

 

요청 파라미터 조회

HttpServletRequest

  • 서블릿처럼 HttpServletRequest를 인자로 받아 request.getParameter()를 이용해 파라미터를 조회할 수 있다.

 

@RequestParam

  • HttpServletRequest를 사용하지 않고 파라미터를 조회할 수 있다.
  • 예) @RequestParam("username") String memberName
  • 파라미터 이름과 매개변수 이름이 같으면 생략 가능하다.
  • 예) @RequestParam String username
  • String, int, Integer와 같은 단순 타입이면 @RequestParam도 생략 가능하다
  • 예) String username
  • required 속성으로 필수 파라미터를 지정할 수 있다. 디폴트는 true.
  • 클라이언트에서 해당 파라미터를 보내지 않으면 400 응답코드로 리턴된다.
  • 빈 문자열을 보내면 400 에러 나지 않고 빈문자열을 받는다.
  • 매개변수를 int로 설정한 경우 null이 들어갈 수 없기때문에 null이 오면 바인딩 에러가 난다.
  • 이럴때는 Integer로 변경하던가 defaultValue 속성을 지정해준다.
  • defaultValue 속성을 지정해주면 required 속성이 필요없어진다.

 

@ModelAttribute

  • 파라미터를 DTO로 받을 수 있다.
  • 예) @ModelAttribute User user
  • @ModelAttribute는 내부적으로 setter를 찾는다. 따라서 setter가 있어야한다.
  • @ModelAttribute는 DTO이름이 아닌, DTO안의 프로퍼티(변수) 이름으로 매핑된다.
  • @ModelAttribute는 생략 가능하다.
  • 이 때, 스프링은 단순 타입이면 @RequestParam으로 인식하고 단순 타입이 아니면서 argument resolver로 지정해둔 타입이 아닌 경우 @ModelAttribute로 인식한다.
  • 속성으로 value 스트링값을 넣을 수 있는데, 여기에 들어간 값으로 Model에 해당 파라미터를 넣어주는 기능도 있다.
  • value 속성을 생략하면 파라미터 타입의 앞 첫글자만 소문자로 변경한 이름으로 Model에 넘어가게 된다.
  • 예) Item -> item