본 포스팅은 스프링 스터디에서 진행하는 내용을 학습하며 정리한 것입니다.
잘못된 부분이 있거나 보충이 필요한 부분이 있다면 많은 조언 부탁드립니다 : )
1. Maven Project 생성하기
[New Project] → Maven 선택 후 Next
프로젝트 이름 작성, 위치 설정 후 Finish
GroupId는 프로젝트를 식별하는 값으로 보통 도메인을 반대로 시작하여 작성
ArtifactId는 버전없는 jar파일 이름으로 프로젝트 이름과 동일하게 작성
version은 해당 프로젝트의 버전
프로젝트 생성 후 pom.xml에서 설정값을 변경할 수 있다.
기본 프로젝트의 구조
2. Spring MVC 추가하기
프로젝트 우클릭 후 [Add Framework Support] 선택
Spring MVC 선택 후 Download를 선택하여 OK
Download로 생성 시 dispatcher-servlet.xml, applicationContext.xml이 자동 추가되어 편리하다.
다운로드가 완료되면
프로젝트 구조에서 Web부분이 자동으로 추가된 것을 확인할 수 있다.
3. pom.xml 설정 및 스프링 관련 설정
디폴트로 설정되어 있는 값은 아래와 같다.
Dependencies 설정
properties에 필요한 부분을 설정하고, Dependencies를 추가한다.
스터디에서 사용하는 프로젝트 가이드를 따라 다음과 같이 설정해주었다.
<?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>mvc</artifactId>
<name>spring-mvc-ms001</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.8</java-version>
<org.springframework-version>5.2.3.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.6</source>
<target>1.6</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>
현재 변경한 구조는 스터디에서 사용하고 있는 프로젝트 구조를 따른다. (STS)
기존의 web 디렉토리를 main 디렉토리 하위에 webapp으로 리펙토링한다.
- webapp/resources : css, js, img 등 정적 소스가 위치하는 디렉토리
- webapp/WEB-INF/spring : spring 관련 설정 파일이 위치하는 디렉토리
- webapp/WEB-INF/views : jsp 파일이 위치하는 디렉토리
webapp으로 리펙토링할 때, [Project Structure] → [Modules]에서 webapp의 경로를 재설정해준다.
web.xml 설정
xml파일의 경로 설정과 dispatcher url 경로를 설정한다.
<?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">
<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>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
despatcher-sevlet.xml 설정
mvc 관련 설정을 추가한다.
<?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.mvc" />
</beans:beans>
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.spring.mvc">
<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>
4. Tomcat 서버 연결하기
프로젝트를 실행하기 위해 Tomcat Server를 연동할 것이다.
https://tomcat.apache.org/download-90.cgi
해당 사양에 맞게 Tomcat 서버를 다운로드 받아
[Run] → [Edit Configurations]에서 +로 추가하여 tomcat Server Local을 선택한다.
톰캣이 설치된 디렉토리를 설정한다.브라우저와 포트를 설정할 수 있다.
Disployment에서 Application context를 "/"로 설정해주었다.
기본 설정으로 되어 있는 경우 http://localhost:8080/프로젝트명/home.jsp로 접근해야 하는데
기본 루트로 변경하면 http://localhost:8080/home.jsp로 접근할 수 있다.
한글이 깨지는 경우
[Help] → [Edit Custom VM Options]
파일에서 마지막줄에 Encoding 방식을 UTF-8로 설정해준다.
-Dfile.encoding=UTF-8
5. Controller 추가하기
@Controller
public class HomeController {
@RequestMapping(value = "/test", method = RequestMethod.GET)
@ResponseBody
public String test() {
return "Hello";
}
}
모든 설정이 끝났음에도 불구하고 404 에러가 발생하였을 때,
프로젝트명.iml 파일에서 아래의 내용을 지우면 된다.
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
마무리
Spring boot을 만들어준 개발자들께 정말 감사함을 많이 느끼게 되었다.
Spring Lagacy Project를 생성하고 설정하는데만 하루를 꼬박 보냈다.
아직 구조에 대해 깊이 이해하지 못하여 하나하나 찾아 가면서 수정하고 고쳐나갔다.
프로젝트 설정을 완료한 후 404 에러가 발생하여 해결하는데 시간을 많이 소비했다.
아직까지 .iml 파일이 컴포넌트들의 경로값이 들어있는 파일인건 알겠는데
여기서 componet 설정을 삭제했을 왜 작동하는지. 없으면 안되는건지는 아직까지 잘 모르겠다.
프로젝트를 진행하면서 더 알아가보도록 하자.
'Spring boot' 카테고리의 다른 글
[Spring Boot] JPA 조회 작업 findById(), getOne()의 차이 (0) | 2022.03.29 |
---|---|
[Spring Boot] JPA Caching 적용하기 (0) | 2022.03.21 |
[Spring Boot] PasswordEncoder.mathes() 암호화된 패스워드 비교 (0) | 2022.03.21 |
[Spring Study Group] Spring MVC 요청 경로/클래스 레벨/경로 패턴 / Http 메서드 매핑설정 (0) | 2021.11.07 |
@Controller, @RestController 어노테이션 차이 (2) | 2021.10.15 |