● Spring MVC 구조 변경 이유
MVC Project를 생성한 이후 기본 구조를 이용해도 딱히 상관은 없지만 구조를 변경 하는 가장 큰 이유는 기독성 부분인거 같다
새로 구성되는 구조는 딱히 정해진 구조도 없어서 그냥 구조를 바꾸면 되고 구조를 바꾼다면 그 경로를 알맞게 web.xml 에서 설정 해주는 것만 유의하면 된다.
● 1. contextConfigLocation 변경
- servlet, context 파일을 이동할 것이다. web.xml 에서 이들의 param-name을 contextConfigLocation이라 한다.
필자는 servlet과 context을 모두 한꺼번에 옮겼지만 context만 옳기는 분들도 많이 있다. 필자는쉽게 찾기
위해서 통쨰로 src - resources 패키지에 넣었다. 어디에 어떻게 넣든 햇갈리지 않고 잘 설정하면 아무 문제 없다.
1 - 1.webapp - WEB-INF - spring 폴더 복사
1-2. src/main/resources에 붙여넣기
1-3. webapp - WEB-INF - spring 폴더 삭제
1-4. xml 이름 변경
servlet-context.xml -> servlet-active.xml
root-context.xml -> context-root.xml
지금은 하나의 파일로만 되어 있지만 나중에는 여러 파일이 추가 될 것이다. 이러한 확장성을 생각하여 특정 폴더안에 있는 설정 파일들을 모두 읽어올 수 있게끔 파일들의 이름을 수정한다. 이렇게 변경해놓으면 서블릿 설정을 변경할 때 한번에 다 불러오기 편하다.
2. servlet 설정 변경
context와 servlet 파일들의 폴더를 이동 하였으니, 이제 경로를 맞춰주자
2.1 기존 web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?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> <!-- 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-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> | cs |
2-2 변경 web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?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>classpath*:spring/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> <!-- 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>classpath*:spring/appServlet/servlet-*.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> </web-app> | cs |
- 9행 : 스프링 설정파일들을 읽어온다. spring 폴더에 context-*.xml인 파일들을 모두 읽어온다. context들을 기능별로 분리하여 한꺼번에 불러오기 위한 것이다. (context-common.xml, context-datasource.xml 등등) 파일들의 이름을 변경한 이유이다. 물론 context-root.xml 파일에 설정을 다 해 놓고 하나만 불러와도 된다. 근데 이렇게 하면 설정파일들을 수정할 때 찾기가 힘들어진다. 그래서 context 기능별로 분리하는 게 좋다.
- 21행 : sping 폴더안의 appServlet 폴더 안에 있는 *-servlet.xml 파일들을 모두 읽어온다. 이것도 마찬가지이다.
이제 context 파일이나 servlet 파일들을 추가할 때 context-XXX.xml 이나 XXX-serlvet.xml로 만들면 자동적으로 설정파일들이 읽어와 진다.
- 28행 : 서블릿에 요청을 할 때, 요청을 전달할 url을 뜻한다. 이 패턴 외의 요청은 허락하지 않는다. *.do를 넣으면 .do로만 요청을 전달한다. Controller의 RequestMapping으로 요청 url을 적는 부분에서 사용할 url의 패턴을 뜻한다. 요청 패턴이 다르면 controller에서 비즈니스 로직을 찾지 못하니 요청 패턴을 잘 기억해둬야 한다. 보통 .do를 많이 쓰는데, 나는 귀찮기 때문에 그냥 / 를 쓴다.
** classpath 경로
프로젝트 우클릭 > properties > Deployment Assembly
위에서 classpath 경로를 확인할 수 있는데,
/src/main/resoucres 에 파일을 생성하여 빌드를 하면 WEB-INF/classes 에 들어감을 나타낸다.
2-3. 서버를 실행하고 오류가 안뜨면 성공
3. index.jsp 추가
프로젝트를 실행하면 home.jsp가 실행된다. 이것은 컨트롤러의 맵핑을 거쳐 실행되는데, 서버를 실행하고 컨트롤러에 들어갔다가 다시 jsp로 가는건 비호율적이고 우리가 제어하기 힘들다. 따라서 서블릿을 통해서 프로젝트가 실행되면 index.jsp가 실행되도록 만들어보자.
3-1 webapp폴더 밑에 index.jsp 추가
** 위치 중요
WEB-INF 밑에 있는 jsp는 보안상 바로 접근할 수 없다. 컨트롤러를 통해(요청패턴을 통해) 접근을 할 수 있다. 하지만 webapp밑에 있는 파일들은 주소만 치면 바로 들어갈 수 있다. 그래서 단순 주소만으로 접근 가능하게 index.jsp를 만들고 그 다음부터 컨트롤러를 통해 접근하게 만드는 것이다
index.jsp
1 2 3 4 5 6 7 8 9 10 11 12 | <%@ 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>안녕하세요 만나서 반갑습니다.</h1> </body> </html> | cs |
3-2. web.xml에 <welcome-file>추가
1 2 3 | <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> | cs |
<webapp></webapp> 태그 안에 아무곳에나 넣어줘도 된다. 필자는 맨 위에 뒀다.
이렇게 설정하면 서버가 실행되면서 web.xml에서 welcom-file을 읽어서 webapp에 있는 index.jsp가 실행된다.
3-3. Home(com.spring.novice 패키지) 삭제 및 home.jsp 삭제
이제 필요없는 걸 삭제 해주자.
3-4. 서버 실행
실행 완료 !!
4. UTF-8 설정
web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <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> | cs |
5. 최종 web.xml 및 디텍토리
web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | <?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>classpath*:spring/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> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 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>classpath*:spring/appServlet/servlet-*.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> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> | cs |
디덱토리 구조
1번 : 개발 소스 폴더
2번 : SQL 디렉토리
3번 : Spring Setting 파일
4번 : css : 스타일시트 js : 자바 스크립트 img : 이미지 폴더
5번 : views : JSP 디렉토리
6. servlet-active.xml 설정
6-1. 기존 servlet-active.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?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="/resources/**" 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.spring.novice" /> </beans:beans> | cs |
6-2. 변경 후 servlet-active.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?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="/resources/**" 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.spring.novice.*.controller" /> </beans:beans> | cs |
7. context-root.xml 설정
7-1 기존 context-root.xml
1 2 3 4 5 6 7 8 9 | <?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> | cs |
7-2 변경 후 contenxt-root.xml
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <!-- Root Context: defines shared resources visible to all other web components --> <context:component-scan base-package="com.spring.novice.*.service"></context:component-scan> </beans> | cs |
8. pom.xml 설정하기
8-1. 기존 pom.xml
8-2. 변경 후 pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | <?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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.spring</groupId> <artifactId>novice</artifactId> <name>Novice</name> <packaging>war</packaging> <version>1.0.0-BUILD-SNAPSHOT</version> <properties> <java-version>1.8</java-version> <org.springframework-version>5.0.7.RELEASE</org.springframework-version> <org.aspectj-version>1.6.10</org.aspectj-version> <org.slf4j-version>1.6.6</org.slf4j-version> </properties> <dependencies> <!-- Spring --> <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>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</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> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <additionalProjectnatures> <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> </additionalProjectnatures> <additionalBuildcommands> <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand> </additionalBuildcommands> <downloadSources>true</downloadSources> <downloadJavadocs>true</downloadJavadocs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <mainClass>org.test.int1.Main</mainClass> </configuration> </plugin> </plugins> </build> </project> | cs |
이걸로 기본적인 프로젝트 셋팅이 완료 되었다. 이제 프로젝트를 시작해보자 !!
'웹개발 > 설정' 카테고리의 다른 글
interceptor 설정하기 (0) | 2022.09.17 |
---|---|
Validator 설정 (0) | 2022.09.16 |
Oracle SQL을 사용하여 마이비트스(Mybatis) 연동하기 (0) | 2022.09.13 |
Spring MVC Project 구조 분석 (0) | 2022.09.13 |
Spring Tool Suite 3(STS) Tomcat 연동하기 (0) | 2022.09.13 |