반응형
스프링 부트 레퍼런스 11장 
첫번째 스프링 부트 어플리케이션 개발하기
Developing your first Spring Boot application

11. 첫번째 스프링 부트 어플리케이션 개발하기

스프링 부트의 핵심기능 일부를 사용해서 자바로 간단한 "Hello World!” 웹 어플리케이션을 개발해보자. 여기선 대부분의 IDE가 지원하는 메이븐을 사용할 것이다.

시작에 앞서 터미널을 열고 설치된 자바와 메이븐 버전을 확인해보자 

$ 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
[Note]

이 예제는 자신의 폴더를 만들어서 진행해야하며 부가적 구성은 해당 폴더 안에서 진행한다고 가정함.

11.1 POM 생성하기

메이븐 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/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.2.5.RELEASE</version>
    </parent>

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

</project>

이것으로 빌드는 정상 동작한다. mvn package 를 치고 확인할 수 있다. ( “jar will be empty - no content was marked for inclusion!'” 라는 경고메시지는 일단 무시).

[Note]

이 단계에서 IDE로 import할 수 있다. (대부분의 자바 IDE는 메이븐을 내장하고 있다) 그냥 간단히 아무 에디터를 써서 이 예제를 계속 해도 상관없음

11.2 classpath 의존성(dependencies) 추가

스프링 부트는 당신의 classpath에 jar파일들을 쉽게 추가하게 해서는 몇몇의 “Starter POM”들을 제공해주고 있다. 현 예제 어플리케이션은 POM의 parent 센션에서 이미 spring-boot-starter-parent 를 사용하고 있다.

이 spring-boot-starter-parent 는 유용한 메이븐의 기본사항들을 제공해주는 특별한 시작키트이며 또한 dependency-management 섹션을 제공하여 선별된 dependency들을 version태그없이 쓸 수 있다.

다른 “Starter POM”들은 특별한 타입의 어플리케이션을 개발할때 필요로 하는 dependency들을 맞춤제공해준다. 현재 우리는 웹 어플리케이션을 개발중이므로  spring-boot-starter-web dependency를 추가할 것이지만, 그전에 우리가 현재 가지고 있는 dependency들을 살펴보도록 하자

$ mvn dependency:tree

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

이 mvn dependency:tree 명령어는 당신의 프로젝 dependency를 트리구조로 보여준다. 보면 알수있듯이 spring-boot-starter-parent 는 그 자체에 의존성을 가지고 있지않다. pom.xml 를 편집해서 spring-boot-starter-web 의존성을 parent 센션 밑에 아래와 같이 추가 해보자:

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

mvn dependency:tree 를 다시 실행해보면 톰캣웹서버나 스프링 부트 자체를 포함하여 부수적인 dependency들이 추가된것을 볼 수 있다. 

11.3 코드작성하기

예제 어플리케이션을 완성하려면, 자바파일을 하나 만들어야 한다. 메이븐은 기본적으로  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 annotations

Example 클래스의 첫번째 어노테이션은 @RestControllerstereotype annotation으로 잘알려진 이것은 코드를 읽을 사람들 또는 특별한 역할을 실행하는 클래스를 가진 스프링에 힌트를 제공한다. 우리의 경우 웹 @Controller 이므로, 스프링은 들어오는 Web request들을 처리할거라고 이해한다.

@RequestMapping 어노테이션은 "라우팅"정보를 제공하며 스프링에게 경로 "/"를 통해 들어오는 HTTP 요청이 home 메소드와 매칭되야한다고 알려준다.

@RestController 어노테이션은 스프링에게 호출자에게 되돌아가는 문자열을 랜더하라고 알려준다.

[Tip]

@RestController 와 @RequestMapping 어노테이션은 Spring MVC 어노테이션이다. (Spring Boot 특화된게 아님). 자세한 정보는 MVC section 참고

11.3.2 The @EnableAutoConfiguration annotation

두번째 클래스 레벨 어노테이션은 @EnableAutoConfiguration. 이 어노테이션은 스프링 부트에게 당신이 추가한 jar dependency들을 기준으로 어떻게 스프링을 설정하길 원하는지 "추측"하라고 알려준다.

spring-boot-starter-web 를 통해 추가된 톰캣과 스프링 MVC가 추가되었으므로,  자동설정 기능은 당신이 웹어플리케이션을 개발하고 있다고 가정하고 그에 따라 스프링을 설정한다.

11.3.3 The “main” method

우리의 어플리케이션의 마지막 파트는 main 메소드이다. 이것은 어플리케이션의 시작점을 위한 자바 명명법을 따르는 표준 메소드이다. 우리의 main 메소드는 run 에 의해 호출되는 스프링 부트의   SpringApplication 클래스를 실행한다.  SpringApplication 는 당신의 어플리케이션을 시동걸어, 스프링을 시작하고 이어 자동설정된 톰캣 웹서버를 동작시킨다. 우리는 기본 스프링 컴포넌트인 SpringApplication에 알리기 위해 Example.class 를 하나의  인자값으로  run  메소드에 넘겨야한다.  args 배열값 또한 command-line 인자값으로 외부적으로 넘길 수 있다.

11.4 예제 실행하기 Running the example

현재 단계에서  spring-boot-starter-parent POM을 사용한 이상 어플리케이션은 실행이 잘된다. 프로젝트의 메인 디렉토리에서 mvn spring-boot:run 를 치면 어플리케이션이 시작한다.

$ mvn spring-boot:run

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

브라우저를 열고 localhost:8080 를 치면 다음의 결과가 보인다:

Hello World!

 ctrl-c를 쳐서 프로그램을 우아하게 종료시키자

11.5 실행가능한 jar 만들기 Creating an executable jar

독립실행 가능한 jar파일을 만듦으로서 예제를 완성시켜보자. 실행가능한 jar (때로는 “fat jars”로 부르기도 함)는 당신의 컴파일된 클래스 뿐만 아니라 코드 실행에 관련된 모든 jar dependency들을 포함하여 압축한다.

실행가능한 jar를 만드려면 spring-boot-maven-plugin 를  pom.xml에 추가해야 한다. 다음의 라인을 dependencies 섹션 다음에 추가하자

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

spring-boot-starter-parent POM 은 repackage goal 을 설정하기 위해 <executions> 를 포함하고 있다. 부모 POM이 없다면 스스로 설정을 해야한다. 자세한 문서는 plugin documentation 참고.

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

target 디렉토리에는 myproject-0.0.1-SNAPSHOT.jar.original 라는 이름의 작은 파일도 있는데 이것은 스프링 부트에 의해 재패키지되기전의 메이븐 원본 jar파일이다.

이 어플리케이션을 실행하려면  java -jar 명령어를 쓰자:

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

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

 ctrl-c로 우아하게 종료할 수 있다.

반응형

'Tutorials' 카테고리의 다른 글

스프링부트와 OAuth2 - (1/4)  (0) 2016.03.19
Scaling out with Spring Session  (0) 2015.12.15
Spring Security and AngularJS Part VII  (1) 2015.12.03
Spring Security and AngularJS Part VI  (0) 2015.12.03
Spring Security and AngularJS Part V  (0) 2015.12.03

+ Recent posts