본문 바로가기

카테고리 없음

스프링 공부 3일차. 컨트롤러 메서드의 파라미터 타입

컨트롤러의 @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이 출력된다.