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);
}
}
자세한 설명은 https://www.daleseo.com/spring-boot-runners/ 참고...
@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 하나로 활성화 시킬 수 있는 것
스프링의 @Configuration 어노테이션를 대체하는 어노테이션으로, 거의 비슷한 기능을 제공함
두 어노테이션의 차이점 : @SpringBootConfiguration은 구성을 자동으로 찾을 수 있음
💡
Spring Boot의 빈 등록 방식은 두 단계에 걸쳐서 진행
1. ComponentScan으로 bean을 등록
2. EnableAutoConfiguration으로 bean을 등록
@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 어노테이션은 아래와 같이 제외대상과 추가 대상을 설정할 수 있게 옵션을 제공함
해당 어노테이션은 스프링 부트의 자동 설정 메커니즘을 활성화 시켜줌
AutoConfiguration은 결국 Configuration = 즉, Bean을 등록하는 자바 설정 파일
스프링 부트가 미리 정의해놓은 빈 설정들(meta 파일에 존재)을 빈으로 등록하는 역할을 수행
💡
@SpringBootApplication 어노테이션이 @EnableAutoConfiguration을 선언해 사용하고 있기 때문에 @SpringBootApplication 기준으로 package를 모든 Bean으로 자동 구성
-> 그래서 가장 최상위 패키지에 선언되어 있는 것
💡
Spring Boot의 meta 파일? -> spring-boot-autoconfigure 프로젝트의 META-INF 패키지 안 spring.factories에 들어있음!
Spring Boot는 이렇게 개발자에게 귀찮을 부분들을 최소화 시키는 기능 제공!!!