@SpringBootApplication은 스프링에서 자주 사용하는 어노테이션이다.
우리가 기본적으로 스프링 이니셜라이저에서 스프링 부트 압축 파일을 받고 실행시키면
처음에 스프링 이니셜라이저에서 설계한 패키지명으로 ~~Application 파일이 생긴다.
그 파일을 들어가보면
package com.kh.reactbackend;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ReactbackendApplication {
public static void main(String[] args) {
SpringApplication.run(ReactbackendApplication.class, args);
}
}
이런식으로 @SpringBootApplication 어노테이션이 자동으로 생긴다.
이는 앞으로 여기서 개발하는 모든 작업들은 Spring 이 처리해줘 라는 역할을 하게 된다.
그러면 이 어노테이션은 어떤 일을 수행할까?
1. Spring Application Context 생성
- 모든 스프링 빈들을 관리하는 컨테이너를 생성한다.
2. 자동 설정 적용
- 클래스 패스들에 있는 의존성들을 바탕으로 필요한 설정을 자동으로 로드하고 구성한다.
- builde.gradle 에 가보면 우리가 스프링 이니셜라이저에서 초기에 설정한 의존성 값들이 있는데
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
- 이 부분을 애플리케이션에 시작할 때, 의존성들이 잘 포함되어 있는지 확인해준다.
- 의존성에 있는 기능들을 스프링부트가 알아서 잘 실행되도록 도와준다.
3. 컴포넌트 스캔
- @SpringBootApplication 이 있는 패키지 및 하위 패키지에서 스프링 Bean 들을 찾아 컨테이너에 등록해준다.
- 컨트롤러나, 서비스 쪽에 어노테이션을 붙여 Bean 에 등록해주는데, Spring 이 이를 인식해줄 수 있는 이유는 스프링부트 애플리케이션 어노테이션 덕분이다.
4. 내장 서버 실행
- 우리는 웹 애플리케이션을 만들 기 때문에 Tomcat 을 사용하는데, 해당 어노테이션은 내장 톰캣 등의 웹 서버를 구동하여 요청을 처리할 준비를 해준다.
testImplementation 'org.springframework.boot:spring-boot-starter-test'
- builde.gradle 에 있는 해당 의존성, 스타터는 기본적으로 내장 Tomcat 을 포함하고 있는다.
- 해당 웹 서버가 있음을 감지해주고, 이 감지 덕분에 스프링 부트는 애플리케이션 시작시 별도의 설정 없이 자동으로 내장 Tomcat 서버를 구동한다.
5. 메인 클래스 식별
- @SpringBootApplication 은 스프링 부트 애플리케이션의 메인 진입점을 명시적으로 알려준다.
- 스프링 부트 애플리케이션이 시작될 때, JVM은 public static void main(String[] args) 메소드를 찾고, 이 메소드가 포함된 @SpringBootApplication 클래스를 기반으로 전체 애플리케이션 컨텍스트를 로드한다.
- 이는 애플리케이션을 JAR 파일로 패키징했을 때 실행 가능한 형태로 만들어주는 데 필수적이다.
'Spring' 카테고리의 다른 글
| 빌더패턴은 무엇이고 어떻게 사용할까? (0) | 2025.05.31 |
|---|---|
| Maven과 Gradle의 역할과 기능은 무엇일까? (0) | 2025.05.29 |
| 프록시 패턴과 AOP에 대해 연관성 (0) | 2025.05.25 |
| [Java] Dependency Injection에 대해서, 그리고 왜 사용할까? (0) | 2025.05.21 |
| [Spring] Spring 프레임워크란 무엇일까? (2) | 2025.05.20 |