※ 동작방식
- DispatcherServlet
- Servlet/JSP에서 사용자 요청이 발생하면 정보를 해석하고, 개발자가 만든 코드를 동작시키는 첫 번째 서블릿
- Spring MVC는 DispatcherServlet을 확대하여 Spring이 가진 기능을 사용하도록 클래스 재정의함
- SpringMVC 프로젝트 환경 조성
1. Dynamic Web Project 생성
2. Maven Project로 변경
[프로젝트 오른쪽 버튼 클릭] - [Configure] - [Convert to Maven Project]
3. Building 후, 라이브러리 설정(pom.xml)
cf) Building -> ctrl+shift+enter
cf) Line 정리 단축키 -> ctrl+shift+f
cf) 자동완성 -> ctrl+space bar
<!-- 라이브러리 버전 관리 -->
<properties>
</properties>
<!-- 라이브러리 셋팅 -->
<dependencies>
</dependencies>
cf) properties: 버전 관리 / dependencies: 라이브러리 세팅
<dependencies> 안에 라이브러리를 찾아서 넣어주자
1) servlet-api
https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api
버전에 맞게 찾은 후, 삽입!
그리고 프로젝트 버전에 맞게 하기 위해 아래와 같이 수정한다.
<!-- 라이브러리 버전 관리 -->
<properties>
<!-- dependency의 버전을 참조할 수 있게 설정 -->
<javax.servlet-version>4.0.1</javax.servlet-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>
</dependencies>
2) jsp-api
3) jstl
4) spring web mvc
3개의 라이브러리도 같은 방식으로 하면 되는데, jstl의 경우 dependency에서 오류가 발생하므로
javax.servlet으로 groupID를 변경해주자
위의 라이브러리 포함된 코드
<!-- 라이브러리 버전 관리 -->
<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.20</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>
제대로 된 건지 확인하려면, 왼쪽 Maven Dependencies 리스트 확인하면 된다.
4. web.xml 수정 / servlet-context.xml 생성
- web.xml: DispatcherServlet 클래스를 Spring에서 제공하는 클래스로 설정
<!-- 현재 웹 애플리케이션에서 받아들이는 모든 요청에 대해 appServlet이라는 이름으로
정의되어있는 서블릿을 사용한다. -->
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- ApplicationContext 설정: Spring MVC로 만든 웹 애플리케이션에 대한 설정
<!-- 요청 정보를 분석해서 컨트롤러를 선택하는 서블릿을 지정한다. -->
<!-- ApplicationContext 설정: Spring MVC로 만든 웹 애플리케이션에 대한 설정 -->
<servlet>
<servlet-name>appServlet</servlet-name>
<!-- Spring MVC에서 제공하고 있는 기본 서블릿을 지정한다. -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- Spring 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>
- RootContext 파일 설정: Spring MVC 프로젝트 수행 시 사용할 Bean들을 정의
<!-- Bean을 정의할 xml 파일을 지정한다. -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/root-context.xml</param-value>
</context-param>
<!-- 리스터 설정(사용자 요청을 발생하면 사용자 정보를 이용해 Bean을 로딩) -->
<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 형식이 아래와 같을 때 filter를 거치게 한다. -->
<url-pattern>/*</url-pattern>
</filter-mapping>
[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>
[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 Annotation을 가지고 있는 클래스들을
Controller로 로딩하도록 한다. -->
<annotation-driven/>
<!-- 스캔한 bean들이 모여있는 패키지를 지정한다. -->
<context:component-scan base-package="kr.co.controller"/>
</beans:beans>
5. Controller 설정
package kr.co.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;
}
}
url 패턴에 따라 콘솔창에 출력되는 내용을 확인할 수 있다.
6. jsp 설정
- 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>
위의 Controller에서 home() 메서드의 리턴값을 jsp 파일을 가리키게 만든다.
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home() {
System.out.println("home");
return "/WEB-INF/views/index.jsp";
}
리턴값으로 나오는 문자열의 prefix와 suffix를 xml로 설정해줄 수 있다.
servlet-context.xml에 추가!
<!-- 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>
7. 정적 경로 설정
[servlet-context.xml] 추가
<!-- 정적파일(이미지, 소리, 동영상, js, css 등) 경로 세팅 -->
<resources mapping="/*" location="/resources/"/>
폴더 위치 생성 후, 이미지 복사하여 지정
* Java로 세팅
- web.xml -> AbstractAnnotationConfigDispatcherServletInitalizer 상속 or WebApplicationInitializer 인터페이스 구현
- root-context.xml -> 상속 없음
- servlet-context.xml -> WebMvcConfigurer 인터페이스 구현
'프로그래밍' 카테고리의 다른 글
Spring MVC 공부(5) (0) | 2022.05.28 |
---|---|
Spring MVC 공부(4) (0) | 2022.05.28 |
Spring MVC 공부(2) (0) | 2022.05.05 |
Spring MVC 공부(1) (0) | 2022.05.01 |
SW 업그레이드에 따른 변경점 (0) | 2022.04.04 |