당연히 Spring Boot를 쓰거나 프로젝트 템플릿을 내려받아 쓰는게 편할 것이다. 그렇지만 편해지기 이전에 어떻게 프로젝트 설정을 하고, 설정된 프로젝트는 어떻게 켜지는지 알 필요가 있다고 생각한다. Spring관 관련이 적지만 아래의 링크가 도움이 되었다. 아래 링크는 Spring 프레임워크 없이 쌩 Java-웹 표준 사양만 가지고 웹 프로젝트를 동작시키는 것에 대해 잘 설명해주고 있다.
https://www.in28minutes.com/first-java-web-application-with-jsp-and-servlets-in-25-steps
프로젝트를 만들어보자.
1. File > New > Maven Project
- Use default Workspace location- maven-archetype-webapp
- Group Id: 네이밍 스키마를 적용한 고유 도메인 이름. 예: org.apache.maven, org.apache.commons
- Artifact Id: 프로젝트 이름, jar 또는 war 파일의 이름이 된다.
# Group Id와 Artifact Id는 특수문자를 사용하지 않고 가급적 소문자로 작성한다. 예: maven, commons-math
2. Java 버전, Facet 설정 [Optional]
- Properties > Java Build Path > Libraries- Properties > Java Compiler
# pom.xml에서 지정해도 괜찮다. (maven-compiler-plugin)
- 프로젝트 경로 > .settings > org.eclipse.wst.common.project.facet.core.xml
<installed facet="java"/>, <installed facet="jst.web"/> (Dynamic Web Module -> 3.1) 버전 설정.
- File > Restart
- Properties > Project Facets > 표시되는 버전이 xml에 지정한 것과 일치하는지 확인.
3. web.xml - 스키마 버전 세팅 [Optional]
# 버전이 높을수록 사용할 수 있는 태그의 표현 범위는 늘어나겠지만 안해줘도 크게 상관은 없는듯.<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>project name</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
4. Maven Install & edit pom.xml
- Run As > Maven install- dependency와 build 항목에 필요한 설정을 해준다. (web에 일반적으로 쓰이는 pom.xml을 찾아 참고하면 된다.)
# dependency : spring-context, spring-webmvc, ...
# build : maven-eclipse-plugin, maven-compiler-plugin, maven-war-plugin
- Spring Tools > Add Spring Project Nature : 'Spring Elements'를 프로젝트에 추가해준다.
- Maven > Update Project : pom.xml 내용을 프로젝트에 적용해준다.
5. web.xml, servlet-context.xml 설정
- web.xml에 FrontController 역할을 하는 org.springframework.web.servlet.DispatcherServlet을 등록해준다.# DispatcherServlet은 보통 하나만 등록하지만 하나의 프로젝트 내부에서 성격이 다른 여러 개의 서비스를 서빙해야 하는 경우 여러 개를 등록할 수 있다.
# DispatcherServlet의 contextConfigLocation 파라미터에 서블릿(스프링) 관련 context 경로를 잡아준다.
- /WEB-INF/config/spring/*-context.xml과 같이 설정할 수 있다.
<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/config/spring/*-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/api/*</url-pattern> </servlet-mapping>
- /WEB-INF/config/spring/servlet-context.xml을 생성한다. 파일 형식은 Spring Bean Configuration File. 네임스페이스 beans, context, mvc 체크.
- 생성된 servlet-context.xml에 component-scan을 위한 base package를 지정해 준다.
- 애플리케이션 내에서 @Controller, @Component 등 프레임워크에서 제공되는 annotation을 이용하는 것이 일반적이므로 <mvc:annotation-driven />을 선언한다.
- view가 있는 프로젝트라면 view resolver를 설정해준다.
- web.xml에서 encoding filter를 설정해준다. 로그 출력을 위한 log filter, 크로스 도메인간 요청 허용을 위한 cors filter도 필요하면 등록시켜준다.
<filter> <filter-name>CharacterEncodingFilter</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> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
6. applicationContext.xml 설정
- applicationContext.xml을 생성한다. 형식은 Spring Bean configuration File. 네임스페이스 aop, beans, p, tx 체크.- web.xml에서 contextConfigLocation 파라미터의 값이 applicationContext.xml을 가리키도록 한다.
- web.xml에서 listener로 ContextLoaderListener를 선언한다.
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
- applicationContext.xml에 필요한 bean을 등록해준다. ContextLoaderListener가 applicationContext.xml에 선언된 bean을 파싱하고 singleton으로 로드시키는 역할을 하나보다. Application context와 Servlet context가 있고, 사용자는 이 둘에 대한 life cycle을 Spring Framework에 위임하게 되는 셈.
더 적으려다가 아래 링크를 참고하는게 나을 것 같다. :(
https://handcoding.tistory.com/10?category=621283