[데브코스] Spring MVC 1
Updated: Categories: TILW5D2 - DispatcherServlet / JSP / Thymeleaf 에 대해 알아보자.
Spring MVC
Dispatch Servlet
- Front Contoller로써 Servlet을 생성해 요청을 받아 하위 컨트롤러에 분배하는 역할
- HTTP 요청을 핸들러 어댑터를 통해 컨트롤러에 연결시켜준다
View Resolver
- 요청 URL에 알맞는 view로 반환시켜주는 것 (템플릿 엔진 선택 or json response 등등..)
InternalResourceViewResolver
ThymeleafViewResolver
최종 아키텍처
JSP
의존성 설정
- 서블릿과
jstl
을 추가해야함 (서블릿은 전에 추가했으니)
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
App Context 설정
WebMvc
를 사용할 수 있도록 App Context를 설정해줘야 한다.@EnableWebMvc
어노테이션을 달아주고WebMvcConfigurer
를 상속 ->ViewResolver
를 설정해준다.
...
@EnableWebMvc
static class config implements WebMvcConfigurer {
// ViewResolvers -> 템플릿 엔진을 jsp로 지정
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp();
}
...
}
- 그리고
WebApplicationInitializer
에서DispatcherServlet
을 만들고 등록시켜줘야함 - App Context 객체 생성시 그냥 App이 아니라 WebApp으로 생성해준다
- App Context 객체 생성 -> 그걸로
DispatcherServlet
생성 -> 그걸로 서블릿 객체 생성
public class 클래스명 implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext){
var applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.register(AppConfig.class);
var dispatcherServlet = new DispatcherServlet(applicationContext);
var servletRegistration = servletContext.addServlet(서블릿명, dispatcherServlet);
servletRegistration.addMapping("/");
servletRegistration.setLoadOnStartup(1);
}
}
Controller 작성
- 매핑할 URL과 HTTP 메소드를 적어준다
- 데이터에 view(jsp) 이름을 붙여서 반환해줌 -> 해당 jsp 파일에 데이터 바인딩
- model로 사용할 데이터는
Map
으로 전달한다
@Controller
public class 컨트롤러 {
@RequestMapping(value = URL설정, method = RequestMethod.GET)
public ModelAndView 메소드명() {
return new ModelAndView(view이름, 데이터);
}
}
JSP 작성
- 디렉토리
webapp 하위 WEB-INF
에서 작성해야 빌드시 적용됨 - html처럼 사용
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
...
jstl
- JSP내에서 데이터 바인딩 or 자바코드 작성을 가능하게 해주는 문법
- 모델의 key값을
${ key }
이렇게 넣어서 데이터 바인딩 가능 <% %>
태그 사이에서 자바 문법 사용 가능- 아니면 아래처럼
c태그
를 사용할수도 있음
<c:forEach var="i" begin="i" end="10" step="1">
${i}<br>
</c:forEach>
- 다양한 문법이 있겠지만… jsp 개발을 할게 아니므로 PASS
resources
webapp
폴더 하위에resources
폴더를 생성하고, 이 폴더에서 리소스를 관리- 그리고 App Context에
ResourceHandler
를 추가해준다. resources
경로를 설정해준다.
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/resources/");
}
Thymeleaf
의존성 설정
- 추가해주자 ^^
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
- 추가하고 나면 아래 표시한곳에 뭐가 뜨는데 그것도 다 추가해주기
App Context 설정
ViewResolver
에Thymeleaf
를 등록해준다- AppContext Config 내부에서 AppContext가 필요해서
ApplicationContextAware
어노테이션으로 의존성주입~
static class AppConfig implements WebMvcConfigurer, ApplicationContextAware {
ApplicationContext applicationContext;
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
var springResourceTemplateResolver = new SpringResourceTemplateResolver();
springResourceTemplateResolver.setApplicationContext(applicationContext);
// 템플릿 기본 경로,확장자 설정
springResourceTemplateResolver.setPrefix("/WEB-INF/");
springResourceTemplateResolver.setSuffix(".html");
var springTemplateEngine = new SpringTemplateEngine();
springTemplateEngine.setTemplateResolver(springResourceTemplateResolver);
// 템플릿 기본 디렉토리 설정(jsp와 혼용시 필요)
var thymeleafViewResolver = new ThymeleafViewResolver();
thymeleafViewResolver.setTemplateEngine(springTemplateEngine);
thymeleafViewResolver.setOrder(1);
thymeleafViewResolver.setViewNames(new String[]{"views/*"});
registry.viewResolver(thymeleafViewResolver);
}
...
Thymeleaf 작성
- 확장자는 html로 작성함
- 아래 태그를 생성한 후 작성해야한다.
<html xmlns:th="http://www.thymeleaf.org" lang="en">
...
- 자세한 문법은 생략한다.