Part 2. Getting started - 한글

2016. 3. 16. 15:41Java/Spring Boot


우선, 영어로 그대로 쓰면서 , 중요한 내용들에 대해서만 한글로 번역을 해보도록 합니다. 
조금 난해한 해석은 영문으로 할 예정입니다. 

시작 : 2016년 02월 23일 오후 3시 00분
종료 : 2016년 02월 24일 오후 2시 22분 

말그대로 Getting Started 이다 보니, 우선 간단한 예제를 통해서 하나 씩 차근차근 이해 시키고 있습니다.

Part2. 시작하기

여러분이 이제 막 Spring Boot 나 Spring을 시작한다면, 이것이 바로 여러분을 위한 섹션이랍니다.
여기서 우리는 무엇인지, 어떤것인지 그리고 왜인지에 대한 질문에 대한 기본을 답변합니다.
여러분은 설치 방법과 더불어서 Spring Boot에 대한 일반적인 소개를 확인 할 수 있습니다.
우리는 첫번째 Spring Boot 어플리케이션을 빌드 아웃할 것이고, 우리가 가려는 핵심 원리들에 대해 토론할것입니다.

8.Spring Boot 소개

Spring Boot는 독립적이고, 여러분이 "그냥 동작"할수 있는 제품 수준의 Spring 기반의 어플리케이션을 쉽게 만들어 줍니다.
우리는 스프링 프레임워크와 서드파트 라이브러리들에 완고한 견해를 가지고 있어서 여러분은 최소의 설정으로 시작할수 있습니다.
대부분의 스프링 부트 어플리케이션들은 거의 Spring 설정이 필요하지 않습니다.

여러분은 java -jar 또는 이전의 war 배포들을 사용해서 시작할 수 있는 자바 어플리케이션을 생성하는 Spring Boot를 사용할 수 있습니다.
우리는 또한 "spring scripts"를 동작시키는 컴앤드 라인 툴을 제공합니다. 

우리의 주된 목표는 
 - 모든 Spring 개발을 위한 경험을 광범위하고 빠르게 시작할 수 있도록 제공합니다.
 - 박스 밖으로에서는 독단적이지만, 기본값들에서 요구사항들이 분기되기 시작하는 것으로 빠르게 그 방법으로부터 벗어납니다.  
 -  프로젝트들의 큰 클래스에 공통적인 비-함수적 기능들의 영역을 제공합니다.
    (예제 : 내장 서버, 보안, 수치, 헬스 체크, 설정 표면화)
 - 절대적으로, 어떠한 코드 생성이 없고, XML 설정을 하라는 요구도 없다.

9.시스템 요구사항

9.1 서블릿 컨테이너

아래 내장 서블릿 컨테이너들은 박스 밖에서 지원됩니다.

Tomcat 8 (Servlet Version 3.1 , Java Version : Java 7+)
Tomcat 7 (Servlet Version 3.0 , Java Version : Java 6+)
Tomcat 9 (Servlet Version 3.1 , Java Version : Java 7+)
Tomcat 8 (Servlet Version 3.0 , Java Version : Java 6+)
Undertow 1.1 (Servlet Version 3.1 , Java Version : Java 7+)

또한 Servlet 3.0+ 호환되는 컨테이너상에 Spring Boot 어플리케이션을 배포할 수 있습니다. 

10.Spring Boot 설치

Spring Boot는 "classic" 자바 개발 툴들을 사용하거나, command line tool 로 설치 할 수 있습니다.
그럼에도 불구하고, Java JDK 1.6 이상이 필요합니다.
시작하기 전에 현재 자바 설치된 버전을 확인하도록 하세요.

$ java -version

만약 자바 개발이 처음이거나, Spring Boot와 실험하길 원한다면, 처음에는 Spring Boot CLI을 시도해보는 것을 원할 것입니다.
그렇지 않으면, "classic" 설치 구문을 읽으세요

(*) 비록 Spring Boot가 자바 1.6 이상과 호환이 되지만, 만약 가능하다면, 가장 최신의 java 버전을 사용하는 것을 고려해주세요

10.1 자바 개발자를 위한 설치 방법

어떤 표준 자바 라이브러리와 같이 같은 방법으로 Spring Boot를 사용할 수 있습니다.
간단히 여러분의 클래스 패스에 적당한 spring-boot-*.jar 파일들을 추가합니다.
Spring Boot는 어떤 특별한 툴 통합을 요구하지 않기 때문에, 여러분은 어떠한 IDE 이나 text editor 를 사용할 수 있습니다.
그리고 Spring Boot 어플리케이션에 대해서 어떠한 특별한 것이 없습니다 그래서, 다른 자바 프로그램에게 하듯이, 가동하고 디버그 할수 있습니다. 

비록 Spring Boot jars 파일들을 복사 할수 있다면, 우리는 일반적으로 여러분이 의존성 관리를 지원하는 빌드 툴을 사용하는 것을 추천한답니다.
(메이븐이나 그래들 같은거)

10.1.1 Maven 설치

Spring Boot는 Apache Maven 3.2 버전 이상과 호환 합니다. 
이미 설치 되어 있지 않다면, maven.apache.org에서 설치하는 방법을 따라서 설치 하시면 됩니다.

(*) 많은 OS 에서 Maven은 패키지 매니저를 통해 설치 할수 있습니다.
    만약 OSX Homebrew 사용자라면, "brew install maven" 를 해보시고, Ubuntu 사용자라면, "sudo apt-get install maven" 을 해보시오

Spring Boot 의존성들을 "org.springframework.boot" 그룹 아이디를 사용합니다.
일반적으로 여러분의 Maven POM 파일은 "spring-boot-starter-parent" 프로젝트로 부터 상속되고, 하나 혹은 그 이상의 "Starter POMs" 에 의존성들을 선언할 것입니다.
Spring Boot 는 또한 실행가능한 jars 파일을 생성하는 부가적인 Maven 플러그인을 제공합니다.

(*) Starter POMs 는 여러분의 어플리케이션에 포함 할 수 있는 간편한 의존 상태 서술어들의  세트 입니다.

아래는 일반적인 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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <!-- Inherit defaults from Spring Boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.2.RELEASE</version>
    </parent>

    <!-- Add typical dependencies for a web application -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <!-- Package as an executable jar -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

(*) "spring-boot-starter-parent"는 Spring Boot를 사용하기 위한 엄청난 방법입니다. 그러나 모든것에 적합하지 않을 수 있습니다.
때때로, 다른 parent POM 으로 부터 상속할 필요가 있거나, 기본 세팅을 좋아하지 않을 수 있습니다.
그럴 땐 "import" scope를 사용하는 양자택일의 해결을 위한 parent POM 없이 Spring Boot 사용하는 법을 읽어 보세요.

10.1.2 Gradle 설치

Spring Boot는 Gradle 1.12 이상과 호환합니다.
Gradle을 설치하지 않았다면, gradle.org 에 가셔서 설치하시길 바랍니다.

Spring Boot 의존성들을 "org.springframework.boot" 그룹 아이디를 사용합니다.
일반적으로 여러분의 Maven POM 파일은 "spring-boot-starter-parent" 프로젝트로 부터 상속되고, 하나 혹은 그 이상의 "Starter POMs" 에 의존성들을 선언할 것입니다.


Gradle Wrapper

Gradle Wrapper는 프로젝트를 빌드하기 위해 필요로 할 때 "obtaining" Gradle의 멋진 방법을 제공합니다.
이건 빌드 프로세스를 부트스트랩하기 위한 여러분의 코드옆에서 커밋 하는  작은 스크립트 와 라이브러리 입니다. 
좀 더 볼려면 문서(http://www.gradle.org/docs/current/userguide/gradle_wrapper.html)를 찾아 보세요.


아래는 일반적인 build.gradle 파일입니다.


buildscript {
    repositories {
        jcenter()
        maven { url "http://repo.spring.io/snapshot" }
        maven { url "http://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.2.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'spring-boot'

jar {
    baseName = 'myproject'
    version =  '0.0.1-SNAPSHOT'
}

repositories {
    jcenter()
    maven { url "http://repo.spring.io/snapshot" }
    maven { url "http://repo.spring.io/milestone" }
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}

10.2  Spring Boot CLI 설치

Spring Boot CLI은 Spring을 가지고 빠르게 프로토타입을 원할 떄, 사용할 수 있는 컴앤드라인툴입니다.
그런 많은 진부한 코드가 없이, Java같은 익숙한 구문을 가지고 있는 것을 뜻하는 Groovy 스크립트를 동작하는 것이 가능하게 하는 것입니다. 
여러분은 Spring Boot을 가지고 일하기 위해 CLI을 사용할 필요가 없으나,
Spring 어플리케이션을 그라운상에 띄우는 명확하게 가장 바른 방법 입니다.


10.2.1 메뉴얼 설치
  
Spring 소프트웨어 저장소로 부터 Spring CLI distribution을 다운 할수 있습니다.

 - spring-boot-cli-1.3.2.RELEASE-bin.zip
 - spring-boot-cli-1.3.2.RELEASE-bin.tar.gz

Cutting edge snapshot distributions이 또한 사용가능합니다.

한번 다운로드 한뒤, 압축을 푼곳에 INSTALL.txt를 따르면 됩니다.
요약 :  zip파일안에 bin/ 디렉토리안에 spring 스크립트(spring.bat for Windows) 가 있습니다. 또는 여러분은 java- jar 를 사용할수 있답니다.
(그 스크립트는 여러분이 확실하게 클래스 패스가 정확하게 세팅되어 질 수 있도록 도와줍니다.)


10.2.2. SDKMAN! 과 함께 설치

SKMAN! (The Software Developemnt Kit Manager)은 Groovy 와 Spring Boot CLI을 포함하는 다양한 바이너리 SDKs의 다수의 버전을 관리하기 위해 사용 될 수 있습니다.
http://sdkman.io/ 에서 다운 받고 Spring Boot를 아래와 같이 설치하세요

curl -s get.sdkman.io | bash
source /home/USER/.sdkman/bin/sdkman-init.sh
 

$ sdk install springboot
$ spring --version
Spring Boot v1.3.2.RELEASE

CLI에 대한 기능을 개발하고 여러분이 바로 빌드했던 버전에 쉽게 접근하길 원한다면, 아래 추가 설명을 보세요.

$ sdk install springboot dev /path/to/spring-boot/spring-boot-cli/target/spring-boot-cli-1.3.2.RELEASE-bin/spring-1.3.2.RELEASE/
$ sdk default springboot dev
$ spring --version
Spring CLI v1.3.2.RELEASE

이것은 dev 인스턴스라고 불리는 로컬 스프링 인스턴스를 설치 할 것입니다.
그것은 여러분은 목표 빌드 위치을 가르킵니다. 그래서 매번 여러분이 Spring Boot를 재 빌드 하고, 최신 버전이 될것입니다.

여러분은 아래 한것에 의해 볼수 있습니다.

$ sdk ls springboot

================================================================================
Available Springboot Versions
================================================================================
> + dev
* 1.3.2.RELEASE

================================================================================
+ - local version
* - installed
> - currently in use
================================================================================

10.2.3 OSX Homebrew 설치 

Mac 을 사용하시는 분은 아래 명령어를 따라 치시길 바라옵니다. 
$ brew tap pivotal/tap
$ brew install springboot

Homebrew는 스프링을 /usr/local/bin 경로에 설치 합니다. 

(*) 혹시 여러분이 그 방식을 보지 않는다면, 여러분의 brew는 구식일것입니다. 
     그냥 execute brew 업데이트하고 재시도 하세요 


10.2.4. MacPorts installation

MacPort를 사용하는 Mac 이라면 여러분은 Spring Boot CLI 을 아래와 같이 설치 하시면 됩니다. 

$ sudo port install spring-boot-cli

10.2.5 Command-line completion

Spring Boot BLI은 BASH 와 zsh 쉘들을 윈한 명령 완성을 제공하는 스크립트을 포함하고 있습니다.
여러분은 어떤 쉘에서 그 스크립트(역시 spring 라는 이름)을 소스할수 있거나, 여러분의 개인적인 혹은 시스템전반에 bash 완성 설정에 놓을수 있습니다.
Debian 시스템상에서 시스템전반의 스크립트들은 /shell-completion/bash 안에 있고, 그 디렉토리 안에 모든 스크립트들은 새로운 쉘을 시작할 때 실행되어 집니다.
스크립트를 수동으로 가동할 때는 , 예를 들면, 만약 SDKMAN을 사용하여 설치 되었다면 

$ . ~/.sdkman/springboot/current/shell-completion/bash/spring
$ spring <HIT TAB HERE>
  grab  help  jar  run  test  version

(* Command-line completion (also tab completion ) is a common feature of command line interpreters, in which the program automatically fills in partially typed commands.)
(* Bash is Unix shell and command language.  it has been distributed widely as the shell for the GNU operating system and as a default shell on Linux and OS X... https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29.)
(* zsh : The Z shell is a Unix shell that can be used as a interactive login shell and as a powerful command interpreter for shell scripting. : https://en.wikipedia.org/wiki/Z_shell)

(*) Homebrew나 MacPorts를 사용하여 Spring CLI을 설치했다면, 여러분의 쉘에 자동으로 command-linecompletion 스크립트들이 등록됩니다.


10.2.6 Spring CLI 예제의 빠른 시작 

여러분이 여러분을 설정을 테스트 하기위해 사용 할 수 있는 정말 간단한 웹 어플리케이션이 있습니다.
app.grooby 라고 불리는 파일을 만드세요.

@RestController
class ThisWillActuallyRun {

    @RequestMapping("/")
    String home() {
        "Hello World!"
    }

}

그리고 간단히 쉘에서 아래 명령어를 입력하시고, 

$ spring run app.groovy

(*) 여러분이 처음 어플리케이션을 가동 시킬때 의존관계들이 다운로드 되는 것으로써 약간의 시간이 걸릴 것입니다.
그 다음 시동시에는 보다 빠르게 될것입니다. 

localhost:8080을 여러분이 좋아하는 브라우저로 열어 보시면 아래와 같이 볼수 있겠죠.

Hello World!






10.3 이전 버전의 Spring Boot 를 업그레이드 하기 

Spring Boot의 이전 릴리스로 부터 업그레이드를 하려면, project wiki 에 지정된 realease notes을 체크하시길 바랍니다.
여러분은 각각의 릴리즈를 위한 new and noteworthy  기능 리스트와 함께 업그레이드 구문들을 찾을 것입니다. 

존재하는 CLI 설치를 업그레이드 하기 위해 적당한 패키지 매니저 명령을 사용합니다. (예를 들면 brew upgrade)
또는 만약 여러분이 수동으로 CLI를 설치 했다면, 어떤 이전 레퍼런스를 지우기 위한  여러분의 PATH 환경 변수를 업그레이드 하기 위한 standard instructions remebering 을 따르세요.


11. 첫번째 Spring Boot application 개발하기

Spring Boot의 핵심 기능들을 강조한 Java에서, 간단한 "Hello world!" 웹 어플리케이션을 만들어 봅시다.
우리는 대부분의 IDE에서 지원하는, 메이븐을 사용해서 이 프로젝트를 빌드 하도록 하겠습니다.

(*) spring.io 웹 사이트에는 Spring Boot을 사용하는 많은 "Getting Started" 가이드를 포함하고 있습니다.
     만약 특정 문제을 해결하는 것을 찾는다면, 가장 먼저 체크해보세요.
     여러분은 spring.io를 시작하는 것과 의존관계 찾아주는 것으로 부터 web starter 를 선택하는 것에 의해 아래 단계를 줄일수 있습니다.
     이것은 자동으로 새로운 프로젝트 구조를 생성 할 것이고, 따라서 여러분은 정확한 코딩 방법을 시작할 수 있습니다.
      좀 더 자세한 정보에 대한 문서는 아래와 같습니다. 

시작하기 전에, 터미널에서 여러분의 Java 와 Maven 버전을 검증해주세요.

$ java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

$ mvn -v
Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T13:58:10-07:00)
Maven home: /Users/user/tools/apache-maven-3.1.1
Java version: 1.7.0_51, vendor: Oracle Corporation

(*)이 예제는 Java 와 Maven 각자 자신의 폴더안에 생성될 필요가 있습니다. 그다음 지침으로 여러분이 적당한 폴더를 생성했다 라는 것과 여러분의 "현재 디렉토리"이다 라고 가정합니다.

11.1 POM 생성

우리는 Maven pom.xml 파일을 생성하는 것에 의해 시작할 필요가 있습니다.
pom.xml은 여러분의 프로젝트를 빌드 하는데에 사용될 레시피 입니다. 
여러분이 자주 쓰는 text 에디터를 열고, 아래 내용을 추가 하도록 하세요.

<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.2.RELEASE</version>
    </parent>

    <!-- Additional lines to be added here... -->

</project>

이것은 여러분에게 작업 빌드를 줘야 하고, 여러분은 "mvn package" 를 실행함에 따라서, 그것을 테스트 할수 있습니다.
(지금은 [WARNING] JAR will be empty - no content was marked for inclusion!  경고를  무시 해도 됩니다.)

(*)이 요점에서, 여러분은 IDE안에서 프로젝트를 임포트 할수 있습니다.(대부분은 최근 Java IDE의 include built-in 메이븐을 지원합니다.)
     간단하게 , 우리는 이 예제를 위해 평범함 텍스트 에디터를 사용하는 것을 유지 하겠습니다. 


11.2 클래스패스 의존관계들 추가하기

Spring Boot는 여러분의 클래스 패스에 jars를 추가하는 것을 쉽게 만들어 주는 다수의 "Starter POMs"를 제공합니다.
이 예제 어플리케이션은 이미 "spring-boot-starter-parent"를 POM 의 parent 섹션에서 사용해 왔습니다.
 "spring-boot-starter-parent"은 유용한 Maven 기본값을 제공하는 특별한 starter 입니다. 
그건 또한 "dependency-management" 섹션을 제공하는데, 그래서 여러분이 주어진 의존관계에 대한 version tags를 생략할수 있습니다. 

다른 "Starter POMs"은 간단하게 여러분이  특정 타입의 어플리케이션을 개발할때 필요한것 같은 의존관계를 제공합니다. 
우리가 웹 어플리케이션을 개발하고 있는 이래로, 우리는 "spring-boot-starter-web" 의존관계를 추가할 것입니다. - 그러나 그전에  우리가 현재 가지고 있는 것을 보도록 합시다.

$ mvn dependency:tree

[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT

"mvn dependency:tree" 명령은 여러분 프로젝트 의존관계의 트리 표현식으로 출력합니다.
여러분은 "spring-boot-starter-parent"가 단독으로 어떠한 의존관계를 제공하지않는 것을 볼수 있습니다. 
우리 pom.xml을 수정하고 "spring-boot-starter-web" 의존관계를 붙여 넣어 봅시다.

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

입력후에 다시 "mvn dependency:tree"  입력하면, 아래와 같이 톰캣 웹서버 와 스프링 부트 스스로를 포함한 다수의 추가된 의존관계들이 있다는 것을 볼수 있습니다.


11.3  코드 작성 

우리 어플리케이션을 마치기 위해, 싱글 Java 파일을 만들 필요가 있습니다.
메이븐은 "src/main/java" 에서 소스를 기본으로 컴파일 합니다 그래서 여러분은 그때 폴더 구조를 생성할 필요가 있습니다.
src/main/java/Example.java 라는 이름의  파일을 추가하세요 

import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;

@RestController
@EnableAutoConfiguration
public class Example {

    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Example.class, args);
    }

}

여기에 많은 코드는 없지만, 꽤 많은 것이 동작하고 있습니다.
중요한 부분들을 차근차근 확인해보도록 하죠.

11.3.1 @RestController 와 @RequestMapping 어노테이션

우리 Example 클래스에서 첫번째 어노테이션은 @RestController 입니다.
이 코드를 읽는 사람들을 위해, 그 클래스가 특정 역활을 한다라는 것을 스프링에게, 힌트를 제공합니다.
이경우에는 , 우리 클래스는 하나의 웹 @Controller 입니다. 그래서 Spring 은 웹 요청들이 들어온것을 다룰때, 그것을 고려할 것입니다.
@RequestMapping 어노테이션은 "routing" 정보를 제공합니다.
이것은 Spring에게 "/" 경로와 함께 어떤 HTTP 요청은 home 메소드에 매핑되어져야 한다라고 전달하고 있습니다.
@RestController 어노테이션은 Spring에게 caller에게 직접 string 결과에 대해 제공하라고 전달합니다.

(*) @RestController 와 @RequestMapping은 Spring Boot에 특정한 것은 아니고 Spring MVC 어노테이션이랍니다.


그럼 stereotype 란 뭔가요?
스테레오타입은 UML 모델링 요소들을 모델러의 기준에 따라 새로운 분류를 적용 할 수 있도록 허용하는 매커니즘이다.
따라서, 스테레오 타입은 모델러 마음대로 정의해서 적용하면 되는 것이고 특별한 제약이나 규칙은 없다.
그럼 Spring 에서의 stereotype annotation 이란..
용도가 불분명한 컴포넌트 클래스들을 윈한 어노테이션이라고 보면 됩니다.


11.3.2 @EnableAutoConfiguration 어노테이션 

두번째 클래스 단계 어노테이션은 @EnableAutoConfiguration 입니다.
이 어노테이션은 Spring Boot에게 여러분이 어떻게 여러분이 추가한 jar 의존관계들에 기반하여,Spring 설정하길 원할 것이라고  예측하라고 전달합니다.
"spring-boot-starter-web"가 Tomcat과 Spring MVC을 추가한 이후로, 자동 설정이 여러분이 웹 어플리케이션을 개발하고 그에 따른 Spring 설정을 하고 있다라고 예상할 것입니다.

Starter POMs and Auto-Configuration

자동 설정은 "Starter POMs"와 잘 동작하기 위해 설계 되었으나, 두개의 컨셉들이 직접 묶일수 없습니다.
여러분은 starter POMs 밖의 jar 의존관계들을 집고 고르는 것은 자유이고, Spring Boot는 여러분의 어플리케이션을 자동 설정하는 것에 최선을 다하고 있을 것입니다. 



11.3.3 "main" 메소드

우리 어플리케이션의 최종 단계는 메인 메소드입니다.
이것은 어플리케이션 진입점을 위한 Java convention을 다르는 단순 표준 메소드 입니다.
우리 메인 메소드는 "run"을 호출하는 것에 의해 Spring Boot의 "SpringApplication" 클래스에 위임합니다.
"SpringApplication"은 우리 어플리케이션, 자동 설정 톰캣 웹 서버를 차례로 시작하는 Spring을 시작하는 것을 부트스트랩 할것입니다. 
우리는 "Example.class"을 주요한Spring 컴포넌트인 "SpringApplication"에게 전달하기 위해 "run" 메소드에 인자로 전달될 필요가 있습니다. 
"args" 배열은 또한 어느 컴앤드 라인 인자들을 표출하기 위해 전달됩니다.


11.4  예제 실행 

우리 어플리케이션이 동작 해야하는 시점입니다. 
우리가 "spring-boot-starter-parent" POM을 사용해온 이후로, 우리는 우리가 어플리케이션을 시작하는데 사용 할수 있는 유용한 "run" goal을 가지고 있습니다.
root 프로젝트 디렉토리에서 어플리케이션을 시작하도록  "mvn spring-boot:run" 입력하세요.

$ mvn spring-boot:run

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v1.3.2.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.222 seconds (JVM running for 6.514)

브라우저에서  "localhost:8080" 열어서 보면 아래 결과가 나올 것이랍니다. 

Hello World!

어플리케이션을 우아하게 나가기 위해서는 "ctrl+c" 을 입력하세요 




11.5 실행 가능한 Jar 생성하기 
우리가 제품으로 동작할수 있는 완벽하게 셀프-컨테이너 실행 가능한 jar 파일을 생성하는 것으로 우리 예제를 마치도록 한다.
실행 가능한 jars(가끔은 "fat jars"라고 부름)들은 여러분의 코드가 동작하는데 필요한 jar 의존관계들의 모든 것 포함한 여러분의 컴파일된 클래스들을 포함하고 있는 저장소들입니다.

Executable jars and Java

Java는 관련된 jar 파일들을 싣는 어떠한 표준 방법을 제공하지 않습니다.
이것은 여러분이 스스로 포함된 어플리케이션을 배포하는 것을 찾고 있다면, 많은 문제가 될수 있습니다.

이 문제를 해결하기 위해서는, 많은 개발자들이 "uber" jars를 사용합니다.
uber jar는 간단하게 모든 클래스들을 모든 jars로 부터, 단독 저장소 안으로 패키징합니다. 
이 접근과 함께 문제는 그것이 여러분의 어플리케이션에서 실제 사용하고 있는 라이브러리들을 보기 어렵게 한다는 것입니다.
다수의 jars 안에서  같은 파일이름이 사용된다면(그러나 다른 내용을 가지면서)  그것 또한 문제가 될수 있습니다.

Spring Boot은 다른 접근을 취했고, 여러분을 실제로 직접 jars를 두도록 허용합니다. 


Excutable jar를 생성하기 위해여 우리는"spring-boot-maven-plugin" 를 "pom.xml"에 추가해야 합니다. 

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

(*)  "spring-boot-starter-parent" POM은 repackage goal을 바인드 하기 위해 <excutions> 구성을 포함합니다.
    parent POM을 사용하고 있다면, 여러분은 스스로 이 구성을 선언할 필요가 있습니다.
   보다 자세한 plugin 문서를 보시길 바라옵나이다. 

여러분의 pom.xml을 저장하고  mvn package 을 컴앤드 라인에서 동작해보도록 하죠 

$ mvn package

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myproject 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] .... ..
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---
[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.3.2.RELEASE:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

여러분이 target 디렉토리을 봤다면, 여러분은 "myproject-0.0.1-SNAPSHOT.jar"을 볼수 있어야 합니다.
그 파일은 대략 10 Mb 되어야 합니다.
만약 안을 살짝 들여다 보길 원하면, 여러분은 jar tvf 을 사용 할 수 있습니다. 

$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar

또한 많은 작은 파일 이름인 "myproject-0.0.1-SNAPSHOT.jar.original"을 target 폴더에서 볼수 있습니다.
Spring Boot에 의해서 리패키징되기 전에 Maven이 생성한 이것은 original jar 파일입니다. 

java -jar 명령을 통해서 동작시켜 보도록 하죠.

$ java -jar target/myproject-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v1.3.2.RELEASE)
....... . . .
....... . . . (log output here)
....... . . .
........ Started Example in 2.536 seconds (JVM running for 2.864)

전과 마찬가지로, 종료하려면 "ctrl-c"을 입력하세요.


12. 다음에 읽을 것은 

이 섹션이 여러분에게 Spring Boot 기본들중에 일부분을 제공하고, 여러분 자신의 어플리케이션들로 작성하는 것에 여러분의 방법으로 얻었기를 바랍니다.
만약 task-oriented 타입의 개발자라면 , 여러분은 "Spring을 가지고 어떻게 나는 하는가"에 대한 문제들을 풀기 위한 시작하기가이드를 체크아웃 할것입니다.

실제 영문으로 읽어 보는 것이 가장 명쾌합니다.