Spring 프로젝트 생성
Spring Framework를 “Spring Tool Suite"등을 사용하여, Apache Maven 프로젝트 생성에서 배포까지 해보도록 하겠다. 우선 어떻게 프로젝트를 만들고 실행하는지, 그 기본부터 설명한다.
Spring Framework와 STS
“Spring Framework” 이름 정도는 Java 프로그래머라면 누구라도 들어 본 적이 있을 것이다. 하지만 “특히 서버 개발에 강력한 프레임워크이다"정도는 들었어도, 구체적인 이야기는 의외로 잘 모르는 사람도 많다.
그 가장 큰 이유는 Spring Framework의 거대하기 때문이다. Spring Framework는 하나의 프레임워크가 아니다. 많은 프레임워크의 집합체이다. 모든 프레임워크의 토대가 되는 것, 그 위에 구축되는 범용적인 것, Web이나 데이터베이스 등 특정 용도에 특화된 다른 프레임워크와의 다리 역할을 …… 어쨌든 많은 프레임워크가 Spring Framework에 있다. 따라서 전체 그림이 희미 애매 모호한 느낌이되어 버리는 것이다.
앞으로 Spring Framework를 배우려는 사람은 먼저 “모든 토대가 되고 있는 기술"에서 이해하고 가는 것이 좋다. 그리고 그 다음은 데이터베이스 액세스와 Web의 MVC 응용 프로그램 개발 등 자신의 개발에 즉시 사용할 수 있는 분야의 프레임워크를 배워 보길 바란다. 그 이외의 것은 일단 뒤로 미루고, 우선 순위를 붙이지 않으면 기억하기 어려울 것이다.
그런데,이 Spring Framework로 개발을 할 경우, 먼저 머리에 넣어두고 싶은 것은 “전용 개발 도구의 준비"이다.
Spring Framework의 개발사(미국 Pivotal)는 Spring Framework를 이용한 개발을 위한 전용 도구를 제공하고 있다. “Spring Tool Suite (STS)“라고 불리는 것으로, Eclipse를 기반으로 전용 플러그인을 결합하여 만들어 졌다.
Spring Framework 사용한 프로그램은 다수의 라이브러리를 필요에 따라 조합해서 준비해야 한다. 이를 모두 수작업하려고 하면 매우 힘든 일이다. 그래서 일반적으로 Apache Maven (오픈 소스 빌드 도구)를 이용하여 프로젝트를 생성하고 사용하도록 되어 있다. STS는 Maven과 주요 프로젝트 템플릿을 결합하여 간단한 설정만으로 필요한 라이브러리를 내장 한 프로젝트를 만들 수 있게 되어 있다.
따라서 Spring Framework 이용에는 특별한 이유가 없는 한 STS를 사용하도록 하자. 명령 줄에서 Maven 명령을 사용하여 프로젝트 생성해도 좋지만, STS 이용에 비하면 귀찮은 일이다. 물론 “Maven에 익숙 하니까 전혀 괜찮아"라고 하는 사람은 Maven 기반에서 개발을 진행 시켜도 좋을 것이다. STS는 다음에서 다운로드 할 수 있다.
여기에서 기본적으로 다운로드되는 것은, Windows의 경우 32bit 버전이다. 64bit 버전 JDK를 설치 한 경우라면 “See All Versions"링크를 클릭하고 거기에서 64bit 버전 STS를 다운로드하여 사용하자.
Maven으로 프로젝트 생성
Spring을 이용 프로젝트 생성에 대해 설명하겠다. 먼저 Maven을 이용하고 있는 경우에 만드는 방법이다. 명령 프롬프트 또는 터미널을 시작하고 프로젝트를 만들 위치에 cd 명령으로 이동한 후에 다음과 같이 실행한다.
$ mvn archetype:generate
실행하면 사용 가능한 아키타입(archetype) 목록이 1981개가 표시된다(2017년 9월 2일 기준).
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.2:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
... 중략 ...
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1027:
여기에서 그대로 Enter를 누른다.
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:
최신 버전이 기본적으로 지정되어 있으므로, 그대로 Enter를 또 누른다.
Define value for property 'groupId': :
그룹 ID(groupId)를 지정한다. 여기에서는 “com.devkuma.spring"라고 입력하였다.
Define value for property 'artifactId': :
아티팩트 ID를 지정한다. 여기에서는 “MySpringApp"라고 입력하였다.
Define value for property 'version': 1.0-SNAPSHOT: :
version 프로퍼티 설정이다. default인 대로좋기 때문에, 그대로 Enter를 누른다.
Define value for property 'package': com.devkuma.spring: :
프로그램의 패키지를 지정한다. 이것은 그룹 ID가 지정되어 있으므로 그대로 Enter를 노르는 것이 좋을 것이다.
여기까지 설정한 내용들이 표시되고 실수가 없다면 그대로 Enter를 누른다. 실수가 있으면, “N"를 입력하고 Enter누르고 다시 입력한다.
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1027:
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:
Define value for property 'groupId': : com.devkuma.spring
Define value for property 'artifactId': : MySpringApp
Define value for property 'version': 1.0-SNAPSHOT: :
Define value for property 'package': com.devkuma.spring: :
Confirm properties configuration:
groupId: com.devkuma.spring
artifactId: MySpringApp
version: 1.0-SNAPSHOT
package: com.devkuma.spring
Y: :
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /Users/kimkc/dev
[INFO] Parameter: package, Value: com.devkuma.spring
[INFO] Parameter: groupId, Value: com.devkuma.spring
[INFO] Parameter: artifactId, Value: MySpringApp
[INFO] Parameter: packageName, Value: com.devkuma.spring
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /Users/kimkc/dev/MySpringApp
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20:35 min
[INFO] Finished at: 2017-09-02T23:39:12+09:00
[INFO] Final Memory: 13M/234M
[INFO] ------------------------------------------------------------------------
이제 프로젝트가 생성되었다.
프로젝트와 pom.xml
생성된 프로젝트 폴더 (여기에서는 “MySpringApp” 폴더)에는 ‘src’폴더와 ‘pom.xml’ 파일이 생성되어 있다.
src 폴더는 프로젝트 파일들을 모와두는 곳이다. 여기에는 다음과 같은 폴더가 있다.
- main 폴더 - 프로그램에서 사용하는 파일를 모와둔 곳이다.
- test 폴더 - 프로그램에서 사용하는 단위 테스트의 소스 코드를 모와둔 곳이다.
“main"폴더 안에는 “java"폴더가 있고 그 안에 패키지의 폴더 구성에 “App.java"라는 소스 코드 파일이 생성되어 있다. 이것은 샘플로 작성된 소스 코드 파일로, 내용은 Spring Framework과는 전혀 관계가 없는 그냥 간단한 Java 응용 프로그램이다.
또 하나는 Maven 프로젝트에서 매일 중요한 파일인 “pom.xml"이다. 이 파일은 프로젝트에 필요한 라이브러리 등의 정보를 기술한 파일이다. Maven은 이 파일의 정보를 바탕으로 필요한 파일을 다운로드하고 프로젝트를 생성을 한다. 즉,이 pom.xml 파일을 제대로 작성하지 않으면 프로젝트를 제대로 만들 수 없다.
.
├── pom.xml
└── src
├── main
│ └── java
│ └── com
│ └── devkuma
│ └── spring
│ └── App.java
└── test
└── java
└── com
└── devkuma
└── spring
└── AppTest.java
아래에 기본적으로 기술되는 pom.xml 내용의 예시이다. pom.xml은 <project>
라는 태그에 다음과 같은 태그가 구성된다.
<groupId>
그룹 아이디는 프로젝트마다 접근할 수 있는 고유한 이름이다. 보통은 패키지 네이밍룰(도메인 뒤집기)을 따르는게 정석이다. 이후에 원하는 만큼 하위 그룹을 만들 수 있다.<artifactId>
아트팩트 아이디는 jar 파일에서 버젼 정보를 뺀 이름이다. 자유롭게 적되, 소문자를 사용하고 이상한 특수문자를 사용하지 않는다.<version>
버전을 나타내는 텍스트이다.<packaging>
패키지 종류이다. jar, war, pom 등이 있으며 여기서는 jar로 지정하여 패키징을 하면 jar이 생성된다.<name>
프로젝트 이름이다.<url>
URL이다. 일반적으로 http://maven.apache.org 이 지정되는 것이 보통이다.<properties>
각종 속성이 기술되는 곳이다. 여기에서는 **<project.build.sourceEncoding>
**라는 것이지정되어 있다. 이것은 프로젝트의 기본 인코딩을 지정하는 것이다.<dependencies>
이 안에는 **<dependency>
**라는 태그를 사용해서 필요한 라이브러리 정보를 기술한다. 기본적으로 JUnit 라이브러리에 대한 정보가 기술되어 있다.
이런 태그들을 작성하고 필요한 라이브러리를 구성해 나가는 것이 Maven에 의한 프로젝트 만들기의 기본이다.
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.devkuma.spring</groupId>
<artifactId>MySpringApp</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>MySpringApp</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>
</dependencies>
</project>
pom.xml에 Spring 핵심 라이브러리 추가
Spring Framework를 이용하기위한 pom.xml을 작성하자. 이번에는 Spring Framework의 핵심이 되는 라이브러리만 포함하도록 하자.
아래에 작성한 것이 수정된 pom.xml이다. 여기에서는 <dependencies>
태그 안에 다음과 같은 태그가 추가되어 있다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
이는 sprint-context라는 라이브러리를 추가하는 것이다. 버전은 이 글이 작성된 시점에 4.x 최신 버전이 기입되어 있다. Maven은 이런 상태로 라이브러리의 groupId와 artifactId 및 버전을 지정하면, 해당 라이브러리가 다운로드되어 프로젝트에 포함된다.
덧붙여 이번은 필요한 것을 최소한으로 내용을 맞추기 위해 JUnit 라이브러리를 제거하였다. 이와 관련하여 “src"폴더에 있는 “test"폴더를 삭제해야 한다. (JUnit이 없기 때문에 단위 테스트 소스 코드 파일을 빌드 할 수 없게 되므로 남겨두면 빌드 오류가 발생한다.)
이는 필요한 라이브러리 등을 다운로드하고 프로젝트를 빌드하고 Jar 파일을 만든다. “target"폴더라는 것이 생성되기 때문에 이 안을 살펴 보자. 그러면 “MySpringApp-0.0.1-SNAPSHOT.jar"라는 파일이 생성되어 있을 것이다. 이것이 빌드 된 Jar 파일이다.
그럼, 이를 실행하자. 명령 줄에서 “cd target"을 실행하고 “target"폴더로 이동하여 다음과 같이 실행한다.
java -classpath.; MySpringApp-0.0.1-SNAPSHOT.jar com.devkuma.spring.App
클래스 경로에 MySpringApp-0.0.1-SNAPSHOT.jar을 지정하여 com.devkuma.spring.App
을 실행한다. 이것으로 App 클래스의 main 메소드가 실행되고 “Hello World!“로 텍스트가 표시된다.
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.devkuma.spring</groupId>
<artifactId>MySpringApp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.6</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Spring and Transactions -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
</dependencies>
</project>
STS으로 Spring 프로젝트 생성
이어 STS를 사용하여 프로젝트를 만드는 방법에 대해 살펴 보겠다. STS는 Spring Framework 관련 프로젝트 템플릿이 몇 종류가 준비되어 있다. 크게 나누면 “Spring Legacy Project"와"Spring Starter Project “로 분류가 가능하다. 이것은 다음과 같은 차이가 있다.
Spring Legacy Project : 일반적인 Spring Framework 프로젝트이다. 필요에 따라 Spring Framework의 라이브러리가 내장하여 이용한다.
Spring Starter Project : Spring Boot라는 응용 프로그램의 빠른 개발 프레임워크를 이용한 프로젝트이다. 간단한 라이브러리를 추가하는 것만으로 필요한 프레임워크들이 모두 포함할 수 있도록 되어 있다.
Spring Framework의 기본을 배우는 것에는, “Spring 프로젝트"를 사용한다. Spring 스타터 프로젝트는 Spring Boot위한 것이므로, 이는 Spring Boot를 이용하게되면 사용하는 것으로 하자.
프로젝트 생성 단계
- STS를 시작하고 [File] 메뉴의 [New] 메뉴에서 [Spring Legacy Project] 메뉴를 선택한다.
- 표시된 대화 상자에서 다음과 같이 설정한다.
Project name : 프로젝트 이름입니다. 앞에 Maven으로 생성한 것과 동일하게 만들려면 “MySpringApp"라고 입력한다.
Template : “Simple Project"안에 있는 “Simple Spring Maven"를 선택한다.
Working sets : 여기에서 특별히 사용하지 않기 때문에 체크 박스는 OFF로 해 둔다.
이제 “Finish"버튼을 누르면, 프로젝트가 생성된다. 다만, 이 단계에서는 특별히 Java 소스 코드 파일은 생성되지 않으므로 나중에 필요에 따라 클래스를 만들어 나가게 될 것이다.
실행에 필요한 작업
-
패키지 탐색기(package explorer)에서 프로젝트를 선택하고 [Run] 메뉴의 [Run As] 내에서 [Maven Install] 메뉴를 선택한다. 이걸로 빌드가 완료된다.
-
응용 프로그램을 실행하려면 실행하는 응용 프로그램 클래스의 소스 코드 파일을 선택하고 [Run] 메뉴의 [Run As] 내에서 [Java Application] 메뉴를 선택한다.
- 이제 STS를 사용하여 프로젝트를 만들고 그것을 실행하기까지의 작업을 수행 할 수 있게 되었다. Spring Framework를 이용한 구체적인 프로그래밍은 다음에서부터 실시 나가기로 하자.