컨트롤러의 @RequestMapping 어노테이션이 적용된 메서드는 커맨드 클래스 뿐만 아니라 다양한 타입의 파라미터를 가질 수 있다.
전달 가능한 파라미터 타입은 다음과 같다.
파라미터 타입 | 설명 |
HttpServletRequest, HttpServletResponse, HttpSession |
Sevlet API |
java.util.Locale | 현재 요청에 대한 Locale |
InputStream, Reader | 요청 컨텐츠에 직접 접근할 때 사용 |
OutputStream, Writer | 응답 컨텐츠를 생성할 때 사용 |
@PathVariable Annotation 적용 파라미터 |
URI 템플릿 변수에 접근할 때 사용 |
@RequestParam Annotation 적용 파라미터 | HTTP 요청 파라미터를 Mapping |
@RequestHeader Annotation 적용 파라미터 |
HTTP 요청 헤더를 Mapping |
@CookieValue Annotation 적용 파라미터 |
HTTP 쿠키를 Mapping |
@RequestBody Annotation 적용 파라미터 |
HTTP 요청의 몸체 내용에 접근할 때 사용. HTTPMessageConverter를 이용해서 HTTP 요청 데이터를 해당 타입으로 변환한다. |
Map, Model, ModelMap | 뷰에 전달할 모델 데이터를 설정할 때 사용 |
커맨드 객체 | HTTP 요청 파라미터를 저장한 객체, 기본적으로 Class 이름을 모델명으로 사용. @ModelAttribute Annotation을 사용하여 모델명을 설정할 수 있다. |
Errors, BindingResult | HTTP 요청 파라미터를 커맨드 객체에 저장한 결과, 커맨드 객체를 위한 파라미터 바로 다음에 위치 (커맨드 객체 앞에 위치할 수 없다.) |
SessionStatus | 폼 처리를 완료 했음을 처리하기 위해 사용. @SessionAttribute Annotation을 명시한 session 속성을 제거하도록 이벤트를 발생 시킨다. |
자주 사용되는 컨트롤러 메서드 파라미터 타입은 색으로 지정했다.
여기서, Errors와 BindingResult는 연관된 커맨드 객체 바로 다음에 위치해야 한다.
이 두 타입을 제외한 나머지 타입의 파라미터는 순서에 상관 없이 위치할 수 있다.
@RequestParam Annotation을 이용한 파라미터 Mapping
컨트롤러를 구현하면서 가장 많이 사용되는 Annotation이 바로 @RequestParam Annotation이다.
@RequestParam Annotation은 HTTP 요청 파라미터를 메서드의 파라미터로 전달받을 때 사용된다.
@RequestParam Annotation과 HTTP요청 파라미터의 관계는 다음과 같다.
주석 처리한 http://localhost:9000/SpringHi/exam/example.do?q=spring&p=1 을 요청 URL을 입력하면,
@RequestParam("q")는 q 요청파라미터의 값을 전달 받으며,
두번째 파라미터인 @RequestParam("p")는 p 요청 파라미터의 값을 전달받는다.
뷰 코드는 다음과 같다.
@RequestParam 어노테이션이 적용된 파라미터가 String 타입이 아닐 경우 실제 타입에 따라서 알맞은 타입으로 자동 변환 해준다. 만약 다음과 같이 int 타입으로 변환할 수 없는 값인 "a"를 pageNumber 파라미터에 매핑되는 HTTP 요청 파라미터로 전달하면, SPRING MVC는 잘못된 요청(Bad Request)을 의미하는 400 응답 코드를 웹 브라우저에 전송한다.
@RequestParam 어노테이션이 적용된 파라미터는 기본적으로 필수 파라미터이다. 따라서 @RequestParam 어노테이션에 명시한 HTTP 요청 파라미터가 존재하지 않을 경우 SPRING MVC는 잘못된 요청(Bad Request)을 의미하는 400 응답 코드를 웹 브라우저에 전송한다.
따라서, 필수가 아닌 파라미터인 경우 required 속성 값을 "false"로 지정해주면 된다.
참고로 required 속성의 기본값은 "true"이다.
q 요청 파라미터 값을 주지 않아도 400 응답 코드가 발생하지 않는다.
필수가 아닌 요청 파라미터 값이 존재하지 않을 경우 null값을 할당한다. 하지만,
null을 할당할 수 없는 기본 데이터 타입인 경우에는 타입 변환 에러가 발생한다.
따라서, 기본 데이터 타입을 사용할 경우 HTTP 요청 파라미터가 존재하지 않으면,
defaultValue 속성을 이용해서 기본 값을 할당할 수 있다.
@RequestParam("q")의 required 속성을 false로 지정하고,
두번째 @ReqeustParam("p")의 defaultValue 속성을 "7"로 지정했기 때문에 뷰에는 각각 null값과 7이 출력된다.