[IntelliJ] Spring MVC, Maven 프로젝트 설정 방법

시작하기에 앞서..

해당 포스트에서는 스프링에 대한 이론적인 설명은 작성하지 않았습니다. 이론적인 부분은 훌륭한 참고 서적이 많기 때문에 해당 서적을 구입하여 반복적으로 학습하는 것을 추천해 드립니다. 저와 마찬가지로 많은 초보자가 스프링 설정에서 많은 어려움을 겪는다고 생각하여 제가 공부하고 설정한 방식을 최대한 자세하게 작성하는 데 집중하였습니다. 개인적으로 이론은 한 번에 익히지 못할뿐더러 직접 코드를 작성해가면서 이해하는 것이 가장 효과적이라고 생각합니다. 하지만, 소스 코드를 작성하기도 전에 설정 부분에서 막혀버리면 생각보다 큰 좌절감이 다가옵니다. 코드 한 줄이라도 작성해볼 수 있도록 프로젝트 생성과 설정 방법에 관해 설명하였습니다.

[포스트에서 사용된 환경]
- 운영체제: macOS Mojave
- 도구: IntelliJ IDEA ULTIMATE
- 프레임워크: Spring MVC + Maven
- 데이터베이스: Oracle
- 서버: Tomcat

인텔리J에서 스프링 프로젝트를 설정하는 방법은 다양합니다. 하지만 설정 순서의 차이와 인텔리J에서 자동으로 설정해주는 부분을 수동으로 직접 설정하는 차이일 뿐입니다.

데이터베이스의 경우 Oracle을 사용하였지만 다른 데이터베이스 또한 설정 방식이 비슷하고 해당 포스트에서는 설명하지 않은 MyBatis와 같은 데이터베이스를 위한 프레임워크 등 다양한 프레임워크와 라이브러리가 존재합니다. 본격적인 프로젝트 개발을 시작하게 된다면 효율적인 다양한 설정 방법과 방식이 존재합니다. 설정 방법을 차근차근 이해하면서 따라 한다면 설명하지 않은 부분도 추가로 설정하여 이용하실 수 있습니다.

 

[1] Maven 프로젝트  생성하기

[그림 1.1] IntelliJ 실행

IntelliJ를 실행 후 Create New Project를 클릭해주세요.

 


 

[그림 1.2] Maven 프로젝트 생성

New Project 목록에서 Maven을 클릭하고 Project SDK에서 자신이 사용할 JDK 버전에 맞게 선택해주세요.

Next를 클릭해주세요.

 


 

[그림 1.3] GroupId, ArtifactId 설정

GroupId는 자신의 프로젝트를 식별해주는 고유 아이디입니다.

프로젝트에서 컨트롤하는 도메인 이름과 동일하게 입력해주세요.

 

ArtifactId는 버전 정보를 생략한 이름(jar)입니다.

프로젝트 이름과 동일하게 입력해주세요.

 

Next를 클릭해주세요.

 


 

[그림 1.4] Project name 설정

앞에서 설정한 ArtifactId와 동일하게 프로젝트 이름을 입력해주세요.

Finish를 클릭해주세요.

 


 

[그림 1.5] Maven 프로젝트

Enable Auto-Import를 클릭하면 메이븐 프로젝트 생성이 완료된거예요.

 

 

[2] Spring Framework 설정하기

[그림 2.1] 스프링 프레임워크 설정하기

루트 디렉토리 SpringMavenProject에서 우측 마우스를 클릭 후 Add Framework Support....를 클릭해주세요.

 


 

[그림 2.2] Spring MVC 선택

Add Frameworks Support 목록에서 Spring MVC (4.3.18.RELEASE)를 선택하고 OK를 클릭해주세요.

IntelliJ에서는 기본값으로 Spring 4.3 버전을 제공하고 있습니다,

 


 

[그림 2.3] web 디렉토리 자동 추가

web 디렉토리와 파일들이 자동으로 생성된 걸 확인할 수 있습니다.

관련 설정 IntelliJ Eclipse
빈(bean) 설정 applicationContext.xml root-context.xml
내부 웹 관련 처리 작업 설정 dispatcher-servlet.xml servlet-context.xml
톰캣(tomcat) 구동 관련 설정 web.xml web.xml

 

 

[3] Tomcat 설정하기

[그림 3.1] Add Configuration... 클릭

우측 상단 툴바에서 Add Configuration...을 클릭해주세요.

 


 

[그림 3.2] 톰캣 설정 화면

Run/Debug Configurations 창에서 좌측 상단 +를 클릭하여 Tomcat Server->Local를 클릭해주세요.

 


 

[그림 3.3] 톰캣 Fix 설정

Fix 버튼을 클릭해주세요.

 


 

[그림 3.4] 톰캣 루트 설정

Deployment 화면으로 이동되면 Application context/로 입력해주세요.

 


 

[그림 3.5] 톰캣 설정 완료

톰캣(tomcat) 설정이 완료되었습니다.

 

 

[4] Lombok Plugin 설치하기

Lombok 라이브러리는 getter/setter, toString(), 생성자 등을 자동으로

생성하여 반복적인 코드를 제거하므로 코드 라인 수를 줄여 가독성을 높여주고

생산성 향상에 큰 도움이 됩니다.

 


 

 

[그림 4.1] Plugins 화면

command + , (Ctrl+Alt+S) 단축키를 이용하여

Preferences(Settings) 창으로 이동 후 Plugins를 클릭해주세요.

 


 

[그림 4.2] Lombok 검색

검색 창에 Lombok을 입력 후 해당 플러그인을 설치해주세요.

[그림 4.2]는 이미 설치되어서 활성화된 상태입니다.

 

 

[5] Database 설정하기

다양한 데이터베이스를 설정할 수 있습니다.

저는 Oracle Database를 이용하여 설정하는 방법을 알려드리도록 하겠습니다.

 

☛ 오라클 데이터베이스 설치 방법

☛ MySQL 데이터베이스 설치 방법

 


 

[그림 5.1] 오라클 홈페이지

JDBC 설치를 위해 오라클 홈페이지로 접속 후 자신의 오라클 데이터베이스 버전에 맞는 드라이버를 클릭해주세요.

저는 Oracle Databases 11g Release 2 (11.2.0.4) drivers를 클릭하도록 하겠습니다.

 


 

[그림 5.2] ojdbc6.jar 다운로드

Accept License Agreement를 클릭 후 ojdbc6.jar를 클릭하여 다운로드해주세요.

다운로드가 완료되었으면 IntelliJ 화면으로 이동해주세요.

 


 

[그림 5.3] ojdbc 라이브러리 설정

command + ; (Ctrl+Alt+Shift+S) 단축키를 이용하여 Project Structure 창으로 이동해주세요.

좌측 상단에 + 버튼을 클릭 후 Java를 클릭해주세요.

 


 

[그림 5.4] ojdbc6.jar 추가

다운로드한 ojdbc6.jar 파일을 선택 후 Open을 클릭해주세요.

 


 

[그림 5.5] 모듈 선택 화면

OK를 클릭해주세요.

 


 

[그림 5.6] ojdbc6 라이브러리 추가 완료

라이브러리에 정상적으로 ojdbc6가 추가되었습니다.

 

 

[6] pom.xml 파일 설정

[그림 6.1] pom.xml 설정

pom.xml 파일에서 프로젝트 설정, 라이브러리 의존성 설정, 빌드 설정을 할 수 있습니다.

기본적인 부분에 대해서만 설정할 것이며 프로젝트를 진행하면서 필요한 라이브러리는 상황에 맞게 추가해주세요.

 


 

[그림 6.2] pom.xml 라이브러리 의존성 설정

아래의 코드를 <project> ... </project> 태그 사이에 입력해주세요.

 

    <properties>
        <java-version>1.8</java-version>
        <org.springframework-version>4.3.18.RELEASE</org.springframework-version>
        <org.aspectj-version>1.6.10</org.aspectj-version>
        <org.slf4j-version>1.6.6</org.slf4j-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${org.springframework-version}</version>
            <exclusions>
                <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>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${org.aspectj-version}</version>
        </dependency>

        <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.17</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>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </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>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <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>
        </plugins>
    </build>

 

 


 

[그림 6.3] pom.xml에 추가한 라이브러리

command + ; (Ctrl+Alt+Shift+S) 단축키를 이용하여 Project Structure 창으로 이동해주세요.

목록에서 Artifacts를 클릭 후 Output Layout->Available Elements의 라이브러리를 전부 더블클릭해주세요.

 


 

[그림 6.4] Artifacts lib 추가

더블클릭한 라이브러리들이 프로젝트 lib 디렉토리에 정상적으로 추가되었습니다.

 

 

[7] log4j.xml 파일 설정하기

[그림 7.1] 로그 파일 설정하기

로그를 남기기 위해 자반 기반 로깅 유틸리티인 Log4j를 사용하겠습니다.

Log4j를 사용하기 위해서는 log4j.xml 파일을 생성해서 설정을 해주어야 합니다.

 src/main/resources 디렉토리에 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/">

	<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>

	<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="info" />
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>

 

 

[8] Database 연동 테스트

[그림 8.1] JDBC 테스트 코드 작성

오라클 데이터베이스가 정상적으로 연결이 되었는지 확인하는 테스트 코드를 작성해보도록 하겠습니다.

데이터베이스 서버가 실행되어 있어야 하고, jdbc 라이브러리가 프로젝트에 추가되어있어야 합니다.

src/test/java 디렉토리에 JDBCTest.class 파일을 생성 후 아래 코드를 입력해주세요.

 

import lombok.extern.log4j.Log4j;
import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;

import static org.junit.Assert.fail;

@Log4j
public class JDBCTest {
    static {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void connection() {
        try(Connection conn = DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:XE", "system", "oracle")) {
            log.info(conn);
        } catch (Exception e) {
            fail(e.getMessage());
        }
    }
}

 


 

[그림 8.2] JDBC 테스트 코드 실행

control+shift+R (Ctrl+Shift+F10) 단축키를 이용하여 테스트 코드를 실행해주세요.

그림처럼 결과창에 log가 출력되었다면 정상적으로 데이터베이스가 연결된 거예요.

 

 

[9] Spring MVC - Controller 테스트

[그림 9.1] web.xml 파일 설정

MVC2 방식의 Controller가 정상적으로 실행되는지 확인하기 위해서 관련 파일을 설정하도록 하겠습니다.

먼저 web.xml 파일에서 <url-pattern> ... </url-pattern> 태그 사이를 /로 수정해주세요.

 


 

[그림 9.2] HelloController.class 생성

src/main/java 디렉토리에 com.whitepaek.controller 패키지를 생성해주세요.

그리고 해당 패키지에 HomeController.class 파일을 생성하고 아래 코드를 입력해주세요.

 

package com.whitepaek.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/home/*")
public class HomeController {

    @GetMapping("test")
    public @ResponseBody String homeTest() {
        return "Spring + Maven";
    }
}

 


 

[그림 9.3] dispatcher-servlet.xml

dispatcher-servlet.xml 파일에 아래 코드를 추가해주세요.

 

<context:component-scan base-package="com.whitepaek.controller" />

 


 

[그림 9.4] 프로젝트 실행

모든 설정이 끝났습니다.

위에서 테스트 코드를 실행하였기 때문에 프로젝트 실행 전 톰캣으로 설정을 확인하고

control + R (Shift+F10) 단축키를 이용하여 프로젝트를 실행해주세요.

 


 

 

[그림 9.5] 브라우저 확인

브라우저에 URL을 localhost:8080/home/test로 입력하여 정상적으로 결과가 나오는 걸 확인할 수 있습니다.

이것으로 Spring MVC + Maven + Tomcat + OracleDB 프로젝트 생성 및 설정에 대한 설명이 끝났습니다.

 

 

[10] Tomcat, OracleDB 포트번호 충돌 해결

[그림 10.1] 포트 충돌로 인한 브라우저 접속 화면

Tomcat과 OracleDB는 기본값으로 8080 포트를 사용합니다.

그렇기 때문에 충돌이 되면 결과창에 에러 메시지와 함께 브라우저에 Sign in 모달 창이 나오는 것을 확인할 수 있습니다.

 


 

[그림 10.2] 톰캣 포트번호 수정

[그림 3.3]에서 설명했던 톰캣 설정 창으로 이동 후 HTTP port 번호를 8080을 제외한 다른 포트번호로 수정해주세요.

설명에서는 8081 포트로 수정하겠습니다.

 

포트번호를 수정하였으면 다시 톰캣을 실행 후 브라우저 URL에 localhost:8081/home/test와 같이

수정한 포트로 다시 접속하면 정상적으로 결과가 출력되는 것을 확인할 수 있습니다.

 

다른 방법으로는 Oracle 데이터베이스 포트 번호를 바꿔줘도 됩니다.

 

 

 

Reference

 

댓글