반응형

1. 이벤트 리스너 : 이벤트가 발생할 때 알려주는 것

public class SampleListener implements ApplicationListener<ApplicationStartingEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartingEvent applicationStartingEvent) {
        System.out.println("==========================");
        System.out.println("Application is Starting...");
        System.out.println("==========================");
    }
}

SampleListener.java

 

But, ApplicationStartingEvent는 ApplicationContext가 만들어지기 전에 발생하기 때문에 

빈에 넣어준다고 하더라도 실행되지 않는다.

 

@SpringBootApplication
public class Application {

	public static void main(String[] args) {

		SpringApplication app = new SpringApplication(Application.class);
		app.addListeners(new SampleListener());
		app.run(args);

	}
}

Application.java

 

메인에서 app.addListeners(new SampleListener()); 로 직접 만들어 주어야 한다.

 

 

2. ApplicationContext가 만들어진 후에 발생하는 이벤트들은 @Component 로 빈에 등록하여 실행시켜주면 된다.

@Component
public class SampleListener implements ApplicationListener<ApplicationStartedEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartedEvent applicationStartedEvent) {
        System.out.println("==========================");
        System.out.println("Application is Started...");
        System.out.println("==========================");
    }
}

SampleListener.java

 

- ApplicationStartedEvent는 ApplicationContext가 만들어진 후에 발생한다.

 

 

 

3. app.setWebApplicationType();

에는 WebApplicationType.NONE, WebApplicationType.SERVLET, WebApplicationType.REACTIVE가 있다.

 

기본적으로는 SERVLET !

WebFlux를 사용하고 싶다면, REACTIVE

사용하고 싶지 않다면, NONE

 

 

 

4. 애플리케이션 아규먼츠 사용하기

* ApplicationArguments

SpringApplication을 실행할 때 program arguments에 대해 추상화된 액세스 기능을 제공하는 인터페이스이다.

 

@Component
public class SampleListener {

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

-> 빈에 생성자가 한 개이고, 그 생성자의 파라미터가 빈일 경우에는 그 빈을 스프링이 알아서 주입해줌

 

 

< 결과 >

foo: false
bar: true

-> VM option은 ApplicationArgument 가 아님

 

 

 

5. 애플리케이션 실행 후 뭔가 추가적으로 실행하고 싶을 때

  • ApplicationRunner (추천) 또는 CommandLineRunner
  • 순서 지정 가능 @Order
@Component
public class SampleListener implements ApplicationRunner {

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

    @Override
    public void run(String... args) throws Exception {
        Arrays.stream(args).forEach(System.out::println);

    }
}

 

반응형
반응형

 

1. 커스터마이징


@SpringBootApplication
public class Application {

	public static void main(String[] args) {

		SpringApplication.run(Application.class, args);

	}

}

-> 이렇게 쓰는 것보다

 


@SpringBootApplication
public class Application {

	public static void main(String[] args) {
    
		SpringApplication app = new SpringApplication(Application.class);
		app.run(args);

	}

}

-> 이렇게 쓰는 게 커스터마이징하기 좋음

 

 

 

2. 디버그 모드

 

 

-> VM options에 -Ddebug

OR

-> Program arguments에 --debug

 

라고 적으면 디버그 모드 실행

: 로그에 디버그 레벨까지 찍힘

: 어떤 자동설정이 들어갔는지 찍힘, 어떠한 자동설정이 왜 안 찍혔는지 알려줌

 

 

 

3. 배너 넣기 & 커스터마이징

resources 폴더 아래 'banner.txt'라는 파일 생성

-> 원하는 배너 작성

-> 실행 시, 작성한 배너가 찍혀 나옴

gif, jpg, png 같은 이미지 파일도 가능

 

 

공식 문서 4.1.3 Customizing the Banner

docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#deployment

 

Spring Boot Reference Documentation

This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe

docs.spring.io

-> 일부는 manifest가 생성된 상태에서만 나타남

 

 

 

 

 

4. mvn package (패키징)

jars 파일 하나에 모든 것을 담아줌 -> jar 파일 하나만 실행시키면 됨

 

-> manifest 파일을 만들어줌 -> java -jar target/spring-application-0.0.1-SNAPSHOT.jar

 

 

 

 

5. 코딩으로 배너 구현

@SpringBootApplication
public class Application {

	public static void main(String[] args) {

		SpringApplication app = new SpringApplication(Application.class);
		app.setBanner(new Banner() {
			@Override
			public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
				out.println("--------------------------");
				out.println("실행시이이이이작");
				out.println("--------------------------");

			}
		});
		app.run(args);
	}
}
@SpringBootApplication
public class Application {

	public static void main(String[] args) {

		new SpringApplicationBuilder()
				.sources(Application.class)
				.banner(new Banner() {
					@Override
					public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
						out.println("++++++++++++++++++++++");
						out.println("++++++++++++++++++++++");
						out.println("++++++++++++++++++++++");

					}
				})
				.run(args);
	}
}

 

But, banner.txt 파일과 코딩 둘 다 있다면 banner.txt 파일이 이김

 

 

 

6. 코딩으로 배너 끄기

@SpringBootApplication
public class Application {

	public static void main(String[] args) {

		SpringApplication app = new SpringApplication(Application.class);
		app.setBannerMode(Banner.Mode.OFF);
		app.run(args);
	}
}

 

 

반응형
반응형

 

- 독립적으로 실행되는 jar 파일

mvn package를 하면 실행 가능한 JAR 파일 “하나가" 생성 됨.

spring-maven-plugin이 해주는 일 (패키징)

과거 “uber” jar 를 사용

모든 클래스 (의존성 및 애플리케이션)를 하나로 압축하는 방법

뭐가 어디에서 온건지 알 수가 없음

무슨 라이브러리를 쓰는건지..

내용은 다르지만 이름이 같은 파일은 또 어떻게?

스프링 부트의 전략

내장 JAR : 기본적으로 자바에는 내장 JAR를 로딩하는 표준적인 방법이 없음.

애플리케이션 클래스와 라이브러리 위치 구분

org.springframework.boot.loader.jar.JarFile을 사용해서 내장 JAR를 읽는다.

org.springframework.boot.loader.Launcher를 사용해서 실행한다.

 

 

- 스프링 부트 원리 정리

의존성 관리

: 이것만 넣어도 이만큼이나 다 알아서 가져오네?

자동 설정

: @EnableAutoConfiguration이 뭘 해주는지 알겠어.

내장 웹 서버

: 아 스프링 부트가 서버가 아니라 내장 서버를 실행하는 거군.

독립적으로 실행 가능한 JAR

: spring-boot-maven 플러그인이 이런걸 해주는구나..

반응형
반응형

 

- 컨테이너와 포트

다른 서블릿 컨테이너로 변경

웹 서버 사용 하지 않기

: application.properties에  spring.main.web-application-type=none

포트

: application.properties에  server.port=7070

랜덤 포트

: application.properties에  server.port=0

ApplicationListner<ServletWebServerInitializedEvent>

 

 

- http와 https

[terminal]

keytool -genkey -alias spring -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.12 -validity 4000

[application.properties]

server.ssl.key-store=keystore.12

server.ssl.key-store-type=PKCS12

server.ssl.key-password=123456

server.ssl.key-alias=spring

반응형
반응형

 

- 의존성

: POM.xml 파일에서 왼쪽에 'o' 표시 뜨면 관리되고 있는 의존성임, 안 뜨면 버전을 꼭 써줘야 함

: dependency에 버전이 없고, 두 개밖에 없음

: parent -> dependencies : 버전들이 쭉 들어있고, 이 중에서 사용하면 따로 버전을 명시하지 않아도 됨

: 우측 maven 창에서 의존성 관계를 볼 수 있음

: 우리가 관리해야할 의존성이 줄어듦(버전 관리를 할 필요없음)

: 특별히 원하는 버전이 있으면 써주면 됨

만약, parent를 사용하지 않는다면 레퍼런스에 방법에 따르면 됨

but, parent가 그 밖의 다른 설정들도 해주기 때문에 parent POM 쓰는 것을 추천

 

- 의존성 버전 변경하는 법

: parent -> dependencies 에서 버전 복사해서

: POM.xml properties 버전 변경해서 추가

 

 

- @EnableAutoConfiguration, 자동 설정

: @SpringBootApplication = @SpringBootConfiguration + @ComponentScan + @EnableAutoConfiguration

: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

-> @EnableAutoConfiguration 에서 자동으로 만들어주는 빈

-> WebApplicationType.NONE으로 설정해주면 됨

: @ComponentScan 에서 먼저 빈을 불러들이고, @EnableAutoConfiguration 에서 두번째로 추가적인 빈을 등록해줌

 

- @ComponentScan

: @Component @Configuration @Repository @Service @Controller @RestController라는 어노테이션을 가진 클래스들을 스캔해서 빈으로 등록하는 것

: TypeExcludeFilter과 AutoConfigurationExcludeFilter는 제외하고 빈으로 등록함

: me.whiteship 밑에 있는 아이들만 빈으로 등록해 줌

 

- @EnableAutoConfiguration

: spring.factories

: org.springframework.boot.autoconfigure.EnableAutoConfiguration 키값에 해당하는 모든 클래스를 빈에 등록함 -> 조건에 맞으면

 

 

 

- autoconfiguration

1. 의존성 추가

<dependencies>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure-processor</artifactId>
      <optional>true</optional>
  </dependency>
</dependencies>

<dependencyManagement>
  <dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-dependencies</artifactId>
          <version>2.0.3.RELEASE</version>
          <type>pom</type>
          <scope>import</scope>
      </dependency>
  </dependencies>
</dependencyManagement>

2. @Configuration 파일 작성 -> HolomanConfiguration.class

package me.whiteship;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HolomanConfiguration {

    @Bean
    public Holoman holoman(){
        Holoman holoman = new Holoman();
        holoman.setHowLong(5);
        holoman.setName("keesun");
        return holoman;
    }
}

 

 

- 톰캣 내장 웹서버
스프링 부트는 서버가 아니다.
톰캣 객체 생성
포트 설정
톰캣에 컨텍스트 추가
서블릿 만들기
톰캣에 서블릿 추가
컨텍스트에 서블릿 맵핑
톰캣 실행 및 대기

: 이 모든 과정을 보다 상세히 또 유연하고 설정하고 실행해주는게 바로 스프링 부트의 자동 설정.
ServletWebServerFactoryAutoConfiguration (서블릿 웹 서버 생성)
TomcatServletWebServerFactoryCustomizer (서버 커스터마이징)
DispatcherServletAutoConfiguration (서블릿 만들고 등록)

반응형

+ Recent posts