원하는대로

관심분야에 대해 원하는 모든 것을 발행하는 곳

미정 자세히보기

공부 스걱스걱/웹

[웹프로그래밍] Spring MVC 기본 설정

ohsoou 2021. 4. 16. 11:21

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 설정

navigator로 확인 가능

<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 설정

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 이해: blog.naver.com/PostView.nhn?blogId=scw0531&logNo=220988401816&parentCategoryNo=&categoryNo=28&viewDate=&isShowPopularPosts=false&from=postView

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


참조

velog.io/@lacomaco/Spring-MVC-%ED%99%9C%EC%9A%A9

www.boostcourse.org/web316/