Skip to content
실전에 써먹는 스프링 부트 2 이야기
Kotlin
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.idea 이제 좀 구색을 갖추었...을까? @_@);; 음트트트 Apr 24, 2019
.imgs Init Project: 실전에 써먹는 스프링 부트 이야기 Apr 7, 2019
bootiful-api/src 로컬 환경에서 실행하도록 속성 변경 Apr 26, 2019
bootiful-core/src 내용 조금 변경. 발표가 낼모레다!! Apr 25, 2019
bootiful-sbadmin 로컬 환경에서 실행하도록 속성 변경 Apr 26, 2019
gradle/wrapper Init Project: 실전에 써먹는 스프링 부트 이야기 Apr 7, 2019
.gitignore 해냈다!! 크흡... 하루를 삽질했네. Apr 16, 2019
README.adoc 내용 조금 변경. 발표가 낼모레다!! Apr 25, 2019
build.gradle.kts
gradlew
gradlew.bat Init Project: 실전에 써먹는 스프링 부트 이야기 Apr 7, 2019
settings.gradle.kts Init Project: 실전에 써먹는 스프링 부트 이야기 Apr 7, 2019

README.adoc

실전에 써먹는 스프링 부트 이야기

설치 및 실행

$ git clone git@github.com:ihoneymon/bootiful-your-life.git
$ cd bootiful-your-life

// spring-boot-admin-server
$ ./gradlew :bootiful-sbadmin:bootRun

// spring-boot-api
$ ./gradlew :bootiful-api:bootRun

실전에 써먹는 스프링 부트 이야기

스프링 부트 소개

스프링 부트를 한마디로 소개한다면,

스프링 프레임워크를 기반으로 한 개발 플랫폼

이라고 할 수 있습니다.

그래서 스프링 부트를 잘 사용하려면 스프링 프레임워크에 대한 개념과 작동원리를 이해하는 과정이 필요하다. 물론 스프링 프로그래밍 모델을 알고 있으면 더욱 손쉽게 사용할 수 있다.

'스프링 프레임워크가 자바 표준 프레임워크가 되었다면, 스프링 부트는 자바 표준 개발플랫폼이 되었다’고 말할 수 있다.

Note
개발플랫폼

'개발플랫폼(Development Platform)'이라 불리기 위해서는 개발에 필요한 라이브러리 의존성 관리, 빌드 및 배포, 나아가서 운영을 위한 편의기능까지 제공할 수 있어야 한다. 스프링 부트는 개발 및 운영 전과정을 아우르는 기능을 제공한다. 그래서 최근 스프링 부트에 대한 관심이 높아지고 이용이 늘어나고 있다. 당분간은 자바 진영에서 스프링 부트를 압도할만한 개발플랫폼이 나올 것 같지 않다.

스프링 부트 아키텍처

스프링 부트는 동기방식의 '서블릿 스택’과 비동기 방식의 '리액티브 스택’을 모두 지원한다. 이런 스택의 양분은 스프링 프레임워크 5.0부터 리액터(Reactor)를 품으면서 가능해졌습니다.

내가 생각하는 스프링 부트 사용수준

수준 설명

초급

spring-boot-starter-web 을 기반으로 API를 ‘어떻게든’ 구현한다.

중급

자신에게 필요한 기능을 가진 starter를 ‘추가’하여 web 이외의 기능을 사용한다.

고급

스프링 부트가 제공하는 ‘관례’적 구성을 살피고 ‘외부 구성 속성’을 이용해서 사용하는 기능을 ‘스스로’ 제어한다.

특급

필요한 경우’ 스프링 부트 자동구성을 비활성화하고 스프링 프레임워크나 스프링 부트가 제공하는 ‘인터페이스’를 구현하여 ‘자기 입맛’에 맞게 사용한다.

BCD(Build - Code - Deploy)

  • Build: 스프링 부트에서 Gradle/Maven 에서 동작하는 스프링 부트 플러그인 제공

  • Code: 스프링 프로그래밍 모델을 제공하여 비즈니스 로직 구현에만 집중

  • Deploy: 빌드 과정에서 자기완비적인 실행가능한 JAR 형태로 패키징

Build

작성한 코드를 실행할 수 있는 라이브러리와 함께 패키징(Packaging)하여 배포하기 위한 준비과정이다.

빌드도구

빌드도구는 프로젝트에 필요한 의존성 라이브러리를 다운로드 받고 개발자가 작성한 코드를 컴파일하여 배포가능한 아카이브 파일로 패키징하는 역할을 수행한다. 자바쪽에서는 그레이들과 메이븐이 큰 세력을 형성하고 있다.

빌드도구(Build tool), 당신의 선택은?
빌드 스크립트(Gradle DSL)

그레이들 DSL 은 처음에는 그루비(Groovy)를 사용했다. 코틀린에서 자신의 영향력을 키우기 위한 목적으로 '그레이들 코틀린 DSL’을 제공하여 그레이들 5.0에 채택되어 제공되기 시작한다. 그루비와는 다른 언어적 특징을 가지고 있는 코틀린이고 안드로이드 개발에서 널리쓰이고 있는 언어이기에 안드로이드 개발자들에게는 무척 친숙하게 다가갈 수 있을 것이다.

DSL, 당신의 선택은?

build.gradle.kts
그레이들 빌드 스크립트 대세는 코틀린!! Gradle Kotlin DSL로 가자!!

그루비의 자유로운 문법보다는 조금 제약이 있는 코틀린을 통해 통일성 있는 빌드스크립트로 거듭나기!

Note

그레이들 개발팀에서는 자동 빌드불러오기(automatic build import)는 비활성화(disable)하고, 플러그인를 선언하는 스크립트 의존성은 자동적재(automatic reloading)을 활성화 하는 것을 권장한다.

Note

2 가지가 지원되어야 한다:

  • 코틀린 플러그인: 인텔리제이/안드로이드 스튜디오

  • 그레이들(5.0 이상)

dependencies: compile vs api vs implementation
  • compile: Gradle 5.0 부터 Deprecated 선언되었으니 쓰지말자. implementation 을 사용하자.

  • api: 해당 모듈을 참조하는 다른 모듈에 클래스패스가 노출된다.

  • implementation: 해당 모듈 내에서만 사용가능하고 일반적으로 사용한다.

스프링 부트 그레이들 플러그인

스프링 부트 플러그인은 그레이들과 메이븐을 각각 지원한다. 각 빌드도구에서 프로젝트를 그대로 실행할 수 있는 bootRun 기능과 실행가능한 아카이브 파일을 만드는 bootJar 혹은 bootWar 기능을 제공한다.

  • spring-boot-maven-plugin

  • spring-boot-gradle-plugin

의존성관리

의존성 관리(Dependency management)는 빌드도구를 이용하는 우리가 바라는 가장 큰 기능 중 하나다. 중앙저장소(Central Repository) 혹은 넥서스를 설치하여 구성한 사설저장소(Private Repository)를 이용하여 의존성 라이브러리를 등록하고 프로젝트에 다운로드하여 코딩 및 배포를 위한 빌드시 이용한다.

  • spring-boot-parent & spring-boot-auto-configure & spring-boot-dependency

실행가능한 압축 패키징
  • bootJar, bootWar

  • 전통적 배포방식 War

  • 자기완비적 실행가능한 Jar

Code

스프링 프로그래밍 모델

스프링 프레임워크가 제공하는 컴포넌트 및 작동원리를 이해하면 누구나 애플리케이션을 손쉽게 만들 수 있다.

  • @Component

    • @Repository

    • @Service

    • @Controller

스프링 부트는 컴포넌트 스캔방식으로 각 계층별 컴포넌트를 스캔하여 빈으로 등록한다. 이는 과거의 애플리케이션 컨텍스트파일(application-context.xml)을 한땀한땀 작성하던 때와는 조금 다른 접근방식을 가지게 된다.

스프링 부트 자동구성

스프링 부트의 자동구성과 관련된 내용은 spring-boot-auto-configure 모듈에 등록되어 있다. 그 내용을 살펴보면

  • @EnableAutoConfiguration + ~AutoConfiguration

  • @ComponentScan

  • @Conditional~

프로파일

  • 소스코드(@Profile)

  • 애플리케이션 속성(application-{profile}.yml)

외부 구성

애플리케이션을 패키징한 후에 내부 속성을 실행인자로 변경한다.

@ConfigurationProperties

  • 기존 @Value를 이용한 애플리케이션 속성이용

  • @ConfigurationProperties 를 이용한 애플리케이션 속성이용

  • spring-boot-configuration-processor 필요함

spring-configuration-metadata.json

@ConfigurationProperties 선언된 클래스를

Deploy

배포라기 보다는 배포 후 애플리케이션의 모니터링과 관리가 중심

액츄에이터

  • spring-boot-starter-actuator 를 추가하면 기능을 제공!

  • HTTP 혹은 JMX를 통해서 애플리케이션의 상태를 모니터링하고 관리한다.

  • 애플리케이션 종단점(Endpoint) 제공

  • 마이크로미터(Micrometer)를 통한 다양한 모니터링 시스템 지원

  • 실제로는 Actuator Health Endpoint 만 남겨두고 나머지는 비활성화

    • PinPoint, New Relic 를 이용중인데 Java Agent

  • Spring Boot Admin

You can’t perform that action at this time.