Spring 프로젝트 구조와 @SpringBootApplication

양성준·2025년 3월 10일

스프링

목록 보기
10/49

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는 내부적으로 다음 단계를 거친다.

간단한 실행 흐름

  1. 애플리케이션 컨텍스트 생성 → Spring Container 생성, 자동 설정 준비
  2. 자동 설정 적용 (@EnableAutoConfiguration) → 클래스패스를 검사하여 필요한 Bean 등록
  3. Bean 등록 및 초기화 (@ComponentScan) → Controller, Service, Repository 등의 Bean을 자동으로 생성하고 의존성 주입
  4. 이벤트 리스너 실행 (ApplicationStartedEvent, ApplicationReadyEvent) → 애플리케이션 부팅 완료 후 초기화 작업 수행

구체적인 실행 흐름

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

0개의 댓글