Spring Legacy MVC Project 만들기
1. 프로젝트 파일 생성
File → New → Project → Project창에서 Jakarta EE 선택 후 오른쪽 부분 작성
Name : 프로젝트명(아래의 Artifact와 동일)
Location : 프로젝트의 경로, 여기선 상위폴더까지 적혀있음
Template : Web application
Application server : 톰캣버전설정, 9.0.90을 기준으로 했음
Language : Java
Build system : Maven
Group : com.project
Artifact : project Name(위에서 작성한 Name)
JDK : Java11
Group은 디폴트값이 com.example이고 Artifact는 위에서 작성한 projact name으로 설정된다
여기서 작성한 것을 바탕으로 프로젝트 베이스 패키지 경로는 group + artifact이 된다. 나는 com.project.myapp
다음 항목에서 Version : Java EE 8 선택
Dependencies는 기존에 다른 Dependencies가 있으면 해제하고 Servlet만 선택한다 이후 Create를 눌러서 생성
여기까지 했으면 우선 톰캣 실행을 해서 원활히 접속 되는지 확인
2. 폴더 구조 수정
기존 프로젝트 구조가 아마 Dynamic Web Project 일텐데 스프링과 디렉토리 구조를 맞춘다. 스프링도 결국 서블릿이니까 큰차이는 없다.
WEB-INF 하위 경로에 각각 views, spring폴더 추가, spring폴더 하위경로에 appServlet폴더 추가
appServlet에 servlet-context.xml 설정파일을 만들고 spring폴더에 root-context.xml 파일을 생성할 예정
여기서 한가지 빠뜨린게 있는데 webapp하위폴더에 resources도 생성해야한다. 아래쪽에 다시 적어둠
3. pom 파일 수정
pom.xml 파일을 수정해야 하는데 이부분은 하나하나 세팅 맞춰간단 생각으로 해보려다가 그냥 기존에 spring legacy project에서 사용하던 pom.xml 파일을 갖다 붙였다..앞으로 메이븐에 dependency 갖다쓸 라이브러리도 많은데 너무 번거로워가지고..
<?xml version="1.0" encoding="UTF-8"?>
<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>com.project</groupId>
<artifactId>myapp</artifactId>
<version>1.0-SNAPSHOT</version>
<name>myapp</name>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<java-version>11</java-version>
<junit.version>5.9.2</junit.version>
<org.springframework-version>5.3.37</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
</build>
</project>
가져다 붙일때 조심해야 할건 일부 버전 설정(스프링 버전, 자바버전, 메이븐 컴파일러 버전 설정)이고 몇몇 라이브러리는 스프링 버전이랑 호환이 안되서 오류가 날수도 있으니 주의
여기선 스프링 버전을 처음엔 5.0.7.RELEASE 사용했는데 나중에 보니까 보안문제로 몇가지 취약점이 있어서 6.1.8 → 5.3.37로 사용했다.
이후에 pom.xml 우측버튼 클릭 Maven → Reload Project → External libraries를 확인 라이브러리가 pom.xml 파일에 추가된 라이브러리가 적용 되었는지 확인
4. 스프링 설정파일 만들기
non-web설정인 root-context.xml 파일, web설정인 servlet-context.xml 파일을 만들건데 아래의 해당 경로에 만든다.
root-context.xml : WEB-INF\spring\root-context.xml
servlet-context.xml : WEB-INF\spring\appServlet\servlet-context.xml
1. 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 https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
</beans>
2. 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 https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<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>
<context:component-scan base-package="com.project.myapp" />
</beans:beans>
servlet-context.xml의 경우 기본적으로 resources 매핑이 /resources/**로 되어있는걸 /** 로 변경했고 한가지 위에서 놓친부분이 있는데 webapp 하위폴더에 resources 폴더를 생성해 줘야한다. resources 폴더에 css파일이나 사이트 구성등에 필요한 정적파일들이 저장된다.
5. web.xml 설정
개별 프로젝트별 web설정파일이라고 보면 된다. 스프링 동작 과정은 아래 참고 필터같은 경우 web.xml에서 실행되는데 나중에 어차피 추가할거 미리 갖다 붙였다..ㅋㅋ
톰캣 ─ 스프링 실행 과정
1. 톰캣 실행
2. web.xml -> ContextLoaderListener -> contextConfigLocation -> root-context.xml
2. DispatcherServlet -> servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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"
version="4.0">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 한글 변환 필터 시작 -->
<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>
6. 로깅설정
log4j src/main/resources 경로에 log4j.xml 파일을 생성한다. 로깅에 관한건 몇가지 라이브러리가 있으니 원하는걸로 사용하면 된다.. 난 기존에 쓰던걸로 사용
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
<!-- Application Loggers -->
<logger name="com.project.myapp">
<level value="info" />
</logger>
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info" />
</logger>
<logger name="org.springframework.beans">
<level value="info" />
</logger>
<logger name="org.springframework.context">
<level value="info" />
</logger>
<logger name="org.springframework.web">
<level value="info" />
</logger>
<!-- Root Logger -->
<root>
<priority value="warn" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
7. 기본파일 생성(Controller , View)
스프링 프로젝트 생성하면 있던 디폴트 컨트롤러, 뷰파일을 만드는 건데 이건 하던 안하던 별 상관이없다. 어차피 이 파일은 체크만 해보고 삭제할테니 설정 이상없이 톰캣 실행 후 잘 열리나만 확인하면 끝
src.main.java.com.project.myapp의 HelloServlet.java, WEB-INF의 index.jsp를 삭제한다
HelloServlet 삭제 후 HomeController 생성
package com.project.myapp;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home";
}
}
index.jsp 삭제 후 webapp\views\ 경로에 home.jsp 생성
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>
Hello world!
</h1>
</body>
</html>
8. 톰캣 서버 설정
1. 상단부분에서 Edit Configurations 클릭
2. Deployment 탭에서 '-' 버튼 클릭 기존 war Artifact 제거
3. '+' 버튼 클릭 → Artifact → myapp:war exploded 클릭해서 추가
4. Application Context를 '/'로 변경
5. Server탭 클릭 후 아래 사항 체크 포트번호는 겹치는게 있을경우 적당히 변경해서 사용(본인이 편하게 설정하면 된다)
VM options은 console창에 한글이 깨질때 utf-8로 인코딩 설정해주는 옵션이다.(vm options를 추가해도 깨지는 경우가 있는데 이건 나중에..)
톰캣 재실행 후 localhost:8080/ 경로로 접속 했을때 해당 경로 페이지 나오면 성공