본문 바로가기

IT/SpringBoot

스프링 부트 #4.1 스프링 애플리케이션

반응형

2020/06/14 - [SpringBoot] - 스프링 부트 #1. 개요

2020/06/14 - [SpringBoot] - 스프링 부트 #2. 시작

2020/06/14 - [SpringBoot] - 스프링 부트 #3. 사용

4. 스프링 부트 기능

이 섹션은 스프링 부트의 세부 사항에 대해 다수. 여기에서 사용하고 사용자 지정할 수 있는 주요 기능에 대해 알아볼 수 있습니다. 아직 하지 않은 경우 기본 을 잘 접지할 수 있도록 스프링 부트 " 섹션을사용하여"시작하기"및 ""섹션을 읽으려고 할 수 있습니다.

4.1. 스프링 애플리케이션

이 클래스는 메서드에서 시작되는 스프링 응용 프로그램을 부트스트랩할 수 있는 편리한 방법을 제공합니다. 대부분의 경우 다음 예제와 같이 정적 메서드를 위임할 수 있습니다.SpringApplicationmain()SpringApplication.run

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

응용 프로그램이 시작되면 다음 출력과 유사한 항목이 표시됩니다.

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::   v2.3.1.RELEASE

2019-04-31 13:09:54.117  INFO 56603 --- [           main] o.s.b.s.app.SampleApplication            : Starting SampleApplication v0.1.0 on mycomputer with PID 56603 (/apps/myapp.jar started by pwebb)
2019-04-31 13:09:54.166  INFO 56603 --- [           main] ationConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6e5a8246: startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy
2019-04-01 13:09:56.912  INFO 41370 --- [           main] .t.TomcatServletWebServerFactory : Server initialized with port: 8080
2019-04-01 13:09:57.501  INFO 41370 --- [           main] o.s.b.s.app.SampleApplication            : Started SampleApplication in 2.992 seconds (JVM running for 3.658)

기본적으로 응용 프로그램을 시작한 사용자와 같은 일부 관련 시작 세부 정보를 포함하여 로깅 메시지가 표시됩니다. 이외의 로그 레벨이 필요한 경우 로그 레벨에설명된 대로 로그 레벨을 설정할 수 있습니다. 응용 프로그램 버전은 기본 응용 프로그램 클래스의 패키지에서 구현 버전을 사용하여 결정됩니다. 시작 정보 로깅을 설정하여 끌 수 있습니다. 이렇게 하면 응용 프로그램의 활성 프로필로 로깅이 해제됩니다.INFOINFOspring.main.log-startup-infofalse

  시작 중에 추가 로깅을 추가하려면 . logStartupInfo(boolean)SpringApplication

4.1.1. 시작 실패

응용 프로그램을 시작하지 못하면 등록하면 전용 오류 메시지와 문제를 해결하기 위한 구체적인 작업을 제공할 수 있습니다. 예를 들어 포트에서 웹 응용 프로그램을 시작하고 해당 포트가 이미 사용 중이면 다음 메시지와 유사한 항목이 표시됩니다.FailureAnalyzers8080

***************************
APPLICATION FAILED TO START
***************************

Description:

Embedded servlet container failed to start. Port 8080 was already in use.

Action:

Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
  Spring 부트은 수많은 구현을 제공하며, 당신은 당신의 자신의 를 추가할 수 있습니다. FailureAnalyzer

오류 분석기에서 예외를 처리할 수 없는 경우에도 전체 조건 보고서를 표시하여 무엇이 잘못되었는지 더 잘 이해할 수 있습니다. 이렇게 하려면 디버그 속성을 사용하도록 설정하거나 DEBUG 로깅을 사용하도록 설정해야 합니다.org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

예를 들어, 응용 프로그램을 사용하여 실행 중인 경우 다음과 같이 속성을 활성화할 수 있습니다.java -jardebug

$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug

4.1.2. 게으른 초기화

SpringApplication 응용 프로그램을 느리게 초기화할 수 있습니다. 지연 초기화를 사용하도록 설정하면 응용 프로그램 시작 중에 콩이 필요한 대로 만들어집니다. 따라서 지연 초기화를 사용하면 응용 프로그램을 시작하는 데 걸리는 시간이 단축될 수 있습니다. 웹 응용 프로그램에서 지연 초기화를 사용하도록 설정하면 HTTP 요청이 수신될 때까지 많은 웹 관련 빈이 초기화되지 않습니다.

게으른 초기화의 단점은 응용 프로그램에 대한 문제 발견을 지연시킬 수 있다는 것입니다. 잘못 구성된 콩이 느리게 초기화되면 시작 중에 오류가 더 이상 발생하지 않으며 콩이 초기화될 때만 문제가 나타납니다. 또한 JVM이 시작 중에 초기화된 것뿐만 아니라 모든 응용 프로그램의 콩을 수용할 수 있는 충분한 메모리를 갖도록 주의해야 합니다. 이러한 이유로 지연 초기화는 기본적으로 활성화되지 않으며 지연 초기화를 활성화하기 전에 JVM의 힙 크기를 미세 조정하는 것이 좋습니다.

지연 초기화는 에 있는 방법 또는 메서드를 사용하여 프로그래밍 방식으로 활성화할 수 있습니다. 또는 다음 예제와 같이 속성을 사용하여 활성화할 수 있습니다.lazyInitializationSpringApplicationBuildersetLazyInitializationSpringApplicationspring.main.lazy-initialization

spring.main.lazy-initialization=true
  응용 프로그램의 나머지 부분에 대해 지연 초기화를 사용하는 동안 특정 콩에 대한 게으르기 초기화를 사용하지 않도록 설정하려면 게으자 속성을 표시하여 false로 명시적으로 설정할 수 있습니다. @Lazy(false)

4.1.3. 배너 사용자 지정

시작 시 인쇄된 배너는 클래스 경로에 파일을 추가하거나 속성을 해당 파일의 위치로 설정하여 변경할 수 있습니다. 파일에 UTF-8 이외의 인코딩이 있는 경우 를 설정할 수 있습니다. 텍스트 파일 외에도 클래스 경로에 또는 이미지 파일을 추가하거나 속성을 설정할 수도 있습니다. 이미지는 ASCII 아트 표현으로 변환되고 텍스트 배너 위에 인쇄됩니다.banner.txtspring.banner.locationspring.banner.charsetbanner.gifbanner.jpgbanner.pngspring.banner.image.location

파일 내부에서 다음 자리 표시자를 사용할 수 있습니다.banner.txt

Table 4. Banner variables
변수 설명

${application.version}

에 선언된 대로 응용 프로그램의 버전 번호입니다. 예를 들어.MANIFEST.MFImplementation-Version: 1.01.0

${application.formatted-version}

디스플레이에 대해 선언되고 서식을 지정한 응용 프로그램의 버전 번호(괄호로 둘러싸여 있고 고정됨). 예를 들어.MANIFEST.MFv(v1.0)

${spring-boot.version}

사용 중인 스프링 부트 버전입니다. 예를 들어.2.3.1.RELEASE

${spring-boot.formatted-version}

사용 중인 스프링 부트 버전은 디스플레이를 위해 서식이 지정됩니다(브래킷으로 둘러싸여 있고 고정됨). 예를 들어.v(v2.3.1.RELEASE)

${Ansi.NAME} (또는 , ${AnsiColor.NAME}${AnsiBackground.NAME}${AnsiStyle.NAME})

ANSI 이스케이프 코드의 이름은 어디에 있습니다. 자세한 내용은 AnsiPropertySource를 참조하십시오.NAME

${application.title}

에 선언 된 대로 응용 프로그램의 제목. 예를 들어 로 인쇄됩니다.MANIFEST.MFImplementation-Title: MyAppMyApp

  프로그래밍 방식으로 배너를 생성하려는 경우 메서드를 사용할 수 있습니다. 인터페이스를 사용하고 사용자 고유의 방법을 구현합니다. SpringApplication.setBanner(…​)org.springframework.boot.BannerprintBanner()

또한 속성을 사용하여 배너를 (인쇄해야 하는지), 구성된 로거() 로거로 전송해야 하는지 또는 전혀 생산되지 않는지 확인할 수 있습니다.spring.main.banner-modeSystem.outconsolelogoff

인쇄된 배너는 다음 이름 아래에 싱글톤 빈으로 등록됩니다.springBootBanner

4.1.4. 스프링 애플리케이션 사용자 지정

기본값이 취향에 안 되는 경우 대신 로컬 인스턴스를 만들고 사용자 지정할 수 있습니다. 예를 들어 배너를 끄려면 다음을 작성할 수 있습니다.SpringApplication

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(MySpringConfiguration.class);
    app.setBannerMode(Banner.Mode.OFF);
    app.run(args);
}
  전달된 생성자 인수는 스프링 빈의 구성 소스입니다. 대부분의 경우 클래스에 대한 참조이지만 XML 구성 또는 스캔해야 하는 패키지에 대한 참조일 수도 있습니다. SpringApplication@Configuration

파일을 사용하여 구성할 수도 있습니다. 자세한 내용은 외부화된 구성을 참조하십시오.SpringApplicationapplication.properties

구성 옵션의 전체 목록은 SpringApplication Javadoc을참조하십시오.

4.1.5. 유창한 빌더 API

계층 구조(부모/자식 관계가 있는 여러 컨텍스트)를 빌드해야 하거나 "유창한" 빌더 API를 사용하는 경우 를 사용할 수 있습니다.ApplicationContextSpringApplicationBuilder

다음 예제와 같이 여러 메서드 호출 및 계층 구조를 만들 수 있는 메서드를 함께 연결할 수 있습니다.SpringApplicationBuilderparentchild

new SpringApplicationBuilder()
        .sources(Parent.class)
        .child(Application.class)
        .bannerMode(Banner.Mode.OFF)
        .run(args);
  계층 구조를 만들 때 몇 가지 제한이 있습니다. 예를 들어 웹 구성 요소는 자식 컨텍스트 내에 포함되어야 하며 부모 및 자식 컨텍스트 모두에 동일하게 사용됩니다. 자세한 내용은 스프링애플리케이션빌더 자바독을 참조하십시오. ApplicationContextEnvironment

4.1.6. 응용 프로그램 가용성

플랫폼에 배포할 때 응용 프로그램은 Kubernetes Probes와같은 인프라를 사용하여 플랫폼에 가용성에 대한 정보를 제공할 수 있습니다. 스프링 부트에는 일반적으로 사용되는 "생동감" 및 "준비 상태" 가용성 상태에 대한 즉시 사용 가능한 지원이 포함됩니다. Spring Boot의 "액추에이터" 지원을 사용하는 경우 이러한 상태는 상태 끝점 그룹으로 노출됩니다.

또한 인터페이스를 자신의 콩에 주입하여 가용성 상태를 얻을 수도 있습니다.ApplicationAvailability

생생활 상태

응용 프로그램의 "Liveness" 상태는 내부 상태가 제대로 작동할 수 있는지 또는 현재 실패하는 경우 자체적으로 복구할 수 있는지 여부를 알려줍니다. "Liveness" 상태가 손상되면 응용 프로그램이 복구할 수 없는 상태이며 인프라가 응용 프로그램을 다시 시작해야 합니다.

  일반적으로 "생생활" 상태는 상태 확인과같은 외부 검사를 기반으로 해서는 안 됩니다. 이 경우 실패한 외부 시스템(데이터베이스, 웹 API, 외부 캐시)은 플랫폼 전반에 걸쳐 대규모 다시 시작 및 계단식 오류를 트리거합니다.

스프링 부트 응용 프로그램의 내부 상태는 대부분 스프링으로 표시됩니다. 응용 프로그램 컨텍스트가 성공적으로 시작된 경우 Spring Boot는 응용 프로그램이 유효한 상태라고 가정합니다. 컨텍스트가 새로 고쳐지는 즉시 응용 프로그램이 라이브로 간주되며 스프링 부트 응용 프로그램 수명 주기 및 관련 응용 프로그램 이벤트를참조하십시오.ApplicationContext

준비 상태

응용 프로그램의 "준비 상태" 상태는 응용 프로그램이 트래픽을 처리할 준비가 되었는지 여부를 알려줍니다. 실패한 "준비" 상태는 플랫폼에 당분간 응용 프로그램으로 트래픽을 라우팅해서는 안 된다고 알려줍니다. 이는 일반적으로 시작 중에 발생하며 구성 요소가 처리되는 동안 또는 응용 프로그램이 추가 트래픽에 너무 많은 것으로 결정하는 경우 언제든지 발생합니다.CommandLineRunnerApplicationRunner

응용 프로그램 및 명령줄 러너가 호출되는 즉시 응용 프로그램이 준비된 것으로 간주되며 스프링 부트 응용 프로그램 수명 주기 및 관련 응용 프로그램 이벤트를참조하십시오.

  시작 중에 실행될 것으로 예상되는 작업은 스프링 구성 요소 수명 주기 콜백을 사용하는 대신 구성 요소에 의해 실행되어야 합니다. CommandLineRunnerApplicationRunner@PostConstruct
응용 프로그램 가용성 상태 관리

응용 프로그램 구성 요소는 인터페이스를 삽입하고 메서드를 호출하여 언제든지 현재 가용성 상태를 검색할 수 있습니다. 응용 프로그램은 상태 업데이트를 듣거나 응용 프로그램의 상태를 업데이트하려고 하는 경우가 많습니다.ApplicationAvailability

예를 들어, Kubernetes "exec Probe"가 이 파일을 볼 수 있도록 응용 프로그램의 "준비 상태" 상태를 파일로 내보낼 수 있습니다.

@Component
public class ReadinessStateExporter {

    @EventListener
    public void onStateChange(AvailabilityChangeEvent<ReadinessState> event) {
        switch (event.getState()) {
        case ACCEPTING_TRAFFIC:
            // create file /tmp/healthy
        break;
        case REFUSING_TRAFFIC:
            // remove file /tmp/healthy
        break;
        }
    }

}

응용 프로그램이 중단되고 복구할 수 없는 경우 응용 프로그램의 상태를 업데이트할 수도 있습니다.

@Component
public class LocalCacheVerifier {

    private final ApplicationEventPublisher eventPublisher;

    public LocalCacheVerifier(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }

    public void checkLocalCache() {
        try {
            //...
        }
        catch (CacheCompletelyBrokenException ex) {
            AvailabilityChangeEvent.publish(this.eventPublisher, ex, LivenessState.BROKEN);
        }
    }

}

4.1.7. 응용 프로그램 이벤트 및 청취자

컨텍스트 새로 고침 이벤트와같은 일반적인 스프링 프레임워크 이벤트 외에도 몇 가지 추가 응용 프로그램 이벤트를 보냅니다.SpringApplication

 

일부 이벤트는 실제로 생성되기 전에 트리거되므로 해당 이벤트에 리스너를 로 등록할 수 없습니다. 메서드 또는 메서드에 등록할 수 있습니다.ApplicationContext@BeanSpringApplication.addListeners(…​)SpringApplicationBuilder.listeners(…​)

응용 프로그램이 생성되는 방식에 관계없이 이러한 수신기를 자동으로 등록하려면 다음 예제와 같이 키를 사용하여 프로젝트에 파일을 추가하고 리스너(들)를 참조할 수 있습니다.META-INF/spring.factoriesorg.springframework.context.ApplicationListener

org.springframework.context.ApplicationListener=com.example.project.MyListener

응용 프로그램이 실행될 때 응용 프로그램 이벤트는 다음 순서로 전송됩니다.

  1. 실행 시작 시이지만 임의 및 초기화기 등록을 제외하고 처리하기 전에 A가 전송됩니다.ApplicationStartingEvent
  2. 컨텍스트에서 사용할 컨텍스트를 알 수 있지만 컨텍스트가 만들어지기 전에 A가 전송됩니다.ApplicationEnvironmentPreparedEventEnvironment
  3. A가 준비되고 응용 프로그램 컨텍스트 이니티저가 호출되었지만 콩 정의가 로드되기 전에 전송됩니다.ApplicationContextInitializedEventApplicationContext
  4. 새로 고침이 시작되기 직전에 는 콩 정의가 로드된 후 A가 전송됩니다.ApplicationPreparedEvent
  5. 컨텍스트가 새로 고쳐진 후 하지만 응용 프로그램 및 명령줄 주자가 호출되기 전에 A가 전송됩니다.ApplicationStartedEvent
  6. 응용 프로그램이 라이브로 간주되는 지 나타내기 위해 바로 전송됩니다.AvailabilityChangeEventLivenessState.CORRECT
  7. 응용 프로그램 및 명령줄 주자가 호출된 후 A가 전송됩니다.ApplicationReadyEvent
  8. 응용 프로그램이 서비스 요청을 할 준비가 되었음을 나타내기 위해 A가 바로 전송됩니다.AvailabilityChangeEventReadinessState.ACCEPTING_TRAFFIC
  9. 시작에 예외가 있는 경우 A가 전송됩니다.ApplicationFailedEvent

위의 목록에는 .에 연결된 s만 포함됩니다. 이 외에도 다음 이벤트는 다음과 같은 항목도 게시됩니다.SpringApplicationEventSpringApplicationApplicationPreparedEventApplicationStartedEvent

  1. 새로 고칠 때 A가 전송됩니다.ContextRefreshedEventApplicationContext
  2. A가 준비된 후에 전송됩니다. 각각 서슬레 및 반응성 변형입니다.WebServerInitializedEventWebServerServletWebServerInitializedEventReactiveWebServerInitializedEvent
  응용 프로그램 이벤트를 사용할 필요는 없지만 응용 프로그램이 존재한다는 것을 아는 것이 편리할 수 있습니다. 내부적으로 스프링 부트은 이벤트를 사용하여 다양한 작업을 처리합니다.

스프링 프레임워크의 이벤트 게시 메커니즘을 사용하여 응용 프로그램 이벤트가 전송됩니다. 이 메커니즘의 일부는 하위 컨텍스트에서 청취자에게 게시된 이벤트도 모든 조상 컨텍스트에서 청취자에게 게시되도록 합니다. 따라서 응용 프로그램에서 인스턴스 계층 구조를 사용하는 경우 리스너는 동일한 유형의 응용 프로그램 이벤트의 여러 인스턴스를 받을 수 있습니다.SpringApplication

수신기가 해당 컨텍스트에 대한 이벤트와 하위 컨텍스트에 대한 이벤트를 구분하도록 하려면 응용 프로그램 컨텍스트가 주입된 다음 주입된 컨텍스트를 이벤트의 컨텍스트와 비교하도록 요청해야 합니다. 컨텍스트를 구현하거나 수신기가 콩인 경우 를 사용하여 컨텍스트를 주입할 수 있습니다.ApplicationContextAware@Autowired

4.1.8. 웹 환경

적합한 형식을 대신작성하려고 합니다. a를 결정하는 데 사용되는 알고리즘은 매우 간단합니다.SpringApplicationApplicationContextWebApplicationType

  • 스프링 MVC가 있는 경우AnnotationConfigServletWebServerApplicationContext
  • 스프링 MVC가 존재하지 않고 스프링 웹플럭스가 있는 경우AnnotationConfigReactiveWebServerApplicationContext
  • 그렇지 않으면AnnotationConfigApplicationContext

즉, 스프링 MVC와 스프링 웹플럭스의 새 를 동일한 응용 프로그램에서 사용하는 경우 스프링 MVC가 기본적으로 사용됩니다. 호출하여 쉽게 재정의할 수 있습니다.WebClientsetWebApplicationType(WebApplicationType)

호출하는 데 사용되는 형식을 완벽하게 제어할 수도 있습니다.ApplicationContextsetApplicationContextClass(…​)

  JUnit 테스트 내에서 사용할 때 호출하는 것이 바람직합니다. setWebApplicationType(WebApplicationType.NONE)SpringApplication

4.1.9. 응용 프로그램 인수에 액세스

전달된 응용 프로그램 인수에 액세스해야 하는 경우 콩을 주입할 수 있습니다. 인터페이스는 다음 예제와 같이 원시 인수와 구문 분석 및 인수 모두에 대한 액세스를 제공합니다.SpringApplication.run(…​)org.springframework.boot.ApplicationArgumentsApplicationArgumentsString[]optionnon-option

import org.springframework.boot.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.stereotype.*;

@Component
public class MyBean {

    @Autowired
    public MyBean(ApplicationArguments args) {
        boolean debug = args.containsOption("debug");
        List<String> files = args.getNonOptionArgs();
        // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"]
    }

}
  스프링 부트는 또한 스프링에 등록합니다. 이렇게 하면 어플란을 사용하여 단일 응용 프로그램 인수를 삽입할 수도 있습니다. CommandLinePropertySourceEnvironment@Value

4.1.10. 응용 프로그램 러너 또는 명령라인 러너 사용

시작되면 특정 코드를 실행해야 하는 경우 또는 인터페이스를 구현할 수 있습니다. 두 인터페이스는 동일한 방식으로 작동하며 완료 직전에 호출되는 단일 메서드를 제공합니다.SpringApplicationApplicationRunnerCommandLineRunnerrunSpringApplication.run(…​)

인터페이스는 응용 프로그램 인수에 대한 액세스를 간단한 문자열 배열로 제공하는 반면 이전에 설명한 인터페이스를 사용합니다. 다음 예제에서는 메서드가 있는 예제를 보여 주겠습니다.CommandLineRunnerApplicationRunnerApplicationArgumentsCommandLineRunnerrun

import org.springframework.boot.*;
import org.springframework.stereotype.*;

@Component
public class MyBean implements CommandLineRunner {

    public void run(String... args) {
        // Do something...
    }

}

특정 순서로 호출해야 하는 여러 개 또는 원두가 정의된 경우 인터페이스를 추가로 구현하거나 부호를 사용할 수 있습니다.CommandLineRunnerApplicationRunnerorg.springframework.core.Orderedorg.springframework.core.annotation.Order

4.1.11. 응용 프로그램 종료

각 종은 JVM에 종료 후크를 등록하여 종료시 우아하게 닫히도록 합니다. 모든 표준 스프링 라이프사이클 콜백(예: 인터페이스 또는 어노칭)을 사용할 수 있습니다.SpringApplicationApplicationContextDisposableBean@PreDestroy

또한, 콩은 호출될 때 특정 종료 코드를 반환하려는 경우 인터페이스를 구현할 수 있다. 그런 다음 다음 예제와 같이 이 종료 코드를 전달하여 상태 코드로 반환할 수 있습니다.org.springframework.boot.ExitCodeGeneratorSpringApplication.exit()System.exit()

@SpringBootApplication
public class ExitCodeApplication {

    @Bean
    public ExitCodeGenerator exitCodeGenerator() {
        return () -> 42;
    }

    public static void main(String[] args) {
        System.exit(SpringApplication.exit(SpringApplication.run(ExitCodeApplication.class, args)));
    }

}

또한 인터페이스는 예외에 의해 구현될 수 있습니다. 이러한 예외가 발생하면 스프링 부트은 구현된 메서드에서 제공하는 종료 코드를 반환합니다.ExitCodeGeneratorgetExitCode()

4.1.12. 관리자 기능

속성을 지정하여 응용 프로그램에 대한 관리자 관련 기능을 활성화할 수 있습니다. 이것은 플랫폼에 스프링 응용 프로그램AdminMXBean을 노출합니다. 이 기능을 사용하여 스프링 부트 응용 프로그램을 원격으로 관리할 수 있습니다. 이 기능은 모든 서비스 래퍼 구현에도 유용할 수 있습니다.spring.application.admin.enabledMBeanServer

  응용 프로그램이 실행 중인 HTTP 포트에 대해 알고 싶다면 키가 있는 속성을 가져옵니다. local.server.port

Spring Boot Reference Documentation

Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, Christian Dupuis, Sébastien Deleuze, Michael Simons, Vedran Pavić, Jay Bryant, Madhura Bhave, Eddú Meléndez, Scott Frederick

2.3.1.RELEASE

Copyright © 2012-2020

Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.

출처 : https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/htmlsingle/#boot-features

반응형

'IT > SpringBoot' 카테고리의 다른 글

스프링 부트 #4.3-4 프로필/로깅  (0) 2020.06.14
스프링 부트 #4.2 외부화된 구성  (0) 2020.06.14
스프링 부트 #3. 사용  (0) 2020.06.14
스프링 부트 #2. 시작  (0) 2020.06.14
스프링 부트 #1. 개요  (0) 2020.06.14