IT 강의 정리/윤재성의 스프링 MVC5

[섹션0][Spring MVC 소개 및 프로젝트 세팅] 1~9강

Nellie Kim 2022. 10. 21. 18:38
728x90

1. Spring MVC 소개

 서블릿API를 기반으로 만들어졌으며 스프링이 가지고 있는 다양한 기능들을 이용해서 웹 어플리케이션을 개발할 수 있도록 만들어진 웹 프레임워크이다. Spring MVC에는 웹 어플리케이션 개발을 위한 다양한 라이브러리가 포함되어 있다.

공식이름은 Spring Web MVC이지만 보통 Spring MVC라고 부른다. 본 과정은 스프링 프레임워크5버전으로 진행된다.

SpringMVC 개발방식은 SpringFramework와 동일하게 xml을 이용한방법과 자바어노테이션을 이용한 방법을 사용한다.

Servlet / JSP  +  Spring MVC Library

2. 설치할 프로그램

스프링MVC 프로젝트 자체가 자바언어 기반의 웹 어플리케이션을 개발하는 서블릿/JSP 프로젝트에, 

스프링에서 제공하는 여러가지 기능들을 사용할 수 있는 jar파일로 구성되어 있는 스프링MVC라이브러리를 추가 시킨 후,

거기에 포함되어 있는 클래스를 이용해서 프로젝트를 진행하게 된다.

필요한 프로그램 : JDK(8이상) ,이클립스, 아파치톰캣9.0, 오라클데이터베이스11g

3. JDK 설치 및 설정

JDK 는 Java Development Kit로, 자바 언어 기반의 프로젝트를 수행하기 위해서 반드시 필요한 개발 도구.

https://oracle.com - Download - Java - Java(JDK) for Developers - Java SE 8u231(자바8버전) - JDK download

4. Apache Tomcat 설치

아파치 톰캣은 , 자바기반의 웹 어플리케이션 (서블릿, JSP) 프로젝트를 할 때 사용하는 웹서버이다.

tomcat.apache.org - tomcat9 다운로드

5. 이클립스 설치 및 개발환경 구축

https://eclipse.org 에서 다운로드

1. 인코딩 UTF-8 설정

2. 웹브라우저 '크롬'설정

3. 서버 '톰캣9' 설정

4. JSP File 'UTF-8'설정

 

이제 , 테스트 파일(index.jsp)을 만들어 보자. File- New - Dynamic Web Project.  아래와 같이 크롬에서 잘 실행 되었다.

6. MVC의 기본개념

어떤 소프트웨어를 개발을 할 떄, 데이터가 입력이 되면 그걸  처리해서 사용자에게 전달하는 구조로 만들어진다.

내부적인 애플리케이션 로직(데이터처리 부분(Model))과 , 사용자 인터페이스를(눈에 보이는 화면(View))을 분리하기 위하여 만드는 것이 목적이다.

데이터 처리 부분과 눈에 보이는 부분이 같은 화면에 만들어져 있다면, 나중에 화면부분을 변경을 할 때에도 모든 코드를 수정해야 하는 불편함이 있다. 유지보수가 어렵다. 

 

사용자의 요청이 발생하면, 이 요청을 컨트롤러(서블릿으로 처리)가 받아들인다. 사용자 요청 정보에 따라서 데이터처리를 하는 수많은 모델중 하나를 선택하여 이 모델(일반 클래스로 처리)이 가지고 있는 메소드를 호출하여 데이터를 처리한다. 

완료가 되면 이 데이터를 (JSP로 처리)로 변환하여 사용자에게 보여준다.

 

Model

시스템의 비즈니스 로직을 포함하고 애플리케이션의 상태를 나타내는 데이터 계층.

프리젠테이션 레이어와 무관하며 컨트롤러는 모델 레이어에서 데이터를 가져와서 뷰레이어로 보낸다.

View

UI형식의 응용프로그램 출력을 나타낸다. 컨트롤러가 가져온 모델데이터를 표시하는데 사용된다.

Controller

View와 Model간의 인터페이스 역할을 한다.

View계층에서 요청을 받고 필요한 유효성검사를 포함하여 요청을 처리한다. 요청은 데이터처리를 위해 모델계층으로 추가 전송되고, 일단 처리되면 데이터는 컨트롤러로 다시 전송된 후 View에 표시된다.

이제 다시 index.jsp파일을 만들어보자. 아파치톰캣기반의 서블릿,JSP프로젝트는 이제부터 사용자가 주소만 치고 들어가도 index.jsp가 자동으로 요청이 된다. index.jsp에서 바로 포워딩 되는 형태이다.

 

아래와 같이 index.jsp파일에 작성해주면, 주소만 치고 들어갔을때 바로 main.mvc로 이동되도록 만들었다. 

아직 이것에 대한 요청을 받아들이는 것을 만들지 않아서 404에러가 뜬다.

이제 .mvc가 들어가있는 모든 요청을 받아들이는 컨트롤러(서블릿)를 만들어보자.

아래와 같이 *. mvc를 써줘서 주소창에 .mvc로 끝나는 주소이면 모두 반응하도록 해준다.

아무것도 뜨지 않는다

이번에는 요청한 주소를 가져오도록 컨트롤러를 만들어 보자. 

주소만 치고 들어오면,

→ index.jsp가 요청이되고  index.jsp에서 바로 main.mvc를 요청하여  HomeController가 반응(*.mvc)하고, 이 컨트롤러의 doGet메소드가 호출되어 주소를 받아와  콘솔에 출력해준다.

아래처럼 주소를 가져와서, if문으로 분기시킨다. 이렇게 요청에 따라서 분기에 따라서 처리하는 것이 컨트롤러의 역할!!

우측하단 사진처럼, url에서  main.mvc를 지우고 test1.mvc를 입력하면 콘솔창에 'test1 요청'이 출력된다.

이번에는 콘솔에 출력하지 말고, 해당 뷰를 찾아서 보여주는 작업을 해보자.

컨트롤러에서 지정해줬던 jsp들을 모두 만들기
실제 나타나는 화면

 

이때, 처리할 것이 있다면?

main.jsp에 get방식으로 데이터를 넘겨줘보자! 

HomeController에 파라미터데이터 추출하는 계산식 삽입하기. 이 부분이 Model부분이다.

이때 파라미터는 항상 String값으로 받으므로 int로 변환해줘야 한다.

 

test1.jsp에 result를 출력하는 코드 작성하면 아래와 같이 출력이 된다.

그런데, 보통 이런 모델부분을 컨트롤러에 만들지는 않는다. 너무 길어지면 불편해지기 때문이다.

보통은 모델클래스를 따로 만들고, 그 클래스의 메소드를 컨트롤러에서 호출해서 반환받는 방식으로 작성한다.

그렇게 만들어보자!

일반Class생성한 후 아래와 같이 메서드 작성하기

test2.jsp에도 result값 호출할 코드 만들면, url에 result값이 정상적으로 출력 된다.

컨트롤러에 모델부분을 작성 했을 때보다 훨씬 보기 쉽고 간단해졌다.

7. 프로젝트 세팅

본격적으로 스프링MVC를 살펴보자!

스프링MVC는 서블릿/JSP프로젝트를 만든 후에, 스프링MVC 라이브러리(jar파일)를 집어 넣고, 여기서 제공되는 다양한 클래스를 이용하여 작업을 한다.

먼저, 라이브러리 먼저 세팅 한 후, 스프링 MVC에서 제공하는 개발 방법에 따라서 프로젝트를 세팅하고 작업을 한다.

최종 세팅이 완료가 되면, 다음 프로젝트부터는 파일을 복사해서 넣기만 하면 된다.

스프링MVC의 동작방식

이전에 요청이 발생하게 되면, 컨트롤러가 요청을 받아들여서 if문으로 분기해서 작업을 했었다.

그런데 해당 컨트롤러가 먼저 반응하기 전에, 아파치 톰캣이 관리하고 있는 서블릿 하나가 먼저 반응한다.

제일 먼저 사용자 요청 정보를 받아들여서, 그 요청 정보를 분석 한 후에 어떤 컨트롤러를 동작시킬 것인가 를 결정하는 서블릿이 있는데, 그 서블릿을 DispatcherServlet 이라고 한다.

스프링 MVC같은 경우에는 아파치톰캣에서 제공하고 있는 기본적으로 제공하는 디스패쳐서블릿을 스프링에서 제공하는 디스패쳐서블릿으로 변경(재정의)하는 것부터 시작한다. 

위 그림을 보면, 스프링 DispatcherServlet이 요청을 받고 분석을 한뒤에 ,

우리가 만들어 놓은 적당한 컨트롤러를 선택해서 작업을 한다. 작업이 다 끝나면 JSP로 포워딩이 된다.

포워딩 작업은 ViewResolver가 담당한다. 뷰리졸버에게 어떤 JSP를 View로 사용하겠습니다. 라고 전달하면, 뷰리졸버가 해당 JSP파일을 처리한 후 사용자에게 전달한다.

일단, 먼저 해야하는 DispatcherServlet클래스를 Spring MVC로 재정의 해야 한다.

Spring MVC를 위한 라이브러리를 직접 내려 받아 세팅해줘도 되지만, 본 강좌에서는 Maven을 사용한다. 

설정방식은 xml이용방식, java코드이용방식이 있다. xml먼저 해보자.

그 후에 pom.xml에 라이브러리를 설정하자. servlet-api, jsp-api, jstl, springWebMVC 이렇게 4가지 설정하자.

공통 부분 세팅

File - New - Dynamic Web Project 로 SpringMVCStep1 만든후, 

마우스우클릭 - Configure - Convert to Maven Project 로 변경해주면, Maven project로 변경된다. pom.xml도 생긴다.

이제 만들어진 pom.xml에 라이브러리를 설정하자. 

servlet-api, jsp-api, jstl, springWebMVC 이렇게 4가지만 설정해주자.

https://mvnrepository.com/ 에서 검색해서 pom.xml에 붙여넣기.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
						https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>SpringMVCStep1</groupId>
	<artifactId>SpringMVCStep1</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.1</version>
				<configuration>
					<release>11</release>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>3.2.3</version>
			</plugin>
		</plugins>
	</build>
	<!-- 라이브러리 버전관리-->
	<properties>
		<javax.servlet-version>4.0.1</javax.servlet-version>
		<javax.servlet.jsp-version>2.3.3</javax.servlet.jsp-version>
		<javax.servlet.jsp.jstl-version>1.2</javax.servlet.jsp.jstl-version>
		<org.springframework-version>5.3.23</org.springframework-version>
	</properties>

	<!-- 라이브러리 세팅-->
	<dependencies>
		<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>${javax.servlet-version}</version>
			<scope>provided</scope>
		</dependency>

		<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>${javax.servlet.jsp-version}</version>
			<scope>provided</scope>
		</dependency>

		<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>${javax.servlet.jsp.jstl-version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>


	</dependencies>
</project>

8. XML로 세팅하기

마찬가지로, ynamic Web Project 로 SpringMVCxml 만든후, 우클릭 - Configure - Convert to Maven Project 로 변경

 

Servers - Tomcat - web.xml 들어가보면, 다음과 같이 설정되어있다.

url이 / 이면 default란 이름의 서블릿을 사용하고, url이 *.jsp나 *.jspx이면 jsp란 이름의 서블릿을 사용한다고 정의되어있다.

우리는 지금 만든 웹 어플리케이션에 대해서 모든 요청은 스프링 MVC구조를 이용을 할 것이다.

먼저 default란 이름의 서블릿을 찾아 올라가보자. 아래와 같이 설정되어있다. 

즉, 모든 주소요청에 대해서 default란 이름으로 정의된 서블릿을 쓰겠다라는 것인데,

클래스는 org.apache.catalina.servlets.DefaultServlet 으로 정의되어 있다.

바로 이 디폴트서블릿이 아파치톰캣에서 정의한 최초로 요청을 받아들여서 그 요청을 분석하는 서블릿이다!

이 디폴트서블릿은 수집된 요청정보를 분석해서, 개발자가 만든 컨트롤러로 코드의 흐름을 이동시켜주는 역할을 한다.

이것을 스프링MVC가 가지고 있는 디스패쳐서블릿으로 변경하는것이 가장 먼저 해야 할 일이다!

스프링MVC와 관련된 파일은 모두 webapp폴더 안에 만들어 줘야 한다.

webapp폴더안에 들어있는 파일들은 웹브라우저가 파일이름이나 경로만 알면 직접 주소치고 들어가 요청을 할 수가 있다. 그런데 WEB-INF에 파일을 만들게되면 웹브라우저가 요청을 할 수가 없다.

그래서 브라우저에 공개되면 안되기 때문에 일반적으로 WEB-INF폴더 안에 폴더를 만들어 작업한다.

 

1) web.xml을 WEB-INF폴더에 만들자. 

파일명은 반드시 web.xml이 되어야 한다. 아파치톰캣 서버가 실행이 될 때, 각각 웹어플리케이션이 가지고 있는 WEB-INF의 web.xml파일을 찾아서 자동으로 로딩하기 때문에 파일명은 반드시 web.xml 이어야 한다.

그 외의 스프링MVC 관련된 파일들은 경로부터 파일의 이름까지 자유롭게 해도 된다.

 

2-1) 톰캣의 web.xml의 'web-app version'을 복사하여 WEB-INF의 web.xml에 붙여넣는다.

2-2) 톰캣의 web.xml의 'servlet-mapping'을 복사하여 WEB-INF의 web.xml에 붙여넣기. 이름을 appServlet으로 변경

2-3) 톰캣의 web.xml의 'default'서블릿을 복사하여 WEB-INF의 web.xml에 붙여넣기. 이름을 appServlet으로 변경하고 <init-param>부분 삭제하고,  클래스의 이름도 스프링MVC가 제공하고 있는 클래스의 이름으로 변경하기

이 클래스가 잘 세팅되어져 있는지 확인하는 방법은

스프링MVC의 디스패쳐서블릿은 기본적으로 제공되는 디폴트서블릿 클래스를 확장해서 만든 것이기 때문에, 서블릿JSP도 잘 받아들여서 잘 동작을 시킨다.

webapp에서 index.jsp파일을 만들고 실행해보자. 정상적으로 실행이 되면 클래스가 잘 지정이 된 것이다.

그런데, 콘솔창에 아래와 같이 예외가 발생했다고 오류메세지가 뜨는데,

Context란 프로그래밍에서 어떠한 작업을 하기위해 필요한 정보가 담겨져 있는 곳이다.

아래의 오류메시지는 위에서 설정한 appServlet을 못찾겠다는 오류메시지인데, 

(서블릿이름)-servlet.xml 이란 이름으로 찾게 되는데, 이 파일은 스프링MVC를 전체적으로 설정을 하는 파일이다.

이 xml파일은 처음 스프링 배울때, 빈들을 정의하고 자동으로 패키지를 스캔했던 그 xml파일이다.

그때처럼 여러가지 빈들을 정의하고 사용해도 되지만, 지금 여기서는 스프링MVC를 위한 빈들만을 정의하고 세팅한다.

따로 필요한 빈들을 따로 다른xml파일을 정의해서 사용하면 된다. 

만약에, 다른사람의 프로젝트를 열어봤을때 web.xml에 appServlet만 지정되어있다면, WEB-INF폴더안의 appServlet-servlet.xml을 열어 내용을 확인하여 MVC프로젝트의 구조를 파악할 수 있다.

위에서 설정한 appServlet을 못찾겠다는 오류메시지

여기에서는 새롭게 세팅을 해보자.

2-4) 새로운 폴더(config)를 만들어서 xml을 정의해보자.

config폴더 안에 빈들을 정의할 root-context.xml과 스프링MVC설정을 위한 servlet-context.xml을 만들기

2-5) web.xml에 ApplicationContext설정, RootContext파일 설정, 파라미터 필터 설정하기

최종적으로 만들어진 WEB-INF/web.xml 은 아래와 같다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0" 
	xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee                       
						http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
						
	<!-- 현재 웹 애플리케이션에서 받아들이는 모든 요청에 대해 appServlet이라는 이름으로 정의되어 있는 서블릿을 사용하겠다. -->
	<servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <!-- 요청 정보를 분석해서 컨트롤러를 선택하는 서블릿을 지정한다. -->
    <servlet>
    	<!-- DispatcherServlet을 appServlet이란 이름으로 등록(스프링MVC에서 제공하는 기본서블릿 지정) -->
        <servlet-name>appServlet </servlet-name>
        <servlet-class>
        	org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <!-- contextConfigLacation의 초기화 파라미터값을 지정(스프링MVC설정을 위한 xml파일 지정) -->
        <init-param>
        	<param-name>contextConfigLocation</param-name>
        	<param-value>/WEB-INF/config/servlet-context.xml</param-value>
        </init-param>
        <!-- 톰캣과 같은 컨테이너가 웹 어플리케이션을 구동할때 이 서블릿을 함께 실행하도록 설정 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <!-- Bean을 정의할 xml파일을 지정한다. -->
    <context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>/WEB-INF/config/root-context.xml</param-value>
    </context-param>
    
    <!-- 리스너설정(사용자요청이 발생하면 해당 빈들을 로딩) -->
    <listener>
    	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <!-- 파라미터 인코딩 필터 설정 -->
    <filter>
    	<filter-name>encodingFilter</filter-name>
    	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    	<init-param>
    		<param-name>encoding</param-name>
    		<param-value>UTF-8</param-value>
    	</init-param>
    	<init-param>
    		<param-name>forceEncoding</param-name>
    		<param-value>true</param-value>
    	</init-param>
    </filter>
    
    <filter-mapping>
    	<filter-name>encodingFilter</filter-name>
    	<url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

3) root-context.xml 파일 설정하기 

아래와 같이 기본세팅한 후, 나중에 필요할 때 여기에 빈들을 작성해 주면 된다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://www.springframework.org/schema/beans
							http://www.springframework.org/schema/beans/spring-beans.xsd">
							
</beans>

4) servlet-context.xml 파일 설정하기

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
			 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			 xmlns:beans="http://www.springframework.org/schema/beans"
			 xmlns:context="http://www.springframework.org/schema/context"
			 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">
			 					 
	<!-- 스캔한 패키지 내부의 클래스 중 Controller 어노테이션을 가지고 있는 클래스들을 Controller로 로딩하도록 한다 -->
	<annotation-driven/>
	
	<!-- 스캔할 bean들이 모여있는 패키지를 지정한다. -->
	<context:component-scan base-package="kr.co.softcampus.controller"/>
	
	<!-- Controller의 메서드에서 반환하는 문자열 앞 뒤에 붙힐 경로 정보를 셋팅한다. -->
	<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>
	
	<!-- 정적파일(이미지, 사운드, 동영상, JS, CSS 등등) 경로 셋팅 -->
	<resources mapping="/**" location="/resources/"/>
	
			 
</beans:beans>

5) 컨트롤러 생성하기

Java Resources - src - HomeController.java생성

여기서 @Controller가 붙어있는 클래스들을 모두 컨트롤러로 등록을 하고, 

@RequestMapping에서 해당 value값이 붙어있는 url을 받았을때 해당 메소드를 호출한다.

package kr.co.softcampus.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {

	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home() {
		System.out.println("home");
		return null;
	}
	
	@RequestMapping(value = "/test1", method = RequestMethod.GET)
	public String test1() {
		System.out.println("test1");
		return null;
	}
}

6) 뷰 생성하기

WEB-INF/ views폴더 안에 index.jsp 만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Hello Spring MVC</h1>
</body>
</html>

7) 정적파일(이미지, 사운드, 동영상 등) 삽입하기.

이미지가 저장될 폴더를 생성해준다. webapp/ resources/ image폴더생성후, 원하는 이미지파일 넣고

index.jsp파일에서 이미지를 불러온다.

실행하면 아래와 같이 화면에 출력된다.

파일 구조 확인하기.

여기까지 xml세팅이 완료가 되었다. 세팅을 혼자 할 수 있을 때까지 반복해서 실습을 하자.

9. Java로 세팅하기

xml로 세팅하는 것과 얻을 수 있는 결과는 동일하다.

web.xml로 세팅했던 것을 AbstractAnnotationConfigDispatcherServletInitializer을 상속받거나 WebApplicationInitializer 인터페이스를 구현하면 되고, 

root-context.xml 은 그냥 빈을 정의하는 xml이었기 때문에 상속이 필요없고,

servlet-context.xml은 WebMvcConfigurer 인터페이스를 구현하면 된다.

마찬가지로  SpringMVCJava 다이나믹프로젝트생성 - configure - convert to Maven 으로 변환하기.

 

1) web.xml을 SpringConfigClass.java로 구현하기

WebApplicationInitializer 인터페이스를 구현해보자.

아래와 같은 폴더를 만든다. 

web.xml → SpringConfigClass.java

servlet-context.xml ServletAppContext.java

root-context.xml → RootAppContext.java 

SpringConfigClass를 WebApplicationInitializer 인터페이스를 구현하여 오버라이딩 및 추가기능을 구현하자.

public class SpringConfigClass implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    // Spring MVC 프로젝트 설정을 위해 작성하는 클래스의 객체를 생성한다.
    AnnotationConfigWebApplicationContext servletAppContext = new AnnotationConfigWebApplicationContext();
    servletAppContext.register(ServletAppContext.class);

    // 요청 발생 시 요청을 처리하는 서블릿을 DispatcherServlet으로 설정해준다.
    DispatcherServlet dispatcherServlet = new DispatcherServlet(servletAppContext);
    ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", dispatcherServlet);

    // 부가 설정
    servlet.setLoadOnStartup(1);
    servlet.addMapping("/");

    // Bean을 정의하는 클래스를 지정한다.
     AnnotationConfigWebApplicationContext rootAppContext = new AnnotationConfigWebApplicationContext();
     rootAppContext.register(RootAppContext.class);

     // 리스너 설정
     ContextLoaderListener listener = new ContextLoaderListener(rootAppContext);
     servletContext.addListener(listener);

     // 파라미터 인코딩 설정
     FilterRegistration.Dynamic filter = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class);
     filter.setInitParameter("encoding", "UTF-8");
     filter.addMappingForServletNames(null, false, "dispatcher");
}
}

2) servlet-context.xml을 ServletAppContext.java 로 작성하기

// Spring MVC프로젝트에 관련된 설정을 하는 클래스(xml세팅시 servlet-context.xml)
@Configuration
// Controller 어노테이션이 세팅되어 있는 클래스를 Controller로 등록한다.
@EnableWebMvc
// 스캔할 패키지를 지정한다.
@ComponentScan("kr.co.softcampus.controller")
public class ServletAppContext implements WebMvcConfigurer{
	// Controller의 메서드가 반환하는 jsp의 이름 앞뒤에 경로와 확장자를 붙여주도록 설정한다.
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		// TODO Auto-generated method stub
		WebMvcConfigurer.super.configureViewResolvers(registry);
		registry.jsp("/WEB-INF/views/",".jsp");
	}
	
	// 정적 파일의 경로를 매핑한다.
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		// TODO Auto-generated method stub
		WebMvcConfigurer.super.addResourceHandlers(registry);
		registry.addResourceHandler("*//").addResourceLocations("/resources/");
	}
}

3) root-context.xml을 RootAppContext.java 로 작성하기

package kr.co.softcampus.config;

import org.springframework.context.annotation.Configuration;

// 프로젝트 작업시 사용할 Bean을 정의하는 클래스
@Configuration
public class RootAppContext {

}

파일구조 확인하기.

비교하기

- web.xml

 

- SpringConfigClass.java (WebApplicationInitializer 인터페이스 구현)

 

- SpringConfigClass.java (AbstractAnnotationConfigDispatcherServletInitializer 상속)

 

파일구조 비교하기.

좌측이 xml로 설정한 구조이고, 우측이 java로 세팅한 구조이다.

xml에서 web.xml이 사라지고 SpringConfigClass가 생겼고, 

config파일에 있었던 root-context.xml, servlet-context.xml이 RootAppContext.java, ServletConfigClass.java로 변경되었다.

 

 

출처 : [인프런] 윤재성의 만들면서 배우는 Spring MVC 5