개발강의정리/Spring

[스프링 부트 개념과 활용] 4-2. SpringApplication 2부

nineDeveloper 2019. 10. 23.
728x90

스프링 부트 개념과 활용

4. 스프링 부트 활용

포스팅 참조 정보

GitHub

공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다

해당 포스팅에 대한 내용의 GitHub 주소

실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다

https://github.com/freespringlecture/springboot-concept-uses/tree/chap04-02-02-springapplication

 

freespringlecture/springboot-concept-uses

백기선님의 스프링 부트 개념과 활용 강의 내용 정리. Contribute to freespringlecture/springboot-concept-uses development by creating an account on GitHub.

github.com

해당 포스팅 참고 인프런 강의

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

스프링 부트 개념과 활용 - 인프런

스프링 부트의 원리 및 여러 기능을 코딩을 통해 쉽게 이해하고 보다 적극적으로 사용할 수 있는 방법을 학습합니다. 중급 프레임워크 및 라이브러리 Spring Spring Boot 온라인 강의

www.inflearn.com

실습 환경

  • Java Version: Java 11
  • SpringBoot Version: 2.1.2.RELEASE

2. SpringApplication 2부

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html#boot-features-application-events-and-listeners

불러오는 중입니다...

ApplicationEvent 등록

ApplicationContext를 만들기 전에 사용하는 리스너는 @Bean으로 등록할 수 없다

SampleListner 작성

ApplicationStartingEvent 는 ApplicationContext 가 만들어기 전에 발생하는 이벤트이므로 빈등록 설정을 해도 빈으로 등록할 수 없음

public class SampleListener implements ApplicationListener<ApplicationStartingEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartingEvent event) {
        System.out.println("=======================");
        System.out.println("Application is Starting");
        System.out.println("=======================");
    }
}

addListners()

application.addListeners(new SampleListener());

빈으로 등록 가능한 Listener 예시

ApplicationStartedEvent 의 경우 ApplicationContext 가 만들어진 다음에 발생하는 이벤트이므로 빈으로 등록해서 서용 가능

@Component
public class StartedListener implements ApplicationListener<ApplicationStartedEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("===================");
        System.out.println("Application Started");
        System.out.println("===================");
    }
}

WebApplicationType 설정

SERVLET이 없고 REACTIVE로 동작하지만 SERVLET이 있으면 무조건 SERVLET로 동작함
Spring MVC가 들어있으면 기본적으로 SERVLET로 동작함
Spring Webfulx가 들어있으면 기본적으로 REACTIVE로 동작함
SERVLET, REACTIVE둘다 없으면 NONE로 동작

WebApplicationType 종류

NONE : WebApplication 사용안함 설정

application.setWebApplicationType(WebApplicationType.NONE);

SERVLET : SERVLET 사용 설정

application.setWebApplicationType(WebApplicationType.SERVLET);

REACTIVE : REACTIVE 사용 설정

application.setWebApplicationType(WebApplicationType.REACTIVE);

Application Arguments

-D 들어오는 옵션은 JVM 옵션 --로 들어오는 옵션은 Program arguments

TEST Code

--으로 옵션을 준 bar만 Application Arguments 이므로 true로 출력됨

@Component
public class SampleArguments {

    public SampleArguments(ApplicationArguments arguments) {
        System.out.println("foo: "+arguments.containsOption("foo"));
        System.out.println("bar: "+arguments.containsOption("bar"));
    }
}

Console 에서 테스트

  1. 먼저 Maven Clean 후 패키징

    mvn clean package -DskipTests
  2. target 폴더에서 java -jar 명령으로 Test

    java -jar springinit-0.0.1-SNAPSHOT.jar --foo --bar

Application 실행한 뒤 뭔가 실행하고 싶을때

두가지가 있지만 ApplicationRunner 사용을 추천함
둘다 JVM 옵션은 받지 못하고 Application Arguments 옵션(--)으로 준 값만 받을 수 있음
ApplicationRunner이 여러개이면 @Order(1) 로 순서를 주어 우선순위를 정할 수 있음 숫자가 낮을 수록 우선순위가 높음

ApplicationRunner

아래와 같이 ApplicationRunner 를 상속받아 코드를 작성하면 Application 실행한뒤 로직을 실행함

@Component
public class SampleRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("foo: "+args.containsOption("foo"));
        System.out.println("bar: "+args.containsOption("bar"));
    }
}

CommandLineRunner

@Component
public class SampleCommandLineRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        Arrays.stream(args).forEach(System.out::println);
    }
}
728x90

댓글

💲 추천 글