@Controller
-설명: spring MVC의 Controller 클래스 선언을 단순화시켜준다. 스프링 컨트롤러, 서블릿을 상속할 필요가 없으며, @Controller로 등록된 클래스 파일에 대한 bean을 자동으로 생성해준다. Controller로 사용하고자하는 클래스에 명시하면 component-scan으로 자동 등록된다
<context: component-scan base-package="com.*"/>
@Controller
public class Spring{}
*컨트롤러 메서드의 파라미터 타입
파라미터 타입 : 설명
1. HttpServletRequest, Response, HttpSession : Servlet API
2. java.util.Locale : 현재 요청에 대한 Locale 정보
3. InputStream, Reader : 요청 컨텐츠에 직접 접근할 때 사용
4. OutputStream, Writer : 응답 컨텐츠 생성할 때 사용
5. @PathVariable : URL 템플릿 변수에 접근할 때 사용
6. @RequestParam : HTTP 파라미터 매핑
7. @RequestHeader :HTTP 헤더 매핑
8. @CookieValue : HTTP 쿠기 매핑
9. @RequestBody : HTTP RequestBody에 접근할 때 사용
HttpMessageConverter를 이용해 RequestBody 데이터를 해당 타입으로 변환
10. Map, Model, ModelMap : 뷰에 전달할 모델 데이터를 설정할 때 사용
11. 커맨드 객체 : HTTP 요청 파라미터를 저장한 객체,
기본적으로 클래스 이름을 모델명 으로 사용.
12. Errors, BindingResult : HTTP 요청 파라미터를 커맨드 객체에 저장한 결과.
커맨드 객체를 위한 파라미터 바로 다음에 위치한다.
13. SessionStatus : 폼 처리를 완료 했음을 처리하기 위해 사용.
@SessionAttribute를 명시한 session 속성을 제거하도록 이벤트를 발생시킨다.
*컨트롤러 메서드 리턴 타입
리턴 타입 : 설명
1. ModelAndView : 뷰 정보 및 모델 정보를 담고 있는 ModelAndView 객체
2. Model : 뷰에 전달할 객체 정보를 담고 있는 Model을 리턴한다.
이때 뷰 이름은 요청 URL로부터 결정된다.
RequestToViewNameTranslator를 통해 뷰 결정
(전달할 데이터만 리턴하는 경우에 사용하는 인터페이스)
3. Map, ModelMap : 뷰에 전달할 객체정보를 담고있는 맵 또는 모델맵을 리턴
이때 뷰 이름은 요청 URL로 부터 결정된다.
4. String : 뷰 이름을 리턴
5. View 객체: View 객체를 직접 리턴. 해당 View 객체를 이용해서 뷰를 생성한다.
6. void : 메서드가 ServletResponse나 HttpServletResponse 타입의 파라미터를 갖는
경우 메서드가 직접 응답을 처리한다고 가정한다.
그렇지 않을 경우 요청 URL로 부터 결정된 뷰를 보여준다.
7. @ResponseBody : 메서드에서 @ResponseBody 가 적용된 경우,
리턴 객체를 HTTP 응답으로 전송한다.
HttpMessageConverter를 이용해서 객체를 HTTP 응답 스트림으로 변환한다.
@RequestMapping
-설명: RequestMapping annotation은 url을 Controller의 method와 mapping 시켜준다.
class에 하나의 url mapping을 할 경우, class위에 @RequestMapping("url")을 지정하며,
GET 또는 POST 방식 등의 옵션을 줄 수 있다.
해당되는 method가 실행된 후, return 페이지가 따로 정의되어 있지 않으면 RequestMapping("url")에서 설정된 url로 다시 돌아간다.
-옵션:
1. value : @RequestMapping(value={"/main","/mainpage"})
디폴트 속성이기 때문에 하나의 url만 작성하는 경우 생략가능
2. method : @RequestMapping(method = RequestMethod.POST)
GET, POST, HEAD등으로 HTTP Request method를 설정가능
3. params : @RequestMapping(params = {"param1=a","param2","!myParam"})
HTTP Request로 들어오는 파라미터 표현. value 값은 클래스 선언한
@RequestMapping value 값을 상속받는다.
4. headers : @RequestMapping(value="/main" headers="content-type=text/*")
5. produce : @RequestMapping(value="..." produces="application/json")
@RequestParam
-설명: RequestParam annotation은 key=value 형태로 화면에서 넘어오는 쿼리스트링 혹은
폼 데이터를 메소드의 파라미터로 지정한다. 대체로 파라미터의 개수가 적을 때 사용
*쿼리스트링: 데이터를 전달하기 위한 URL의 일부분, GET 방식 파라미터 전달 문자열
-형태:
1. method(@RequestParam(param) obj)
2. method(@RequestParam Map)
*param : 전달되는 파라미터 이름을 지정. value값과 required 필수여부 값을 설정
값이 할당될 변수의 타입이 Map 혹은 MultiValueMap일때는 명시하지 않는다.
*obj : param으로 지정된 이름과 일치하는 파라미터 값을 할당할 변수, 보통 String 타입을
선언하지만 넘어온 값이 반드시 숫자일 경우 int등의 숫자 타입도 가능하다.
@RequestParam(value="id", required="false")와 같이 필수요건이 아닐때 주는 옵션
이름과 변수를 지정하는 방식(1:1 매핑)
public ModelMap method(@RequestParam("userId") int userId),
@RequestParam("value="userPassword" required=false ) int userPassword),
@RequestParam(value="userOpt" defaultValue = "남") String userOpt)
Map 방식 (N:1 매핑)
publice String detail(@RequestParam HashMap<String, String> map)
값을 할당할 변수의 타입을 Map 혹은 MultiValueMap으로 사용하는 방법
@ModelAttribute
파라미터 타입에 명시하는 경우
1. method(@ModelAttribute Model model)
2. method(@ModelAttribute(name) Model model)
화면에서 전달된 쿼리스트링이나 폼 데이터를 모델에 자동 할당하는 기능은@ModelAttribute 어노테이션 없이도 작동한다. @ModelAttribute는 데이터가 바인딩된 객체를 VIEW에서 재사용되어야 할 필요가 있을 때 사용한다.
*public ModelAndView draw(@ModelAttribute("param") JobDto jobDto
이는 "param"이란 이름으로 VIEW에 JobDto가 전달된다.
메서드 선언 레벨에 명시하는경우
@ModelAttribute returnType methodName(...)
컨트롤러에서 뷰에 전달할 일종의 공통 모델을 설정한다. 메서드가 리턴하는 값은 Request객체에 전달되며 전달 범위는 해당 메서드가 존재하는 컨트롤러 전체에 해당된다.
@ModelAttribute 어노테이션이 적용된 ㅁ메서드는 컨트롤러가 자동으로 호출한다.
단 , 매 요청마다 반복 실행되므로 효율성을 고려해야함.
@ModelAttribute("myObject")]
public String refModelTest() {
return "hello"
// request.setAttribute("myObject", "hello")와 같다.
// 선언된 클래스의 전역으로 실행된다.
}
}
@RequestBody
-설명: 적용된 파라미터는 HTTP Request body(본문)의 내용이 전달된다.
public void findBody(@RequestBody String body){
System.out.println(body);
}
@ResponseBody
-설명: 클라이언트에 JSON 형식의 값을 응답할 때 유용하다. 메서드에서 @ResponseBody를 적용한 후 문자열을 리턴하면 그 값은 HTTP response header가 아니라 HTTP response body에 쓰여진다. 객체를 넘길경우 스프링에 내장된 JACKSON에 의해 문자열로 변환된다.
또한 @ResponseBody가 적용된 컨트롤러는 context에 설정된 resolver를 무시한다.