[Spring] 컨트롤러 메서드의 파라미터 타입


컨트롤러 메서드의 파라미터 타입


컨트롤러 @RequestMapping 어노테이션이 적용된 메서드는 커맨드 클래스뿐만 아니라 HttpServletRequest, HttpSession, Locale 등 웹 어플리케이션과 관련된 다양한 타입의 파라미터를 가질 수 있는데, 전달 가능한 파라미터 타입은 다음과 같다.



1. @RequestParam 어노테이션을 이용한 파라미터 매핑

컨트롤러를 구현하면서 가장 많이 사용되는 어노테이션이 바로 @RequestParam 어노테이션이다. @RequestParam 어노테이션은 HTTP 요청 파라미터를 메서드의 파라미터로 전달받을 때 사용된다. @RequestParam 어노테이션과 HTTP 요청 파라미터의 관계는 다음과 같다.


첫번째 파라미터인 userName은 name 요청 파라미터의 값을 전달 받으며, 두 번째 파라미터인 userEmail 파라미터는 email 파라미터 값을 전달 받는다.

바로, JSP에서 String name = request.getParameter("name"); 과 같다.


@RequestParam은 Controller 메소드의 파라미터와 웹요청 파라미터와 맵핑하기 위한 어노테이션이다. 관련 속성은 아래와 같다.

@Controller

public class HelloController {

 

    @RequestMapping("/hello.do")

   

    public String hello(@RequestParam("name") String name,

    // required 조건이 없으면 기본값은 true, 즉 필수 파라미터이다. 파라미터 pageNo가 존재하지 않으면 Exception 발생.       

     @RequestParam(value="pageNo", required=false) String pageNo){ 

    // 파라미터 pageNo가 존재하지 않으면 String pageNo는 null.

...

    }

}

@RequestParam 어노테이션이 적용된 파라미터는 기본적으로 필수 파라미터이다. 따라서 @RequestParam 어노테이션에 명시한 HTTP 요청 파라미터가 존재하지 않을 경우

스프링 MVC는 잘못된 요청을 의미하는 400 응답 코드를 웹 브라우저에 전송한다. 예를 들어 @RequestParam 어노테이션의 별도 설정을 하지 않은 경우, 다음의 URL을 요청하면 400 에러가 발생하게 된다.


http://host/chap06/search/internal.do?query=spring&p=3


@Controller

public class SearchController{

@RequestMapping("/search/internal.do")

public ModelAndView seachInternal(

@RequestParam("query") String query, @RequestParam("p") int pageNumber){

...

}

}

첫 번째 파라미터는 query 요청 파라미터의 값을 전달받으며, 두 번째 파라미터인 pageNumber 파라미터는 p 파라미터의 값을 전달받는다.

@RequestParam 어노테이션이 적용된 파라미터가 String이 아닐 경우 실제 타입에 따라서 알맞게 타입 변환을 수행한다. 예를 들어, pageNumber 파라미터의 타입은 int인데, 이 경우 자동으로 문자열을 int 타입으로 변환해준다. 


만약 아래와 같이 int 타입으로 변환할 수 없는 값인 "a"를 pageNumber 파라미터에 매핑되는 HTTP 요청 파라미터로 전달하면, 스프링 MVC는 잘못된 요청(Bad Request)을 의미하는 400 응답 코드를 웹 브라우저에 전송한다.

http://localhost:8080/chap06/search/internal.do?query=spring&p=a

@RequestParam 어노테이션이 적용된 파라미터는 기본적으로 필수 파라미터이다. 따라서 @RequestParam 어노테이션에 명시한 HTTP 요청 파라미터가 존재하지 않을 경우 스프링 MVC는 잘못된 요청을 의미하는 400 응답코드를 웹 브라우저에 전송한다. 예를 들어 아래와 같이 @RequestParam 어노테이션의 별도 설정을 하지 않은 경우, 다음의 URL을 요청하면 400 에러가 발생하게 된다.


http://localhost:8080/chap06/search/internal.do?query=spring


필수가 아닌 파라미터인 경우 required 속성 값을 false로 지정해 주면 된다. 아래 코드는 적용 예이다. 참고로 required 속성의 기본 값은 true이다.

import orr.springframework.web.bind.annotation.RequestMapping

...

...

@RequestMapping("/search/external.do")

public ModelAndView searchExternal(

@RequestParam(value="query", required=false) String query, @RequestParam(value ="p", required=false) int pageNumber){

System.out.println("query="+query+",pageNumber="+pageNumber);

...

}

필수가 아닌 요청 파라미터의 값이 존재하지 않을 경우 null 값을 할당한다. 그런데, null을 할당할 수 없는 기본 데이터 타입인 경우에는 타입 변환 에러가 발생하게 된다. 예를 들어 , 위 코드에서 "p" 요청 파라미터를 필수가 아닌 파라미터로 설정했는데, 이 상태에서 "p" 요청 파라미터를 지정하지 않은 경우 null을 기본 데이터 타입으로 변환할 수 없다는 예외가 발생하게 된다.


기본 데이터 타입을 사용할 경우 HTTP 요청 파라미터가 존재하지 않으며 기본 값을 할당하는 경우가 많은데, 이런 경우에는 다음과 같이 defaultValue 속성을 이용해서 기본값을 지정할 수 있다.

@RequestMapping("/search/external.do")

public ModelAndView searchExternal(

@RequestParam(value="query", required=false) String query, @RequestParam(value="p", defaultValue="1") int pageNumber){

System.out.println("query="+query+",pageNumber="+pageNumber);

...

}

defaultValue 속성을 이용해서 기본 값을 지정하면 해당 요청 파라미터를 지정하지 않을 경우 defaultValue 속성에 지정한 문자열을 값으로 이용하게 된다. 예를 들어, 위와 같이 "p" 요청 파라미터의 기본 값을 "1"로 지정했다면,

http://localhost:8080.chap06/search/external.do?query=spring

"p" 파라미터가 존재하지 않으므로 기본 값으로 지정한 "1"을 "p" 요청 파라미터의 값으로 사용하게 되고, 따라서 pageNumber 파라미터의 값은 1이 된다.


2. @RequestHeader 어노테이션을 이용한 헤더 맵핑


@RequestHeader 어노테이션을 이용하면 HTTP 요청 헤더의 값을 메서드의 파라미터로 전달받을 수 있다.

import org.springframework.web.bind.annotation.RequestHeader;

import org.springframework.web.bind.annotation.RequestMapping;


@Controller

public class HeaderController {


@RequestMapping("/header/check.do")

public String check(@RequestHeader("Accept-Language") String languageHeader) {

System.out.println(languageHeader);

return "header/pass";

}

}


cf.) 컨트롤러 메서드의 리턴 타입

컨트롤러 메서드는 ModelAndView를 비롯한 몇 가지 리턴 타입을 가질 수 있다.