1. 프로젝트 생성
Maven Project의 Maven web-app archetype으로 프로젝트를 생성한다.
2. 의존성 추가
maven project이기 때문에 pom.xml에서 의존성을 추가한다.
- jsp, servlet, jstl을 사용할 것이기 때문에 관련 의존성을 추가한다.
servlet은 Spring에서 Dispatcher Servlet로 사용되어 frontController 역할을 한다.
<!--jsp jstl servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
- Spring 의존성을 추가한다.
version이 바뀌어도 문제가 되지 않게 하기 위해 ${} 템플릿을 사용해 version 부분을 채운다.
단, 위에서 properties에서 해당 spring 버전을 선언해줘야 한다.
<spring.version>5.2.5.RELEASE</spring.version>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
spring-context: bean context 사용을 위해
spring-webmvc: spring mvc 사용을 위해
3. facet 설정
<installed facet="jst.web" version="3.1"/>
jst.web 버전을 3.1로 바꾼다.
그리고 eclipse 재시작 후 project의 properties에서 project facet에 Dynamic web 버전이 바뀐 것을 확인한다.
4. web.xml 설정
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--web.xml에서 DispatcherServlet 설정하기 -->
<servlet>
<servlet-name>mvc</servlet-name>
<!--아래 servelt을 frontController로 한다 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--Bean -->
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<!--frontController가 읽어야하는 설정 내용 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>kr.or.connect.mvcexam.config.WebMvcContextConfiguration</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--모든 요청이 들어오면 servlet name의 servlet 실행 -->
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
5. Spring MVC 설정
Handler Mapping, Handler Adapter, View Resolver 설정을 완료한다.
package kr.or.connect.mvcexam.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 아래거로 바뀜
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"kr.or.connect.mvcexam.controller"})
public class WebMvcContextConfiguration implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//<url-pattern>/</url-pattern>때문에 모든 요청을 다 받아서 실제 요청에서 해당 URL요청은 /.../에서 찾아요
//이 부분이 없다면 모두 컨트롤러가 가진 RequestMapping에서 요청을 찾으려고 해서 오류를 발생시킴
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(31556926);
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
}
// default servlet handler를 사용하게 합니다.
//맵핑정보가 없는 url 요청은 Spring의 DefaultSerbletHttpHandler가 처리하도록 함
//Spring의 DefaultSerbletHttpHandler는 WAS의 defaultServlet에게 해당 일을 넘김
//WAS는 defaultServlet의 static한 지원을 읽어 보여주게 함
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
//특정 url에대한 요청을 controller 클래스를 작성하지 않고 맵핑하게 해준다.
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
System.out.println("addViewControllers가 호출됩니다. ");
registry.addViewController("/").setViewName("main");
}
//getInternalResourceViewResolver에서 설정해줬기 때문에 위에 있는 main이 WEB-INF-views.main.jsp라는 파일을 찾을 수 있다.
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}
java 8.x 버전이 default가 되면서 interface에 default method가 사용가능해졌기 때문에 추상클래스를 사용할 필요가 없어졌다.
그래서 WebMvcConfigurer 인터페이스를 구현한 WebMvcConfigurerAdapter를 더이상 사용하지 않게 되었다.
dafault method 설명: siyoon210.tistory.com/95
자바의 Default Method (디펄트 메소드)
Default Method 인터페이스는 기능에 대한 선언만 가능하기 때문에, 실제 코드를 구현한 로직은 포함될 수 없습니다. 하지만 자바8에서 이러한 룰을 깨트리는 기능이 나오게 되었는 데 그것이 Default
siyoon210.tistory.com
spring framework annotation: medium.com/@aaaalpooo/%EB%A7%8E%EC%9D%B4-%EC%93%B0%EB%8A%94-spring-framework-annotation-%EC%A0%95%EB%A6%AC-summary-of-annotations-frequently-used-in-spring-framework-935e1c1a4877
참조
'공부 스걱스걱 > 웹' 카테고리의 다른 글
[Spring Security] 스프링 세큐리티 오류 정리 (0) | 2021.11.10 |
---|---|
[Spring Security] 스프링 세큐리티 설정(spring boot 없이) (0) | 2021.11.10 |
[Javascript] 문자열에서 개행문자(\r\n)를 <br> 태그로 바꾸기 (0) | 2021.03.23 |
[Javascript] Ajax (0) | 2021.03.07 |
[웹프로그래밍] WEB API (0) | 2021.02.25 |