스프링 MVC
- 스프링 MVC
- Front Controller 패턴에 Spring의 DI를 이용해서 컴포넌트들의 생명주기를 관리할 수 있는 컨트롤러 중심의 웹 MVC 프레임워크
- 일반적으로 도메인 모델이 중요한 역할을 함
- 웹 MVC 프레임워크들은 스프링 MVC처럼 앞단에서 HTTP요청을 처리하는 컨트롤러의 역할 비중이 큼
스프링 MVC 구조
- DispatcherServlet
- 가장 핵심적인 역할
- 요청을 받으면 그 요청을 처리할 수 있는 Handler의 이름을 HandlerMapping에게 물어봄
- HandlerMapping
- 요청 URL을 보고 Handler를 판단
- Handler 실행 전 전처리, 후처리 실행해야 할 인터셉터 목록 결정
- 그 후 DispatcherServlet은 제어권을 Handler로 전달
- Handler
- 응답에 필요한 서비스를 호출하고 응답에서 렌더링해야 하는 View Name을 판단해서 DispatcherServlet에 전송
- ViewResolver
- DispatcherServlet에서 View Name을 받아 응답에 필요한 View를 생성할 수 있도록 함
- View
- ViewResolver에서 만들어진 View에 Model과 컨트롤러를 전달해서 응답을 생성 후 클라이언트에게 반환
스프링 MVC에서 DispatcherServlet을 쓰면 web.xml에 등록하고 요청받은 루트 URL을 매핑하는 것으로 기능을 수행할 수 있다.
스프링 MVC 설정
- 스프링 MVC를 사용하기 위한 의존성
- 스프링 코어
- 스프링 mvc
스프링 MVC 프로젝트 설정
- 스프링 웹 모듈은 스프링 코어 모듈에 의존성을 가지고 있다.
repositories {
jcenter()
}
ext{
javaVersion = '1.8'
springVersion = '4.1.6.RELEASE'
slf4jVersion = '1.7.5'
logbackVersion = '1.0.13'
}
List springLib = [
"org.springframework:spring-core:${springVersion}",
"org.springframework:spring-webmvc:${springVersion}"
]
dependencies {
providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
compile springLib
compile 'org.slf4j:slf4j-api:1.7.7'
testCompile 'junit:junit:4.12'
}
DispatcherServlet 설정
- web.xml
- javaConfig 방식
web.xml
- web-app 루트 태그를 가지고 있다.
- 루트 태그 하위에 리스너, 서블릿 같은 컴포넌트들의 정보를 표기할 수 있다.
- 서블릿 태그에는 DispatcherServlet 클래스의 전체 경로를 등록
- 서블릿 매핑 태그 하위의 서블릿 네임 태그값은 servlet 태그 하위의 servlet-name 태그값과 동일하게 disatcher로 한다.
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
dispatcher-servlet.xml
- 인터셉터, 컨트롤러와 같은 웹 패키지에 해당하는 클래스들의 설정을 지정할 수 있는 파일
- 컨트롤러 클래스를 만들어서 동자시키기 위해서는 컨트롤러 클래스들을 위치시킬 패키지 지정과 URL과 페이지 매핑이 필요
- XML 파일로 구조나 속성을 정의하고 표현하려면 XML 스키마 정의(XSD) 파일을 사용해야 함
- 컨트롤러에서 데이터를 받은 후 리턴할 때 뷰 이름을 지정해서 리턴할 수 있다.
- 이 때 뷰 이름은 view resolver가 처리한다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="info.thecodinglive.controller" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/"/>
<bean class="info.thecodinglive.interceptor.JpubInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
컨트롤러와 뷰
- 스프링 2.5 버전부터 어노테이션 기반 설정이 추가됨
- @Controller, @Service 과 같이 어노테이션을 이용해서 개발을 할 수 있음
@Controller
public class IndexController {
@RequestMapping("/")
public ModelAndView home(){
// return new ModelAndView("home");
ModelAndView mv=new ModelAndView("home");
mv.addObject("title", "Jpub Spring WEB");
mv.addObject("today", new Date().toString());
return mv;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>${title}</title>
</head>
<body>
${today}
</body>
</html>
- 사용은 ${key} 이다.
인터셉터
- 스프링 MVC 모듈에서는 인터셉터를 이용해서 컨트롤러가 요청을 처리하기 전 혹은 처리 후에 대해 로직을 추가할 수 있다.
- 일반적으로 특정 URL에 대해 공통 로직 적용이 필요한 경우에 많이 사용함
만들기
- HandlerInterceptorAdaptor 클래스를 상속받아서 만듦
public class JpubInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle 메소드 실행");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle 메소드 실행");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion 메소드 실행");
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
super.afterConcurrentHandlingStarted(request, response, handler);
}
}
설정
- 인터셉터는 dispatcher-servlet.xml 파일에 인터셉터 태그를 추가해서 설정 가능
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/"/>
<bean class="info.thecodinglive.interceptor.JpubInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
- mapping 태그에는 요청받을 경로를 속성으로 정의할 수 있음
'WebStudy > Spring' 카테고리의 다른 글
정적 자원 관리와 템플릿 엔진 (0) | 2021.07.17 |
---|---|
Spring Boot (0) | 2021.07.16 |
Spring IoC 패턴 (0) | 2021.07.14 |
Servlet 2 (0) | 2021.07.12 |
Servlet 1 (0) | 2021.07.11 |
최근댓글