2019년 5월 29일 수요일

Spring 3.X 프로젝트 설정하기 (xml 방식)

Spring 버전 3의 프로젝트 설정방법에 대해 알아보기로 한다. 버전 3 이후론 Annotation을 사용해 코드 내에서 대부분의 설정을 할 수 있지만 이번 포스팅에선 xml 설정 방식을 따르기로 한다. IDE는 Eclipse 기준이고 Spring 3.X, Maven, Mybatis를 쓴다고 가정하였다.

당연히 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

댓글 없음:

댓글 쓰기