웹 프로젝트를 하면서, 많은 폴더에 resource 와 소스코드를 보관한다. 이때마다 각 폴더가 무슨역할을 하는지 헷갈려서 이번기회에 정리를 한다.
src/main/java
자바파일이 모여있는 곳이다. 패키지를 분리해서 자바 클래스를 관리.
src/main/resources
자바 클래스에서 사용하는 리소스를 보관하는 곳이다. DB연결을 위한 자원, 의존성 주입(DI)을 위한 xml 파일 등 자바 코드 외 모든 자원을 보관하는 곳이다.
src/test/java
자바파일과 동일한 역할을 하는 곳이지만, Test를 위한 자바코드만을 보관한 ㄴ 곳이다.
src/test/resources
위와 동일하게 테스트를 위한 리소스들을 보관하는 곳이다
src
WEB에 관련된 자원이 담겨있는 루트 폴더이다. 하위 폴더에 웹과 관련된 모든 자원들이 분류되어 있다. main 폴더 안에 모두 들어간다.
src/main/webapp/resources
웹에 필요한 다양한 자원들을 보관하는 곳이자, 사용자가 직접 접근할 수 있는 공간이다. .js
, .css
, .img
파일 등이 보관되며 보통은 Controller 가 요청을 가로채지 않고 바로 접근할 수 있도록 따로 설정해서 사용하는 곳이다.src/main/webapp/WEB-INF
웹에 필요한 코드파일과 컴파일된 파일, 그리고 여러 환경설정 파일들이 보관되는 곳이다. 보안이 중요한 파일들이기 때문에 외부 사용자가 직접 접근할 수 없으며, Controller의 핸들러를 통해 내부적으로만 접근할 수 있는 폴더이다.src/main/webapp/WEB-INF/classes
컴파일 된 파일이 보관되는 곳src/main/webapp/WEB-INF/spring
스프링 환경설정 파일(context)이 보관되는 장소src/main/webapp/WEB-INF/views
JSP, HTML 파일등이 보관되는 장소이다. 이 폴더가 루트(/
) 의 기준점이 된다. 사용자가 직접 입력하고, 컨트롤러가 받아주는 URL이 이 폴더의 구조를 따라간다.src/main/webapp/WEB-INF/spring/root-context.xml
웹과 관련되지 않은 정보들의 메타정보들이 담긴다. 예를 들어, <context:component-scan>
가 들어갈 수 있다.src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
웹과 관련된 정보들의 메타정보들이 담긴다.pom.xml
이는 Project Object Model(POM) 의 약자로, 프로젝트의 전체적 구조를 정의하는 xml 파일이다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- POST 방식의 한글 처리. -->
<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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Processes application requests -->
<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을 등록하여 여러개의 DispatcherServlet을 만들 수 있다.-->
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
web.xml은 설정을 위한 파일이다. WAS가 처음 구동될 때 web.xml을 읽어 웹 애플리케이션을 구성한다. 이때 web.xml
에 DispatcherServlet을 등록해두면, spring이 이를 만들고 관리한다.
<init-param>
을 설정하지 않으면 <servlet-name>-servlet.xml
파일에서 applicationContext의 정보를 load 한다.<url-pattern>
은 Dispatcher Servlet이 처리하는 URL Mapping pattern 을 정의한다.*.do
, /*
, /
등을 많이 사용한다./*
은 tomcat에 있는 기본 web.xml
의 .jsp
를 처리하는 설정파일을 무시해버리기 때문에 /
을 사용하는것이 옳다고 한다.<load-on-startup>1</load-on-startup>
설정시, WAS startup 시점에 초기화 작업을 진행한다.<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Context 설정 파일들을 로드하기 위해 web.xml 파일에 리스너를 설정한다. (ContextLoaderListener) 리스너가 설정이 되면, /WEB-INF/spring/root-context.xml
파일을 읽어서 공통적으로 사용되는 최상위 Context를 생성한다. 그 외의 다른 컨텍스트 파일들을 최상위 어플리케이션 컨텍스트에 로드하기 위해서는 다음과 같은 코드를 작성하면 가능하다<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/root-context.xml
classpath:com/.....[파일경로]/[파일이름].xml
</param-value>
</context-param>