Spring Boot 프로젝트 구조
- Spring Boot 프로젝트는 크게 세 가지 디렉토리(src/main/java, src/main/resources, src/test)로 구성된다.
- src/main/java → 주요 애플리케이션 코드 (Controller, Service, Repository 계층 포함)
- src/main/resources → 설정 파일(application.properties/yml), 정적 리소스(HTML, CSS, JS) 포함
- src/test → 단위 테스트 및 통합 테스트 코드

패키지 구조를 잘 설계하면 @ComponentScan이 효과적으로 작동하여 필요한 Bean을 자동으로 등록할 수 있음.
(@SpringBootApplication 어노테이션이 적용된 Application 클래스를 가장 상위 폴더에 넣어야 하위 패키지들을 Bean 등록)
Spring Boot 애플리케이션 시작점: @SpringBootApplication
- Spring Boot 애플리케이션은 @SpringBootApplication 어노테이션이 붙은 메인 클래스를 통해 시작된다.
: Spring Boot 애플리케이션이 시작될 때 핵심 설정을 담당하고, 자동 설정 과정을 원활하게 해주기 위한 특수한 설정 클래스
@SpringBootApplication 내부 핵심 구성 요소
- @SpringBootConfiguration → Spring Boot 전용 설정 클래스 (일반적인 @Configuration과 동일한 역할, Bean 등록이나 환경 설정 수행)
- @EnableAutoConfiguration → 클래스패스에 있는 라이브러리를 자동으로 감지하여 설정 적용
예: spring-boot-starter-web이 있으면 내장 톰캣 + Spring MVC 자동 설정
자동 설정 클래스(WebMvcAutoConfiguration, JpaAutoConfiguration 등)를 조건부로 활성화
- @ComponentScan → 현재 패키지와 하위 패키지에서 @Component, @Controller, @Service, @Repository를 자동으로 스캔하여 Bean 등록

SpringApplication.run() 실행 과정
SpringApplication.run(MainApplication.class, args) 호출 시 Spring Boot는 내부적으로 다음 단계를 거친다.
간단한 실행 흐름
- 애플리케이션 컨텍스트 생성 → Spring Container 생성, 자동 설정 준비
- 자동 설정 적용 (@EnableAutoConfiguration) → 클래스패스를 검사하여 필요한 Bean 등록
- Bean 등록 및 초기화 (@ComponentScan) → Controller, Service, Repository 등의 Bean을 자동으로 생성하고 의존성 주입
- 이벤트 리스너 실행 (ApplicationStartedEvent, ApplicationReadyEvent) → 애플리케이션 부팅 완료 후 초기화 작업 수행
구체적인 실행 흐름
- 애플리케이션 컨텍스트 생성
Spring Container(ApplicationContext) 생성
@SpringBootApplication이 적용된 클래스를 기준으로 컨텍스트를 구성
자동 설정 준비
- 환경(Environment) 구성 (prepareEnvironment())
application.properties 또는 application.yml을 로드하여 환경 설정 적용
활성화된 프로파일(예: application-dev.yml) 확인
- 자동 설정 (@EnableAutoConfiguration) 적용
클래스패스에서 Starter 라이브러리를 검색하여 필요한 Bean 자동 등록
예를 들어, spring-boot-starter-data-jpa가 포함되어 있다면 JPA 관련 설정 및 DataSource가 자동으로 설정됨
- Bean 등록 및 초기화 (@ComponentScan 동작)
@ComponentScan을 통해 현재 패키지 및 하위 패키지의 @Component, @Service, @Repository 등을 스캔하여 Bean 등록
@Autowired를 통해 필요한 의존성 주입 (DI, Dependency Injection)
- 애플리케이션 컨텍스트 리프레시 (refreshContext())
Bean을 초기화하고, @PostConstruct 메서드 실행
AOP 프록시 생성 (필요한 경우)
- 이벤트 리스너 실행 (ApplicationStartedEvent, ApplicationReadyEvent)
ApplicationStartedEvent → 애플리케이션이 부팅될 때 실행됨
ApplicationReadyEvent → 애플리케이션이 모든 초기화 과정을 끝낸 후 실행됨
애플리케이션이 정상적으로 실행되었음을 알리는 로그 출력