Spring 프로젝트 초기 설정하기

자욱·2020년 9월 3일
3
post-thumbnail
post-custom-banner

개요

이클립스에서 Spring Legacy Project를 생성하고 초기 설정을 완료하는 과정을 기록한다.
이클립스에 Spring Tools 3(Add-on for Spring Tools 4..) 이상 버전을 설치한 뒤 진행한다.

1. 프로젝트 생성

  1. 이클립스의 Project Explorer(좌측의 폴더 트리) 빈 공간에 우클릭, 또는 상단 메뉴의 File을 누른 다음, new - Project 선택.
  2. Spring - Spring Legacy Project를 선택하고 Next를 누른다.
  3. 원하는 프로젝트 이름을 설정한 뒤, Spring MVC Project 선택. Next를 누른다.
  4. 기본 패키지 이름을 설정한다. 만들고자 하는 사이트 이름을 거꾸로 쓰는 경우가 많다.
    (예: zawook.github.io라면, io.github.zawook)
  5. Finish 버튼을 누르면, 프로젝트가 생성된다.
    ※ Spring Project를 처음 생성하는 경우, 추가 구성 요소를 설치하기 위해 시간이 조금 필요하다. 이클립스 화면 우측 하단에 Building workspace 상태바를 확인하고, 모든 설치가 끝날 때까지 다른 작업을 진행하지 않고 기다리는 것을 추천한다.)

2. 프로젝트 기본 세팅

스프링 프로젝트에 이용할 도구들의 버전을 설정한다.

  1. 프로젝트 이름에 마우스 우클릭을 하고, Properties를 선택한다.
  2. 메뉴의 Project Facets을 선택한 뒤, Configuration에서 Dynamic Web Module, Java, JavaScript에 체크한다.
  3. Dynamic Web Module 버전을 4.0으로, Java 버전을 1.8로 설정한다.
  4. 우측 탭에서 Runtimes 선택, Apache Tomcat v9.0에 체크하고 Apply를 누른다.
    ※ 톰캣 버전이 8.5라면 Dynamic Web Module 버전을 3.1로 설정하도록 한다.
  5. 좌측 메뉴에서 Java Compiler를 선택, Enable project specific settings에 체크하고, JDK Compliance에서 1.8 버전을 선택한다. (이미 되어 있는 경우가 많다.)

3. web.xml 설정

web.xml 파일의 기본설정을 진행한다.

  1. 프로젝트 폴더 트리에서, src/main/webapp/WEB-INF/web.xml 파일을 연다.
  2. XML version을 3.1로 설정한다.
    (web-app version 부분, xsi:schemaLocation 끝부분)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" 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_3_1.xsd">
  1. UTF-8 인코딩 필터를 추가한다.
    </servlet-mapping> 아래에 다음 코드를 추가한다.
<!-- UTF-8 관련 파라미터 설정 -->
<filter>
	<filter-name>encodingFilterUTF8</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>encodingFilterUTF8</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
  1. JAVA Beans 관련 context 파라미터를 추가한다.
    위의 코드 바로 아래에 다음 코드를 추가한다.
<!-- beans 관련 설정 -->
<context-param>
	<param-name>spring.profiles.active</param-name>
	<param-value>dev</param-value>
</context-param>
<context-param>
	<param-name>spring.profiles.default</param-name>
	<param-value>dev</param-value>
</context-param>
<context-param>
	<param-name>spring.liveBeansView.mbeanDomain</param-name>
	<param-value>dev</param-value>
</context-param>

4. pom.xml 설정 (1)

프로젝트 루트의 pom.xml 파일을 열고 maven 관련 설정을 진행한다.

  1. 상단의 <properties> 태그 내에 적절한 버전을 입력해 준다.
<properties>
	<java-version>1.8</java-version>
	<org.springframework-version>5.2.8.RELEASE</org.springframework-version>
	<org.aspectj-version>1.9.6</org.aspectj-version>
	<org.slf4j-version>1.7.30</org.slf4j-version>
</properties>
  1. 하단의 <plugins> 에서, maven-eclipse-plugin 버전을 수정해 준다.
<plugin>
	<artifactId>maven-eclipse-plugin</artifactId>
	<version>2.10</version> ...
  1. maven-compiler-plugin 버전과 configuration 설정을 수정해 준다.
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>3.8.1</version>
	<configuration>
		<source>${java-version}</source>
		<target>${java-version}</target> ...
  1. exec-maven-plugin 버전을 수정해 준다.
<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>exec-maven-plugin</artifactId>
	<version>3.0.0</version> ...

5. pom.xml 설정 (2)

자바 서블릿 관련 의존성을 다시 설정한다.

  1. <!-- Servlet --> <dependency> <groupId>javax.servlet</groupId> ... </dependency> 부분을 삭제한다.

  2. 삭제한 부분에 Maven Repository를 검색하여 다음 도구들을 추가한다.

    • spring-context-support
    • javax.servlet-api
    • javax.servlet.jsp-api
    • jstl-api
    • taglibs-standard-impl

    ※ 예시 코드

<!-- java servlet 관련 -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>4.0.1</version>
	<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
	<groupId>javax.servlet.jsp</groupId>
	<artifactId>javax.servlet.jsp-api</artifactId>
	<version>2.3.3</version>
	<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.web/javax.servlet.jsp.jstl -->
<dependency>
	<groupId>org.glassfish.web</groupId>
	<artifactId>javax.servlet.jsp.jstl</artifactId>
	<version>1.2.5</version>
</dependency>	
<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl -->
<dependency>
	<groupId>org.apache.taglibs</groupId>
	<artifactId>taglibs-standard-impl</artifactId>
	<version>1.2.5</version>
</dependency>
  1. 추가로 필요한 라이브러리를 의존성 영역에 설정한다.
  • lombok
<!-- lombok -->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.12</version>
	<scope>provided</scope>
</dependency>
  • MySQL, MyBatis 관련
<!-- MySQL connector, MyBatis -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.21</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.5.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1 -->
<dependency>
	<groupId>org.bgee.log4jdbc-log4j2</groupId>
	<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
	<version>1.16</version>
</dependency>
<!-- Spring JDBC, MyBatis -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>2.0.3</version>
</dependency>
  1. 기본 설정되어 있는 log4j 의존성을 최신 버전으로 수정한다.
    • log4j
      (<!--Logging --> 부분을 찾도록 하자.)
<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.17</version>
  1. 단위테스트 관련 junit 의존성을 최신 버전으로 수정하고, spring-test 패키지를 추가한다.
    • junit
<!-- Test -->
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.13</version>
	<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
	<version>${org.springframework-version}</version>
</dependency>

6. log4j.xml 설정

log4j와 Slf4j 관련 설정을 진행한다.

  1. src/main/resources/log4j.xml 파일을 연다.

  2. 로그 출력 형식과 출력될 로그 종류를 설정한다.

    ※ 예시 코드
    (logger 중에, 기본 패키지 이름을 설정해야 하는 부분은 직접 수정한다.)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- 콘솔 출력 -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <!-- 로그 출력 패턴 -->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5p] %C{1}.%M(%F:%L) %m%n" />
        </layout>
    </appender>

    <!-- 파일로 기록되는 로그 -->
    <appender name="rollingFile" class="org.apache.log4j.RollingFileAppender">
        <!-- 생성위치 -->
        <param name="file" value="log/web.log" />
        <param name="Append" value="true" />
        <!-- 로그 파일 사이즈 -->
        <param name="MaxFileSize" value="20mb" />
        <!-- 최대 생성 파일수 -->
        <param name="MaxBackupIndex" value="10" />
        <!-- 로그 출력 패턴 -->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5p] %C{1}.%M(%F:%L) %m%n" />
        </layout>
    </appender>

    <!-- 날짜별 에러 로그 -->
    <appender name="errorFile" class="org.apache.log4j.DailyRollingFileAppender">
        <!-- 에러 로그만 기록 -->
        <param name="Threshold" value="ERROR" />
        <!-- 생성위치 -->
        <param name="File" value="log/error.log" />
        <!-- 하루에 하나씩 날짜 이름으로 생성됨 -->
        <param name="Append" value="true" />
        <param name="DatePattern" value="'.'yyMMdd" />
        <!-- 로그 출력 패턴 -->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5p] %C{1}.%M(%F:%L) %m%n" />
        </layout>
    </appender>

    <!-- Application Loggers -->
    <!-- 기본 패키지 하위의 모든 로그 출력 -->
<!-- <logger name="이곳에 기본 패키지 이름을 설정하고 주석을 제거합니다.">
        <level value="debug" />
    </logger>
-->

    <!-- DATABASE 연동 관련 로그 설정 시작 -->
    <logger name="org.apache.ibatis">
        <level value="DEBUG" />
    </logger>
    <logger name="jdbc.sqlonly">
        <level value="INFO" />
    </logger>
    <logger name="jdbc.sqltiming">
        <level value="OFF" />
    </logger>
    <logger name="jdbc.audit">
        <level value="OFF" />
    </logger>
    <logger name="jdbc.resultset">
        <level value="OFF" />
    </logger>
    <logger name="jdbc.resultsettable">
        <level value="DEBUG" />
    </logger>
    <logger name="jdbc.connection">
        <level value="ERROR" />
    </logger>
    <logger name="log4jdbc.debug">
        <level value="ERROR" />
    </logger>
    <!-- DATABASE 연동 관련 로그 설정 끝 -->

    <!-- Root Logger -->
    <root>
        <appender-ref ref="console" />
        <appender-ref ref="rollingFile" />
        <appender-ref ref="errorFile" />
    </root>

</log4j:configuration>
  1. 단위테스트 진행 시에도 로그를 확인하기 위해, src/test/resources/log4j.xml 파일도 설정해 준다. (위의 main 로그 설정과 동일하게 작성해도 좋다.)

7. log4jdbc.log4j2.properties 추가

jdbc 관련 로그 기록을 위한 설정 파일을 추가한다.

  1. log4j.xml 파일이 저장된 경로에, log4jdbc.log4j2.properties 파일을 생성한다.
  2. 빈 파일 내부에 다음 코드를 입력하고 저장한다.
log4jdbc.auto.load.popular.drivers=false
log4jdbc.drivers=com.mysql.cj.jdbc.Driver
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

log4jdbc.debug.stack.prefix=sql
log4jdbc.sqltiming.warn.threshold=0
log4jdbc.sqltiming.error.threshold=0
log4jdbc.dump.booleanastruefalse=false
log4jdbc.dump.fulldebugstacktrace=false
log4jdbc.statement.warn=false
log4jdbc.dump.sql.select=true
log4jdbc.dump.sql.insert=true
log4jdbc.dump.sql.update=true
log4jdbc.dump.sql.delete=true
log4jdbc.dump.sql.create=true
log4jdbc.dump.sql.addsemicolon=false
log4jdbc.trim.sql=true
log4jdbc.trim.sql.extrablanklines=true
log4jdbc.suppress.generated.keys.exception=false
  • src/main/resources/ 내에 저장하면 OK.
    단위테스트를 위한 log4j 파일이 있는 위치에도 복사해 주면 좋다. (src/test/resources/)

8. jsp 파일 생성 기본설정 수정

  1. 상단 메뉴의 Window 클릭 - Preferences 열기

  2. 좌측 트리에서 Web-JSP files-Editor-Templates 선택

  3. 템플릿 목록에서 New JSP File(html 5)를 선택하고, Edit을 클릭한다.

  4. 아래의 코드를 붙여넣기한다.
    ※ JSP 파일 상단에 자바 코드 블록을 넣었을 때 공백이 생기는 것을 방지, 인코딩을 UTF-8로 설정하는 소스코드.

<%@ page language="java" contentType="text/html; charset=${encoding}"
    pageEncoding="${encoding}"%>
<%@ page trimDirectiveWhitespaces="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="${encoding}">
<title>JSP Title</title>
</head>
<body>
${cursor}
</body>
</html>
  1. Apply and Close.

  2. src/main/webapp/WEB-INF/views/home.jsp 파일 내용도 수정해 준다.

    ※ 예시 코드

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page trimDirectiveWhitespaces="true" %>
<html>
<head>
	<title>Home</title>
	<meta charset="utf-8" />
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  The time on the server is ${serverTime}. </P>
</body>
</html>

9. 프로젝트 구동 확인

  • 프로젝트 이름에 우클릭, Run as - Run on Server 선택.
    (※ 개별 파일을 선택한 채 Run을 시도하면, 경로 문제로 404 에러가 뜨니 주의.)

  • 설정 중간중간에 파일을 저장할 때마다 프로젝트를 실행해 보는 것을 추천한다.
    (에러 발생 위치를 쉽게 파악하기 위해서이다.)

  • 웹브라우저에 다음과 같은 화면이 나온다면 성공.
    결과 확인

plus. 추가 환경 설정

필요한 경우 src/main/webapp/WEB-INF/appServlet/servlet-context.xml 파일을 수정한다.
모든 수정 코드는 </beans:beans> 앞에 위치하도록 한다. (=beans:beans 태그 안에 있으면 OK)

  • 리소스 매핑 위치 수정
    (views/assets 폴더를 만들어 주자.
    또는 원하는 리소스용 폴더를 추가하고 경로를 맞춰 준다.)
<!-- <resources mapping="/resources/**" location="/resources/" /> -->
<resources mapping="/assets/**" location="/WEB-INF/views/assets/" />
  • 스케줄러 추가
    (관련 패키지 경로도 생성해 주자.)
<!-- 스케줄링 어노테이션 선언 -->
<task:annotation-driven />
	
<!-- 스케줄러로 동작할 객체 생성 -->
<beans:bean id="scheduleJob" class="기본 패키지 경로.scheduler.Scheduler" />
<!--  생성한 스케줄러 객체에 대한 작업 스케줄 지정 -->
<!-- method 이름을 지정하고 cron값을 수정하여 원하는 타이밍에 스케줄러를 동작시킨다.-->
<!-- task:scheduled 태그를 여러 개 생성하여 여러 개의 스케줄러를 동시에 지정할 수도 있다.-->
<task:scheduled-tasks>
	<task:scheduled ref="scheduleJob" method="everySeconds" cron="* * * * * ?" />
</task:scheduled-tasks>
  • 인터셉터 추가
    (관련 패키지 경로도 생성해 주자.)
<!-- 인터셉터 -->
<interceptors>
	<interceptor>
		<mapping path="/**" />
		<beans:bean id="appInterceptor" class="기본 패키지 경로.interceptor.AppInterceptor" />
	</interceptor>
</interceptors>
  • 컨트롤러, 서비스 구현체 스캔
    (관련 패키기 경로도 생성해 주자.)
<!-- 컨트롤러나 서비스의 구현체가 포함되어 있는 패키지 -->
<context:component-scan base-package="기본 패키지 경로.controllers" />
<context:component-scan base-package="기본 패키지 경로.service.impl" />
profile
"What Do You Do with a B.A. in Korean?"
post-custom-banner

1개의 댓글

comment-user-thumbnail
2021년 10월 20일

정리 잘 해놓으셨네요! 제 프로젝트 셋팅 하면서 velog 작성하는데 참고 했습니다. 그래서 글 하단에 링크 넣었습니다 :) 혹시 싫으시다면 말씀해주세요! 잘 보고 갑니다.

답글 달기