java-school logo
Last Modified 2016.6.24

메이븐을 이용한 Spring 실습

아래 글은 http://spring.io/guides/gs/maven/를 번역한 것입니다.

메이븐 설치

  1. http://maven.apache.org/download.cgi에서 최신 바이너리 파일을 다운로드한다.
  2. 압축을 풀고 생성된 디렉터리를 적당한 곳에 옮긴다.
  3. 메이븐 bin 디렉터리까지의 전체 경로를 Path에 추가한다.
  4. JDK가 설치된 전체 경로를 값으로 하는 JAVA_HOME 환경 변수가 있는지 확인한다. 메이븐은 JAVA_HOME 환경 변수를 참조하기 때문에 없으면 만들어야 한다. (JDK 설치 문서 참조)

명령 프롬프트를 열고 다음 명령으로 메이븐 버전을 확인한다.

C:\ Command Prompt
C:\Users\kim> mvn -v
Apache Maven 3.5.0
Maven home: C:\Program Files\apache-maven-3.5.0\bin\..
Java version: 1.8.0_131, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_131\jre
..

메이븐 프로젝트 생성

메이븐 프로젝트를 생성하는 방법은 두 가지가 있다. 첫 번째는 메이븐 프로젝트 디렉터리 구조(메이븐 프로젝트의 디렉터리 구조는 정해져 있다)와 pom.xml 파일을 직접 만드는 방법이다. 두 번째는 mvn archetype:generate 명령을 사용하는 방법이다.

1. 메이븐 프로젝트 디렉터리 구조와 pom.xml 파일을 직접 만들어 메이븐 프로젝트를 만드는 방법

메이븐 디렉터리 구조 생성

C:\maven\HelloWord를 프로젝트 루트 디렉터리라면, HelloWorld 아래에 다음과 같이 서브 디렉터리를 만든다. (아래에서 맨 끝단의 hello는 생성할 자바 클래스의 패키지 이름이다.)

HelloWorld (프로젝트 루트)
   └── src
        └── main
             └── java
                  └── hello

pom.xml 파일 작성

프로젝트 루트에 pom.xml 파일을 아래와 같이 작성한다.

pom.xml
<?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
                             http://maven.apache.org/maven-v4_0_0.xsd">
                       
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.springframework.gs</groupId>
	<artifactId>gs-maven-initial</artifactId>
	<version>0.1.0</version>
	<packaging>jar</packaging>
	
</project>

아래 두 자바 소스 파일은 hello 디렉터리에 작성한다.

HelloWorld/src/main/java/hello/HelloWorld.java
package hello;

public class HelloWorld {
    public static void main(String[] args) {
        Greeter greeter = new Greeter();
        System.out.println(greeter.sayHello());
    }
}
HelloWorld/src/main/java/hello/Greeter.java
package hello;

public class Greeter {
    public String sayHello() {
        return "Hello world!";
    }
}

메이븐 기본 명령어

다음 명령어를 pom.xml 파일이 있는 위치(프로젝트 루트 디렉터리)에서 명령 프롬프트를 열고 실행한다.

mvn compile

컴파일을 실행하고 컴파일 결과물을 target/classes 폴더에 저장한다. target/classes 폴더는 컴파일이 수행되면서 만들어진다. mvn compile

mvn package

자바 코드를 컴파일하고 테스트를 수행하고 패키지(jar 또는 war)로 묶어서 target 디렉터리에 저장한다. 위 pom.xml 설정대로라면 gs-maven-initial-0.1.0.jar란 파일이 target 디렉터리에 생성된다. mvn package

mvn install

패키징된 jar 파일을 로컬 저장소에 저장한다. mvn install

mvn clean

빌드를 통해 생성된 모든 산출물을 삭제한다. mvn clean

mvn clean compile

위와 같이 중복해서 수행할 수 있다.

mvn exec:java -Dexec.mainClass=hello.HelloWorld

위 명령은 HelloWorld 메이븐 프로그램을 실행한다.

pom.xml에 의존 라이브러리 추가하기

대부분의 애플리케이션이 외부 라이브러리에 의존한다. 우리의 예제도 외부 라이브러리를 사용하도록, HelloWorld.java를 아래처럼 수정한다.

HelloWorld/src/main/java/hello/HelloWorld.java
package hello;

import org.joda.time.LocalTime;

public class HelloWorld {
  public static void main(String[] args) {
    LocalTime currentTime = new LocalTime();
    System.out.println("The current local time is: " + currentTime);

    Greeter greeter = new Greeter();
    System.out.println(greeter.sayHello());
  }
}

mvn compile 을 실행하면 빌드가 실패한다. pom.xml에 의존 라이브러리 설정을 추가하지 않았기 때문이다. pom.xml 파일을 열고 아래와 같이 의존 라이브러리 설정을 추가한다.

pom.xml
<?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
                             http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>org.springframework</groupId>
    <artifactId>gs-maven</artifactId>
    <version>0.1.0</version>
    <packaging>jar</packaging>
    
    <dependencies>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.2</version>
        </dependency>
    </dependencies>
	
</project>

dependency의 하위 엘리먼트로 scope 엘리먼트가 추가 될 수 있다. scope 엘리먼트는 compile(디폴트), provided 또는 test라는 값을 가질 수 있다.

의존성을 추가한 후 mvn compile을 다시 수행하면 성공한다.

2. mvn archetype:generate 명령을 사용하여 메이븐 프로젝트를 만드는 방법

mvn archetype:generate를 사용하면 대화형으로 메이븐 프로젝트를 생성할 수 있다. archetype이란 원형이라는 사전적 의미를 가지는 데, 자바에서는 프로젝트 프로토타입을 뜻한다. 이 방법을 쓰면 메이븐 디렉터리와 pom.xml 파일이 자동으로 생성되며, 또한 다양한 자바 프로젝트의 프로트타입을 얻을 수 있다. C:\maven 디렉터리에서 다음을 실행한다.

C:\ Command Prompt
C:\maven> mvn archetype:generate

아래 화면에서 엔터키를 누르면 maven-archetype-quickstart가 선택된다.

C:\ Command Prompt
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 990: 

아래 화면에서 엔터키를 누른다.

C:\ Command Prompt
Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6:

groupId와 artifactId에 값을 준다. version과 package는 디폴트 값이 있으니 엔터키를 눌러 디폴트 값을 선택한다.

C:\ Command Prompt
Define value for property 'groupId': : org.springframework.gs
Define value for property 'artifactId': : gs-maven-initial
Define value for property 'version':  1.0-SNAPSHOT: :
Define value for property 'package':  org.springframework.gs: :

아래 화면에서 엔터키를 누른다.

C:\ Command Prompt
Confirm properties configuration:
groupId: org.springframework.gs
artifactId: gs-maven-initial
version: 1.0-SNAPSHOT
package: org.springframework.gs
 Y: :

artifactId로 정해준 gs-maven-initial라는 디렉터리가 생기고 이 디렉터리에 pom.xml 파일과 메이븐 디렉터리가 생성된다. (C:\maven\gs-maven-initial이 루트 디렉터리가 된다.)

C:\ Command Prompt
C:\maven>cd gs-maven-initial
C:\maven\gs-maven-initial>

스프링 시작하기 강좌 중 Quick Start 정리

메이븐 프로젝트의 디렉토리를 만든다.

quick-start
   └── src
        └── main
             └── java
                  └── hello

프로젝트 루트(quick-start)에 pom.xml 파일을 만든다. 스프링 프레임워크를 의존 라이브러리 설정에 추가할 때는 http://projects.spring.io/spring-framework/에서 가장 최신 릴리스 버전을 선택한다.

pom.xml
<?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
                             http://maven.apache.org/maven-v4_0_0.xsd">

	<modelVersion>4.0.0</modelVersion>
	<groupId>net.java_school</groupId>
	<artifactId>quick-start</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>quick-start</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.3.9.RELEASE</version>
		</dependency>
		
	</dependencies>
	
</project>

스프링은 빈을 관리하는 빈 컨테이너 기능이 핵심이다. 실습할 예제는 스프링의 빈 컨테이너 기능을 확인하는 예제이다. 위에서 spring-context 의존성을 pom.xml에 추가했다. 메이븐의 의존성 관리 기능은 프로젝트가 A라는 라이브러리에 의존하는데 A는 B라는 라이브러리에 의존한다면, A만의 의존성 설정으로 A뿐 아니라 B 역시 저장소에 저장한다. 따라서 spring-context만 추가했더라도 spring-context가 의존하는 다른 라이브러리 역시 저장소에 저장된다.

명령 프롬프트에서 메모장을 실행해서 아래 소스와 같이 MessageService.java, MessagePrinter.java, Application.java 파일을 /hello 폴더에 생성한다.

C:\ Command Prompt
C:\maven\quick-start\src\main\java\hello>notepad MessageService.java
MessageService.java
package hello;

public interface MessageService {
    String getMessage();
}
C:\ Command Prompt
C:\maven\quick-start\src\main\java\hello>notepad MessagePrinter.java
MessagePrinter.java
package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MessagePrinter {

    @Autowired
    private MessageService service;

    public void printMessage() {
        System.out.println(this.service.getMessage());
    }
}
C:\ Command Prompt
C:\maven\quick-start\src\main\java\hello>notepad Application.java
Application.java
package hello;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
public class Application {

	@Bean
	MessageService mockMessageService() {
		return new MessageService() {
			public String getMessage() {
				return "Hello World!";
			}
		};
	}

	public static void main(String[] args) {
		ApplicationContext context = 
			new AnnotationConfigApplicationContext(Application.class);
		MessagePrinter printer = context.getBean(MessagePrinter.class);
		printer.printMessage();
	}
}

다음 명령을 차례대로 실행하여 프로젝트를 빌드하고 실행한다.

mvn compile
mvn exec:java -Dexec.mainClass=hello.Application

코드상으로는 MessagePrinter는 MessageService는 서로 결합되어 있지 않다. 하지만 스프링 프레임워크가 이들을 묶어준다.

테스트 실행까지 확인했다면 메이븐의 로컬 저장소에 저장된 어떤 라이브러리가 저장되었는지 확인해 보자. 참고로 메이븐의 로컬 저장소는 사용자 폴더 안의 .m2 폴더이다.

C:\ Command Prompt
C:\Users\kim\.m2\repository\org\springframework>dir /w

[spring-aop]  [spring-beans]  [spring-context]  [spring-core]  

[spring-expression]

spring-context가 의존하는 spring-aop spring-beans spring-core spring-expression도 함께 설치된다.

참고