Search
Duplicate
😀

07. Controller, View, Model

태그

Controller

@Controller와 @RequestMapping 선언
method 단위의 mapping이 가능
DefualtAnnotaionHandlerMapping과 AnnotationHandlerAdapter를 사용함
Spring 3.0부터는 기본 설정이므로 별도의 추가 없이 사용 가능

@Controller

Controller Class는 Client의 요청을 처리하는 역할
@Controller 선언
Class 타입에 적용
사용 방법 1 - Controller Class를 <bean>에 등록
사용 방법 2 - Controller Class 자동 스캔
context:component-scan 선언
base-package에 설정된 package 내의 class 중 @Controller annotation이 적용된 클래스는 자동 스캔대상이 된다.

@RequestMapping 선언

요청 URL mapping 정보를 설정
클래스타입과 메서드에 설정 가능
Controller method의 HTTP method에 한정하여 같은 URL 요청에 대하여 HTTP method(GET, POST,,,)에 따라 서로 다른 메서드를 mapping 할 수 있음
@RequestMapping(value = "/index.do", method = RequestMethod.GET) public String home(Model model){ model.addAttribute("message", "안녕하세요 스프링(GET)!!!"); return "index"; } @RequestMapping(value = "/index.do", method = RequestMethod.GET) public String home(Model model){ model.addAttribute("message", "안녕하세요 스프링(POST)!!!"); return "index"; } ///////////////////////////////////////////////// // 아래처럼 @GetMapping, @PostMapping으로 사용 가능 @GetMapping("index.do") public String home(Model model){ model.addAttribute("message", "안녕하세요 스프링(GET)!!!"); return "index"; }
Java
복사

@RequestParam annotaion을 이용한 parameter mapping

@RequestParam을 지정하면 자동으로 선언한 변수에 값이 Mapping된다.
만약 parameter 이름이 URL과 동일하다면 @RequestParam 없이도 사용할 수 있다. (age)
required가 true로 선언되어 있으면 값이 넘어오지 않을 때 에러를 발생시킨다.
// URL 호출 : http://localhost/web/index.do?name=김경준&age=30 @Controller public class HomeController{ @RequestMapping(value = "/index.do" , method = RequestMethod.GET) public String home(@RequestParam(value ="name", required= false) String name, // @RequestParam(value ="age", defaultValue="25"), int age, Model model) { model.addAttribute("message", name + "(" + age + ")님 안녕하세요!!!"); return "index"; } }
Java
복사

HTML form과 Command Object(DTO, VO..)

SpringMVC는 form에 입력한 data를 JavaBean 객체를 이용해서 전송할 수 있음
data name이 setter와 동일한 경우(set 빼고 첫글자 소문자) 자동으로 set 해서 객체로 담아줌
View에서 Command 객체에 접근
Command 객체는 자동으로 반환되는 Model에 추가됨
Controller의 @RequestMapping annotaion method에서 전달받은 Command 객체에 접근
@ModelAttribute를 사용하여 View에서 사용할 Command 객체의 이름을 변경 가능

Servlet API 사용

HttpSession의 생성을 직접 제어해야 하는 경우
Controller가 Cookie를 생성해야 하는 경우
Servlet API를 선호하는 경우
@Controller public class HomeController{ public String hello(HttpServletRequest request, HttpServletResponse respons){ return "ok"; } }
Java
복사

View

View 이름을 명시적으로 지정
ModelAndView와 String 리턴 타입
String을 이용하면 return을 통해 View의 이름을 지정 가능하다.
View 이름의 자동지정
RequestToViewNameTranslator를 이용하여 URL로부터 View 이름을 결정
자동 지정 유형
return type이 Model이나 Map인 경우
return type이 void면서 ServletResponse나 HttpServletResponse 타입의 parameter가 없는 경우
redirect view
View 이름에 redirect: 접우어를 붙이면, 지정한 페이지로 redirect됨

Model

View에 전달하는 데이터
@RequestMapping annotaion이 적용된 method의 Map, Model, ModelMap
@RequestMapping method가 return하는 ModelAndView
@ModelAtrribute annotation이 적용된 method가 return한 객체
Map, Model, ModelMap을 통한 설정
method의 argument로 받는 방식
@Controller public class HomeController{ @RequestMapping("/hello.do") public String hello(Map model){ model.put("message", "안녕하세요"); return "hello"; } @RequestMapping("/hello2.do") public String hello2(ModelMap model){ model.addAttribute("message", "안녕하세요"); return "hello"; } @RequestMapping("/hello3.do") public String hello3(Model model){ model.addAttribute("message", "안녕하세요"); return "hello"; } }
Java
복사