본문 바로가기

spring/boot

1장 스프링 부트 시작하기 - 실전 스프링 부트

1.1 스프링 부트 소개

1.1.1 왜 스프링 부트 인가?

개발자가 애플리케이션을 신속히 만들어서 구동 가능하게 해주고 복잡한 설정 지옥에서 해방시켜 줌

1.1.2 스프링 부트는 무엇인가?

스프링 프레임워크와 개발자 사이에 존재하는 계층으로서 설정을 단순화해 주는 역할을 하는 것

1.1.3 스프링 부트 핵심 기능

  • 빠른 시동
    • 개발자가 애플리케이션에 필요한 의존 관계를 명시하기만 하면 실행가능
  • 자동 구성
    • 클래스패스에 있는 JAR 파일이나 여러 가지 설정 파일에 지정된 프로퍼티 정보를 바탕으로 스프링 애플리케이션에 필요한 최소한의 컴포넌트를 알아서 자동 구성
  • 미리 정의된 방식
    • 미리 정의된 의존 관계를 통해서 개발자가 의존성 관리에서 자유로워지고 빠른 개발이 가능
  • 독립 실행형
    • JAR 파일로 패키징 되어 외부 WAS 없이 독립적으로 실행할 수 있다.
  • 실제 서비스 환경 사용 가능
    • 애플리케이션 모니터링이나 유지 관리를 손쉽게 처리할 수 있다.

1.3 스프링 부트 시작하기

1.3.5 스프링 부트 애플리케이션 종료

스프링 부트 애플리케이션이 종료되더라도 처리 중인 요청은 처리하고 프로세스를 종료하도록 하는 방법

server.shutdown=graceful # default immediate
spring.lifecycle.timeout-per-shutdown-phase=1m # default 30s

1.4 스프링 부트 기타 개념

1.4.1 스프링 부트 스타트업 이벤트

event description
ApplicationStartingEvent 애플리케이션이 시작되고 리스너가 등로되면 발행된다.
ApplicationEnvironmentPreparedEvent 애플리케이션이 시작되고 Environment가 준비되어 검사하고 수정할 수 있게 되면 발행된다.
ApplicationContextInitializedEvent ApplicationContext가 준비되고 ApplicationContextInitailizers가 실행되면 발행된다.
ApplicationPreparedEvent ApplicationContext가 준비되고 빈이 로딩이 됐지만 아직 ApplicationContext가 리프레시되지는 않은 시점에서 발행된다.
ContextrefreshedEvent ApplicationContext가 리프레시된 후에 발행된다.
WebServerInitailizedEvent 웹 서버가 준비되면 발행된다.
ApplicationStartedEvent ApplicationContext가 리프레시되고 나서 ApplicationRunnerCommandLineRunner가 호출되기 전에 발행된다.
ApplicationReadyEvent 애플리케이션 요청을 처리할 준비가 됐을 때 SpringApplication에 의해 발행된다.
ApplicationFailedEvent 애플리케이션 시작 과정에서 예외가 발생하면 발행된다.

1.4.2 스프링 부트 애플리케이션 이벤트 감지

  • @EventListener를 사용
@EventListener(ApplicationReadyEvent.class)
public void applicationReadyEvent(ApplicationReadyEvent applicationReadyEvent){
        System.out.println("Application Ready Event generated at "+new Date(applicationReadyEvent.getTimestamp()));
        }
  • 커스텀 구현체 작성 with 람다

ApplicationStartingEventApplicationEnvironmentPreparedEvent처럼 애플리케이션 스타트업 극초기에 발행되는 이벤트는 감지하지 못해서 커스텀 방법을 사용한다.

public static void main(String[]args){
        var springApp=new SpringApplication(SpringBootExampleApplication.class);

        springApp.addListeners((ApplicationListener<ApplicationStartingEvent>)event->{
        System.out.println("Application Starting Event logged at "+new Date(event.getTimestamp()));
        });

        springApp.run(args);
        }

 

REFERENCE

도서 - 실전 스프링 부트