HTTP 요청 파라미터
클라이언트에서 서버로 데이터를 보낼 때는 주로 3가지 방법을 사용한다.
GET
쿼리 파라미터
/url?username=hello&age=20
메시지 바디 없이 URL 쿼리 파라미터에 데이터를 포함해 전달한다.
검색, 필터, 페이징 등에서 사용한다.
POST
HTML Form
content-type: application/x-www-form-urlencoded
메시지 바디에 쿼리 파라미터 형식으로 전달한다.
username=hello&age=20
회원 가입, 상품 주문, HTML Form에 사용한다.
HTTP message body에 직접 담아서 요청
HTTP API에 주로 사용한다.
json, xml, text
주로 json 데이터를 사용한다.
POST, PUT, PATCH에 쓰인다.
쿼리 파라미터, HTML Form
요청 파라미터 조회라고도 한다.
HttpServletRequest의 request.getParameter()
GET 쿼리 파라미터든 POST HTML Form이든 둘 다 형식이 같으므로 구분없이 조회할 수 있다.
request.getParameter()로 요청 파라미터를 조회한다.
HTML Form으로 요청 파라미터를 조회한다.
@RequestParam
@RequestParam
파라미터 이름으로 바인딩 한다.
GET 쿼리 파라미터든, HTML Form이든 파라미터를 잘 받아온다.
@ResponseBody
view 조회 대신 HTTP message body에 직접 입력한다.
@RequestParam의 name(value) 속성이 파라미터와 일치해야 한다.
이름과 변수명이 같다면 생략할 수 있다.
이름과 변수명이 같고 String, int, Integer 등의 단순한 타입이면 @RequestParam 애너테이션까지 생략할 수 있다.
너무 다 생략하면 과할 수 있으니 애너테이션 정도는 붙여줘서 요청 파라미터를 읽는다고 명확하게 표시해주자.
필수값 지정
required 옵션은 기본적으로 true다.
필수값이 아니면 false로 지정한다.
필수값을 넣지 않으면 400 에러가 발생한다.
null이 아니라
?username=처럼 빈 값이 들어오는 경우라면 ok가 떨어지므로 주의한다.
필수가 아니더라도 primitive type이면 null이 들어갈 수 없으므로 Wrapper 클래스로 바꿔줘야 한다.
required 상관없이 정상 동작하게 하려면 defaultValue를 사용할 수 있다.
빈 문자도 기본값을 적용해준다.
파라미터를 한 번에 전부 받고 싶다면 Map을 사용할 수 있다.
@RequestParam Map
값이 확실하게 1개인 경우에 사용한다.
Map(key=value)
@RequestParam MultiValueMap
MultiValueMap(key=[value1, value2, ...])
ex. (key=userIds, value=[id1, id2])
@ModelAttribute
실제 개발 하면 요청 파라미터를 다시 객체에 넣는 과정을 반복한다.
@ModelAttribute를 사용하면 이 과정을 자동화할 수 있다.
HelloData라는 객체를 생성한다.
요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다.
해당 프로퍼티의 setter를 호출해 파라미터의 값을 바인딩한다.
파라미터가 username이면 setUsername()을 호출해 값을 입력한다.
문자에 숫자가 들어오거나 한다면 BindException이 발생한다.
@ModelAttribute 생략
애너테이션을 빼도 작동한다.
객체 이름은 상관 없이 그 내부의 프로퍼티 이름만 맞으면 된다.
@RequestParam 또한 생략 가능해 혼란스러우므로 붙여주는 게 좋다.
애너테이션 생략 시 규칙은 다음과 같다.
@RequestParam
String, int, Integer 등 단순한 타입
@ModelAttribute
나머지
argument resolver로 지정해둔 타입 외의 것들
ex. HttpServletResponse 등은 ArgumentResolver가 처리한다.
@RequestParam과 달리 기본값을 알아서 넣어준다.
Last updated
Was this helpful?