Spring MVC
① 클라이언트로부터 요청이 들어옴, DispatcherServlet이 그 요청을 받음
② HandlerMapping은 요청에 부합한 Controller를 탐색
③ HandlerAdapter는 HandlerMapping에 의해 결정된 Controller에서 요청에 부합한 메서드를 찾아 실행 요청
④ Controller 실행
⑤ 실행 결과인 model로 부터 반환된 view이름을 DispatcherServlet에게 전달 (Model or ModelAndView 객체)
⑥ 받은 view이름을 이용하여 ViewResolver는 그에 맞는 view를 탐색
⑦, ⑧ 탐색된 view로 클라이언트에게 응답
● DispatcherServlet (org.springframework.web.servlet.DispatcherServlet)
- 프론트 컨트롤러
- 클라이언트의 모든 요청을 받은 후 이를 처리할 핸들러에게 넘기고 핸들러가 처리한 결과를 받아 사용자에게 응답 결과를 보여줌
● HandlerMapping (org.springframework.web.servlet.HandlerMapping)
- 어떤 핸들러가 요청을 처리할지에 대한 정보를 알고 있음
● HandlerAdapter (org.springframework.web.servlet.HandlerAdapter)
- 실제 핸들러를 실행하는 역할
- 선택된 핸들러를 실행하는 방법과 응답을 ModelAndView로 변화하는 방법에 대해 알고 있음
● ModelAndView (org.springframework.web.servlet.ModelAndView)
- Controller의 처리 결과를 보여줄 view와 view에서 사용할 값(데이터)을 전달하는 클래스(데이터와 뷰의 이름을 전달)
cf) Model : 데이터만 전달해주는 객체
● ViewResolver (org.springframework.web.servlet.ViewResolver)
- 컨트롤러가 리턴한 뷰 이름을 참고해서 적절한 뷰 오브젝트를 찾아줌
0. DispatcherServlet 설정
- web.xml 이용 : 서블릿 설정파일에서 DispatcherServlet 설정
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>package.mvc.config.WebConfiguration</param-value> <!-- 자바 Config 클래스파일 -->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
1. Configuration객체
- @Configuration 어노테이션 사용 : spring 설정클래스 명시
- @EnableWebMvc : mvc관련 어노테이션을 사용하기 위해 사용
=<context:annotaion-config />, <mvc:annotation-driven />
- @ComponentScan : 명시한 패키지에서 @Controller, @Service, @Repository, @Component가 붙은 클래스를 자동으로 스프링 컨테이너에 등록
= <context:component-scan base-package="package.mvc.controller">
@Configuration
@EnableWebMvc
@ComponentScan("package.mvc.controller")
public class WebConfiguration extends WebMvcConfigurerAdapter {
// @Service를 사용하지 않고 Bean을 직접등록함
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
// @Repository를 사용하지 않고 Bean을 직접등록함
@Bean
public MemberRepository memberRepository() {
return new MemberService();
}
// addResourceHandler처럼 들어오는 URL은 addResourceLocations에서 찾도록 설정
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
}
// ViewResolver 빈등록, 아래 적어놓은 View설정을 config를 통해 설정하는 방법
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/"); // 뷰이름 앞에 붙일 값
resolver.setSuffix(".jsp"); // 뷰이름 뒤에 붙일 값
return resolver;
}
}
- WebMvcConfigurerAdapter : @EnableWebMvc 를 이용하면 기본적인 설정이 모두 자동으로 되지만, 기본 설정 이외의 설정이 필요할 경우 해당 클래스를 상속 받은 후, 메소드를 오버라이딩 하여 구현
※ 스프링 5.0, 스프링부트 2.0 부터는 WebMvcConfigurer를 사용함
2. Controller객체(=Handler)
- @Controller 어노테이션 사용 : spring 설정파일에 <annotation-driven /> 태그추가 or Configuration 클래스에 @EnableWebMvc 어노테이션 추가
- @RequestMapping : Controller내의 메서드에 요청을 맵핑할 패턴을 명시
- Model 객체를 파라미터로 사용하거나 ModelAndView객체를 리턴타입으로 사용
@Controller
Class public MemberController {
@Autowired
MemberService memberService;
@RequestMapping("/memJoin") // get방식일때
// @RequestMapping(value="/memJoin" method="RequestMethod.POST") // post방식일때
public String memJoin(Model model,
@RequestParam("memId") String memId, @RequestParam("memPwd") String memPwd,
@ModelAttribute Member member) {
// String memId = request.getParameter("memId");
// String memPwd = request.getParameter("memPwd");
memberService.memRegister(memId, memPwd);
model.addAttribute("memId", memId);
model.addAttribute("memPwd", memPwd);
return "memJoinOk";
}
@RequestMapping("/memLogin")
public ModelAndView memLogin() {
ModelAndView mav = new ModelAndView();
Member member = memberService.memSearch();
mav.setViewName("memLoginOk");
mav.addObject("member", member);
return mav;
}
}
◆ @RequestParam : HTTP 요청 파라미터를 변수로 받음 (HttpServletRequest request의 getParameter 대신 사용 가능)
ex) @RequestParam("memId") String memId
◆ @PathVariable : @RequestMapping 패턴에 있는 중괄호에 명시된 값을 변수로 받음
ex) @RequestMapping("/user/{id}")
@PathVariable("id") String id
◆ @ModelAttribute : HTTP 요청 파라미터를 객체로 받음 (DTO/VO)
ex) @ModelAttribute Member member
◆ @RequestHeader : HTTP 요청헤더 정보를 가져옴
ex) @RequestHeader("host") String host
◆ @RequestBody : HTTP 요청바디 정보를 가져옴, JSON방식의 정보를 가져올때 사용
ex) @RequestBody String host
◆ @CookieValue : HTTP 요청 쿠키정보를 가져옴
3. Service객체
- @Service 어노테이션 사용
@Service
Class public MemberService {
@Autowired
MemberDao memberDao;
public void memRegister(String memId, String memPwd) {
memberDao.memInsert(memId, memPwd);
}
}
4. Repository객체(=DAO)
- @Repository 어노테이션 사용
@Repository
Class public MemberDao {
public void memInsert(String memId, String memPwd) {
.....
}
}
5. View객체
- 스프링 설정파일에 ViewResolver를 빈으로 등록
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" /> <!-- 뷰이름 앞에 붙일 값 -->
<beans:property name="suffix" value=".jsp" /> <!-- 뷰이름 뒤에 붙일 값 -->
</beans:bean>