반응형

스프링 세션으로 스케일 아웃하기 Scaling out with Spring Session

원문: http://www.jayway.com/2015/05/31/scaling-out-with-spring-session/

Stateless 아키텍쳐는 근 몇년간 타당한 이유로 꾸준히 인기가 올라왔다. 하지만 stateful 세션기반의 어플리케이션도 꾸준히 중요한 역할을 이어왔다. 예를 들어 더 나은 보안을 위해 CSRF 토큰이 이슈될때처럼. 낮은 부하의 단일 서버를 배포할 때, 세션관리는 당신이 합리적인 타임아웃 유효기간을 사용하고 세션에 많은 양의 데이터를 저장하지 않는 것처럼 매우 직관적이다. 문제는 스케일 아웃하기 더 힘들다는 것이다 각각의 요청은 아마 다른 서버에 있을 지도 모르는 그에 상응하는 세션과 함께 묶여져야하기 때문이다. 이를 극복하기 위해, 서버 공급자들은 서버간 다양한 종류의 세션 복제를 구현해왔다. 또다른 대안으로 로드밸런서를 세션과 붙여 같이 설정할 수 있다. 이 두가지 솔류션 다 잘 동작한다. 하지만 스프링 세션으로 스프링은 또 다른 옵션을 만들어냈다. 이 블로그는 세션을 스케일 아웃하기 위해 어떻게 스프링 세션을 레디스와 함께 설정하는 지 보여줄 거이다. 이 제안된 솔루션은 (스프링 기반이 아닌) 어떠한 서블릿에서도 작동할 것이다 - 이는 당신의 레가시 웹앱을 스케일 아웃해야할때 매우 적합하다.


예제 어플리케이션 Example Application

먼저 우리는 간단한 세션 기반의 HelloServlet 예제를 살펴보자:

HTTP GET이 호출될 때, 서블릿은 세션에 Mattias의 값을 가진 name 속성이 있으면  Hello Mattias! 를 응답하거나, 없다면 기본값인 Hello World!를 응답할 것이다.

HTTP POST이 호출될 때, 서블릿은 요청으로 부터 name 매개변수를 읽고, 새로운 세션을 만들고 (또는, 이미 세셨이 있다면 재사용하고), name의 값을 이와 상응하는 세션 속성에 저장할 것이다.

첫번째 요청은 세션이 없으므로 다음과 같이 다음과 같은 기본 응답을 받게 된다:

두번째 요청은 name 속성을 가진 POST 요청으로 세션이 생성된다:

덧붙이자면,  -i (또는 —-include) 옵션은 응답의 HTTP 헤더에 포함되는 cURL 플래그이며 -d (또는—data) 플래그는 요청의 매개변수로서 데이터를 제출하는데 사용된다. 응답에서 우리는 Set-Cookie 헤더의 값에 주목했다.

세번째 요청으로, GET 요청과 세션 상태의 유효화 검증이다:

어플리케이션의 서로 다른 인스턴스에서 같은 요청을 수행할 때 우리는 문제에 직면한다. 세션이 이미 존재함에도 불구하고 기본 응답이 되돌아왔다:

이제 스프링 세션을 써야할 때다!


스프링 세션 아키텍쳐 Spring Session architecture

스프링 세션의 컨셉은 매우 직관적이다:

  • 새 서블릿 필터를 만든다
  • 그 필터를 당신의 서블릿 필터체인filter chain에 추가한다
  • 그 필터를 레디스와 연결한다 (또는, Hazelcast, GemFire, Coherence가 지원하는 다른 MapSessionRepository 또는 당신에게  Map 레퍼런스를 제공해주는 다른 종류의 데이터 그리드data grid, 그러나 이들은 이 글의 범주에 벗어나므로 더이상 언급하지않는다)

의존성 추가하기 Adding dependencies

먼저, 우리는 몇가지 의존성을 추가해줘야한다. 메이븐에선 다음과 같이 POM에 추가해주면된다:

첫번째 의존성은 Redis 연결을 위해 필요하며 두번째는 스프링이 서블릿 필터를 만들기 위해 필요하다.


스프링 세션 설정 Spring Session Config

스프링 세션은 (내부적으로 Jedis client를 기반으로) 기본적으로 레디스 연결을 지원해준다. 아래의 XML 기반 설정의 예를 참고하거나  자바 기반 설정으로 대체할 수 있다.

마지막 두줄은 스프링에게  spring.redis.port 값을  application.properties 파일에서 찾으라고 알려주는것이다.  다음의 한줄과 같이: 


스프링 세션 설정 등록하기 Registering the Spring Session Config

(만인 당신의 어플리케이션이 이미 스프링을 사용하고 있지 않다면) 스프링 세션 설정을 불러오기위해  web.xml에 다음의 몇 줄을 추가해주어야 한다:


스프링 세션 서블릿 필터 추가하기 Adding the Spring Session servlet filter

어플리케이션에서 필요한 마지막 수정은 새로운 서블릿 필터를 추가하는 것이다. web.xml를 다시 열고 다음을 추가해준다:

single commit에서 바뀐 사항들을 모두 확인할 수 있다:


입 증 Verification

이제 어플리케이션을 모두 업데이트하였다. 원하는대로 동작하는지 입증해보자:

  • 어플리케이션을 다시 빌드한다
  • 레디스가 설치되었고 기본 포트인 6379에서 작동중인지 확인하라. 다른 포트에서 동작하고 있다면 spring.redis.port 설정을 업데이트 해주어야한다
  • 어플리케이션을 이를테면 8080 과 8081과 같이 두개의 인스턴스로 시작하라. 둘다 같은 레디스서버에 연결되어야한다.
  • 위에 언급된 이슈를 시도해보자

먼저 서버 인스턴스 한군데서 POST로 세션 상태를 만든다:

안은 인스턴스에서 GET 요청으로 세션 상태 검증하자:

다른 서버에서 같은 요청을 반복해보면 이제 같은 세션 데이터를 가지고 있는 것을 볼 수 있다:


고려 사항들 Considerations

  • 당신은 세션을 잃을지도 모른다는 걱정없이 원하는대로 서버를 시작하거나 멈출 수 있다. 이를테면 장애극복failover이나 자동 스케일링autoscaling은 세션의 관점에선 자동으로 처리된다.
  • 당신은 이제 더이상 sticky sessions 이나 복잡한 로드밸런서 설정이 필요없다. 부하를 나누려면 간단한 라운드-로빈Round-robin 전략이면 충분하다.
  • 운영의 관점에선 여전히 해줘야 할 것들이 있다. 누군가는 레디스 클러스터를 설정하고 관리해주어야 한다. (만일 AWS에서 동작한다몀 Amazon ElasticCache이 잘 맞을 것이다)
  • 스프링 부트를 사용중이라면 아마도 spring-session.xml설정이나  web.xml.을 추가하고 싶지않을 것이다.  자바 기반 설정을 위해  Spring Boot Guide를 확인하자.
  • 만일 당신이 RESTful API 를 개발중이다 쿠키를 싫어한다며? Spring Session Rest를 확인해보자.

주, 스프링 부트에서는 @EnableRedisHttpSession 어노테이션 한줄로 다 해결됨


반응형

반응형

타임리프3 5분 이주 가이즈 Thymeleaf 3 five-minute migration guide

원문: http://www.thymeleaf.org/doc/articles/thymeleaf3migration.html

당신은 Thymeleaf 2 사용자로서 새로운 Thymeleaf 3를 써보고 싶으시가요?

먼저, 좋은 소식이 있습니다. 당신이 구현해놓은 타임리프 템플릿들은 거의 100% 타임리프3와 호환될 것이므로, 당신은 단지 몇가지 설정만 바꿔주시면 됩니다.

Thymeleaf 3.0 BETA 버전은 안정적으모 2.1버전의 모든 기능을 지원합니다. 우리는 당신이 새 기능들과 성능 향상의 잇점을 취하도록 가능한한 빨리 타임리프3로 옮기기를 권장합니다.

현재 단계에서 타임리프 버전 2.1의 모든 다이얼렉트dialect들이 옮겨지진 않았다는게 약점이긴 하지만, 당신이 만약 타임리프 3에서 동작하지많은 외부 다이얼렉트를 사용중이라면, 타임리프 3와 호환되는 지 먼저 확인해보세요

템플릿 변경 Template changes

당신의 템플릿에 우리가 권장하는 유일한 변경사항은 아마도 당신이 사용하고있을 th:inline="text" 속성을 없애주는 것입니다. 왜냐하면 이들은 HTML이나 XML템플릿의 인라인 표현식을 출력하기 위해 더이상 필요하지 않기 때문입니다. 아 이건 그저 권장사항입니다 - 템플릿은 지우던 안지우던 어쨋거나 동작할 것입니다 - 하지만 당신이 이것을 지원줌으로서 성능향상이라는 혜택을 받을 수 있습니다.

더 자세한 정보는 밑의 향상된 인라인 메케니즘 섹셕을 참고사헤요

설정 변경 Configuration changes

이제 타임리프 사용자로서 가장 일반적인 선택인 thymeleaf-spring4 통합 패키지와 자바 설정을 사용한 타임리프 3의 설정의 예를 봅시다, 

먼저, 다음과 같이 타임리프3와 스프리4 통합 패키지를 얻기위한 메이븐 의존성을 업데이트합니다.

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.0.0.BETA01</version>
</dependency>
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring4</artifactId>
    <version>3.0.0.BETA01</version>
</dependency>

두번째로, 스프링 설정:

@Configuration
@EnableWebMvc
@ComponentScan("com.thymeleafexamples")
public class ThymeleafConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
 
    private ApplicationContext applicationContext;
 
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }
 
    @Bean
    public ViewResolver viewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding("UTF-8");
        return resolver;
    }
 
    private TemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        return engine;
    }
 
    private ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/WEB-INF/templates/");
        resolver.setTemplateMode(TemplateMode.HTML);
        return resolver;
    }
 
}

타임리프2 설정과의 첫번째 차이점은 이제 스프링 어플리케이션을 위한 추천 템플릿이 SpringResourceTemplateResolver 라는 것입니다. 이는 설정 빈(configuration bean)이 ApplicationContextAware 인터페이스를 구현줘야만 하기 때문에 스프링 ApplicationContext에 참조(reference)가 필요합니다.

두번째 차이점은 템플릿 모드가 TemplateMode.HTMLT의 값을 가지는 것입니다. 템플릿 모드는 더이상 스트링이 아니며, 가능한 값들도 타임리프2와 약간 다릅니다. 잠시후 살펴볼 것입니다.

만일 추가적인 다이얼렉트를 추가해줘야한다면, 당신은 engine.addDialect(...) 메소드를 사용할 수 있습니다. 그러나 먼저 이것이 타임리프 3와 호환가능한 버전인지 확인해보아야 합니다.

Thymeleaf 3 + Spring 4 + Java config exampleThymeleaf 3 + Spring 4 + XML config example 그리고 Thymeleaf 3 + Servlet 3 example에서 간단한 "Hello World" 예제들의 소스코드를 찾아보거나 다운로드 할 수 있습니다.

또는 the Thymeleaf BETA 1 announcement.에서 추가적인 정보를 찾아볼 수 있습니다.

완전한 HTML5 마크업 지원 Full HTML5 markup support

타임리프 3.0은 더이상 XML 베이스가 아닙니다. 이 새 파싱 시스템에 감사하며, XML 유효한 HTML 코드를 더이상 만들 필요도 없습니다. (가독성이좋으므로 여전히 권장되기는 합니다). HTML 모드로, 타임리프는 클로징태그(closed tag), 따옴표 속성(quoted attribute)의 경우 이제 훨씬 더 관대해졌습니다.

따라서 이제 다음과 같이 더 완벽하게 처리능력이 향상된 (약간 가독성이 떨어지지만) 타임리프 템플릿이 되었습니다:

<div><p th:text=${mytext} ng-app>Whatever

새로운 파싱 시스템에 댛의 설명은 Full HTML5 support, new parsing infrastructure를 참고하세요.

템플릿 모드 Template modes

타임리프3는 이전 버전의 템플릿 모드의 묶음을 변경하였습니다. 새로운 템플릿 모드는 다음과 같습니다: 

  • HTML
  • XML
  • TEXT
  • JAVASCRIPT
  • CSS
  • RAW

2개의 마크업markup 템플릿 모드(HTML and XML), 3개의 텍스쳐textual 템플릿 모드 (TEXTJAVASCRIPT, CSS) 그리고 no-op 템플릿 모드 (RAW).

HTML 템플릿 모드는 HTML5, HTML 4 and XHTML을 포함하여 어떤 종류의 HTML 마크업 입력을 허용합니다. 제대로 구조화 했는지 확인하는 마크업 유효성검사를 수행하지않습니다. 템플릿 마크업 코드구조는 출력시 가장 큰 가능성을 가진 규모biggest possible extent를 존중할 것입니다.

다른 템플릿 모드에 대한 자세한 설명은 Thymeleaf 3.0 Template Mode set을 확인하세요.

또한 https://github.com/jmiguelsamper/thymeleaf3-template-modes-example에서 새 템플릿 모드에 대한 간단한 예제를 확인할 수 있습니다.


텍스쳐 템플릿 모드 Textual template modes

타임리프에 추가된 새로운 텍스쳐 템플릿 모드는 CSSJavascript 와 plain text를 출력할 수 있습니다. 당신의 CSS와 자바스크립트 파일들에 서버사이드 변수값을 사용하거나, 이메일 작성과 같은 plain text를 만들기 더 쉽게 되었습니다.

텍스쳐 모드에 대한 타임리프의 모든 기능을 활용하기 위해  새로운 신텍스syntax가 소개되었습니다 예를 들어, 당신은 이와 같이 iterate할 수 있습니다:

[# th:each="item : ${items}"]
    - [# th:utext="${item}" /]
[/]

이 새로운 신텍스에 대한 자세한 설명은 New syntax for textual template modes에서 확인하세요

향상된 인라인 메카니즘 Improved inlining mechanism

다음과 같이 추가적인 태그나 속성을 사용하지 않고 데이터를 손쉽게 출력할 수 있습니다:

<p>This product is called [[${product.name}]] and it's great!</p>

인라인inlining 이라 부르는 이 기능이 상당히 향상되어, 이제 타임리프3에서 훨씬 더 나은 지원이 가능하게 되었습니다. 자세한 정보는 Inlined output expressions를 확인하세요

현존의 인라인 메카니즘 또한 새로운 템플릿 보드에서 잘 작동합니다. 사실 th:inline="text" 속성은 더이상 필요하지 않습니다 왜냐하면 인라인은 이제 HTML 모드 그 자체이기 때문입니다. 자세한 정보는 Refactoring of the inlining mechanism에서 확인하세요

성능 향상 Performance improvements

타임리프 3.0의 주요한 성취는 이전 버전에서 항상 제기되었던 성능의 향상입니다.  2.1 버전까지의 XML기반의 템플릿엔진으로 수많은 훌륭한 강력한 기능들을 구현할 수 있었지만, 때때로 성능의 문제가 있었습니다. 타임리프 랜더링에 걸리는 시간이 많은 주요 프로젝트에서 무시되어 왔지만, 이 위험부담은 (수천개의 열을 가진 테이블을 다루는 고부하가 걸리는 웹사이트와 같은) 특별한 성격을 가지는 프로젝트에서 현저히 드러났습니다. 

타임리프 3 엔진은 성능에 집중하여 처음부터 다시 구현되었습니다. 타임리프3의 성능은 이전버젼보다 훨씬 더 향상되었으므로, 우리는 더욱 더 많은 프로젝트들의 다양한 요구사항을 맞출 수 있게 되었습니다. 그러나 타임리프의 성능은 단지 랜더링 시간뿐만 아니라 더 낮은 메모리 사용과 높은 병렬처리가 필요한 시나리오에 지연시간을 줄일 수 있도록 특별히 디자인되었습니다.

새로운 타임리프 3 아키텍쳐에 대한 기술적 논의는  New event-based template processing engine를 확인하세요

새로운 다이얼렉트 시스템 New Dialect system

타임리프3는 새로운 다이얼렉트 시스템을 특징지었습니다. 만일 이전 버전의 타임리프에서 이 타임리프 다이얼렉트를 개발하려면, 이것을 타임리프3 호환 가능하게 만들어줘야 할 것입니다.

새로운 다이얼렉트 인터페이스는 정말로 간단합니다...

public interface IDialect {
 
    public String getName();
 
}

…그러나 당신이 구현할 IDialecte의 구체적인 서브인터페이스에 의존하여 수많은 기능을 추가할 수 있습니다. 

새로운 다이얼렉트 시스템의 몇가지 기능을 정리해보자면:

  • 처리자processors 뿐만 아니라 선처리자pre-processors 와 후처리자post-processors가 있어 템플릿 컨텐트를 처리 전, 처리 후에 수정이 가능해졌다. 예를 들어, 캐시된 내용을 제공하기위해 선처리자를 사용하고, 출력물을 압축하고 최소화하기위해 후처리자를 사용할 수 있다.
  • 다이얼렉트 우선권Dialect precedence는 다이얼렉트를 가로지르는 프로세서들을 분류할 수 있는 새로운 개념입니다. 프로세서 Processor precedences 이제 다이얼렉트 우선권과 관련있는 걸로 간주되어 특정 다이얼렉트에 있는 모든 프로세서를 단지 다이얼렉트 우선권의 올바른 값을 설정하는 것만으로 다른 다이얼렉트로 부터의 어떤 프로세스 이전에 실행되도록 설정할 수 있습니다.
  • 객체 표현식 다이얼렉트Expression object dialects 는 새로운 객체 표현식 또는 유틸리티 객체 표현식을 제공하여 표준 다이얼렉트가 제공하는  #strings#numbers#dates와 같은 표현식을 템플릿의 어디에서나 사용할 수 있습니다. 
  • provide new expression objects or expression utility objects that can be used in expressions anywhere in templates, such as the #strings#numbers#dates, etc. provided by the Standard Dialect.

이들 기능에 대한 자세한 설명을 다음을 확인하세요:

Core API의 리펙토링 Refactoring of the core APIs

The core API는 아주 많이 리펙터되었습니다. 다음의 디테일을 확인하세요:

결 론 Final thoughts

Thymeleaf 3는 수많은 시간을 들여 공들여 작업한 지난 4년간의 타임리프 템플릿 엔진 프로젝트의 주요한 성과입니다. 훌륭한 새 기능들과 보이지 않는 곳에서의 수많은 성능 향상을 이루어냈습니다.

우리는 이 업데이트가 당신의 프로젝트에 꼭 필요한 요소들을 갖추도록 맞춰왔습니다. 그러니 이것을 시도해보는 것을 망설이지 마시고 피드백을 보내주세요!



반응형

'ReleaseNotes' 카테고리의 다른 글

스프링 부트 1.5 릴리즈 노트  (0) 2017.07.21
스프링 부트 1.4 릴리즈 노트  (0) 2016.08.06
Spring Boot 1.3.0 릴리즈 노트  (0) 2015.11.18
Spring Boot 1.2 릴리즈 노트  (0) 2015.11.18
Spring Boot 1.1 릴리즈노트  (0) 2015.11.18

반응형
스프링 부트 레퍼런스 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