[Spring Boot] SpringApplication

dayeon·2023년 8월 25일
0

[ @SpringBootApplication / SpringApplication class ]


🍎 SpringApplication 실행 🍎

➡️ 기본

SpringBoot 프로젝트를 생성하면 메인 클래스와 메인 메소드가 만들어짐
다음과 같이 SpringApplication의 run이라는 정적 메소드를 통해 애플리케이션을 실행시킬 수 있음

@SpringBootApplication
public class Application {

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

}

@SpringBootApplication 어노테이션을 통해 스프링 Bean을 읽어와 자동으로 생성해줌

이 어노테이션이 있는 파일 위치부터 설정들을 읽음
➡️ 반드시 프로젝트의 최상단에 만들어야 함

SpringApplication.run()으로 해당 클래스를 run하면, 내장 WAS를 실행함

💡
내장 WAS의 장점 : 개발자가 따로 톰캣과 같은 외부 WAS를 설치 후 설정해두지 않아도 애플리케이션 실행 가능

외장 WAS를 사용할 시 이 프로젝트를 실행시키기 위한 서버에서 모두 외장 WAS의 종류와 버전, 설정을 일치시켜야만 함
따라서 내장 WAS를 사용하면 이런 신경은 쓰지 않아도 되기 때문에 매우 편리

SpringApplication.run() 호출 시 일어나는 과정 자세히 알고 싶다면 https://jaehoney.tistory.com/355 참고...


➡️ 커스터마이징

만약 SpringApplication의 기본 설정 들이 맘에들지 않으면 로컬객체를 생성해서 커스터마이징해 대신 사용할 수 있음

@SpringBootApplication
public class SbEx1Application {

	public static void main(String[] args) {
		//SpringApplication.run(Application.class, args);
		// 커스텀 마이징을 위해 밑의 형식으로 바꿈
		SpringApplication app = new SpringApplication(Application.class);
		app.run(args);
	}

}

🔹 Application Event 등록
spring boot 애플리케이션이 시작할때나 시작 직후 등 시점에서 Event Listener를 통해 다양한 이벤트들을 실행할 수 있음

@Component
public class SampleListener implements ApplicationListener<ApplicationStartingEvent>{
	@Override
	public void onApplicationEvent(ApplicationStartingEvent event) {
		System.out.println("===================");
		System.out.println("Application is Starting");
		System.out.println("===================");
		
	}
}
//A pplicationEvent 등록할 때 해당 이벤트가 Application Context 생성 이전의 이벤트인지, 또는 이후의 이벤트인지가 가장 중요
// ApplicationStartingEvent은 제일 처음 발생하는 이벤트라서 Bean으로 등록해도 동작하지않음
// 그래서 Component 등록해도 무의미함

그래서 이 이벤트리스너가 제대로 동작하게 하려면 아래와 같이 등록해줘야 함

@SpringBootApplication
public class SbEx1Application {

	public static void main(String[] args) {
		//SpringApplication.run(SbEx1Application.class, args);
		// 커스텀 마이징을 위해 밑의 형식으로 바꿈
		SpringApplication app = new SpringApplication(SbEx1Application.class);
		app.addListeners(new SampleListener()); // 이벤트 등록
		app.setWebApplicationType(WebApplicationType.REACTIVE); // 웹어플 타입 등록
		app.run(args); 
	}
}

🔹 애플리케이션 실행한 뒤 추가적으로 실행하고 싶을 때
  • ApplicationRunner (추천) 또는 CommandLineRunner
  • 순서 지정 가능 @Order

자세한 설명은 https://www.daleseo.com/spring-boot-runners/ 참고...


🍎 @SpringBootApplication 구조를 살펴보자 🍎

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    ...

@SpringBootApplication은 위와 같이 구성되어 있음

1. @SpringBootConfiguration
2. @ComponentScan
3. @EnableAutoConfiguration

위 3가지 어노테이션 기능을 @SpringBootApplication 하나로 활성화 시킬 수 있는 것

🔹 @SpringBootConfiguration

스프링의 @Configuration 어노테이션를 대체하는 어노테이션으로, 거의 비슷한 기능을 제공함
두 어노테이션의 차이점 : @SpringBootConfiguration은 구성을 자동으로 찾을 수 있음

💡
Spring Boot의 빈 등록 방식은 두 단계에 걸쳐서 진행

1. ComponentScan으로 bean을 등록
2. EnableAutoConfiguration으로 bean을 등록

🔹 @ComponentScan

@Component @Configuration @Repository @Service @Controller @RestController
@Component 어노테이션(위와 같은 어노테이션)을 명시한 클래스들을 Scan 하여 해당 클래스를 Bean으로 만들어 Spring Continaer에 등록

@ComponentScan(excludeFilters = {
 @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
 @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)})

excludeFilters는 스캔 대상을 제외하고 싶을 때 사용하며, Filter 어노테이션을 선언해 필터링할 정보를 작성함
@Filters 어노테이션은 아래와 같이 제외대상과 추가 대상을 설정할 수 있게 옵션을 제공함

  • inculedFillters : ComponentScan 대상을 추가로 지정
  • excludeFilters : ComponentScan에서 제외할 대상을 지정

🔹 @EnableAutoConfigure

해당 어노테이션은 스프링 부트의 자동 설정 메커니즘을 활성화 시켜줌

AutoConfiguration은 결국 Configuration = 즉, Bean을 등록하는 자바 설정 파일

스프링 부트가 미리 정의해놓은 빈 설정들(meta 파일에 존재)을 빈으로 등록하는 역할을 수행

💡
@SpringBootApplication 어노테이션이 @EnableAutoConfiguration을 선언해 사용하고 있기 때문에 @SpringBootApplication 기준으로 package를 모든 Bean으로 자동 구성 
-> 그래서 가장 최상위 패키지에 선언되어 있는 것

💡
Spring Boot의 meta 파일? -> spring-boot-autoconfigure 프로젝트의 META-INF 패키지 안 spring.factories에 들어있음!


Spring Boot는 이렇게 개발자에게 귀찮을 부분들을 최소화 시키는 기능 제공!!!

profile
I'm happy...

0개의 댓글