본문 바로가기

Backend/Spring

Spring Container와 Bean의 Lifecycle

Application Context

스프링 빈 객체의 생성, 설정 및 관리를 담당하는 IoC 컨테이너이다. 스프링에서는 Bean Factory 를 상속받아 확장한 Application Context 를 IoC 컨테이너로 사용한다. 애플리케이션 컨텍스트는 다음과 같은 기능을 수행한다:

  1. 빈 객체의 생성과 의존성 주입
  2. 빈 객체간의 상호 작용을 지원하고, 빈 객체의 생명주기를 관리
  3. 애플리케이션 전체에 걸쳐 공통적으로 사용되는 리소스 및 서비스를 제공

애플리케이션 컨텍스트는 스프링 애플리케이션의 중심이 되는 부분으로, 개발자는 애플리케이션 컨텍스트를 사용하여 빈 객체를 검색하거나 관리할 수 있다. 애플리케이션 컨텍스트를 사용함으로써, 개발자들은 빈 객체의 생성과 관리에 직접 신경 쓸 필요가 없고, 비즈니스 로직에만 집중할 수 있게 된다.

@SpringBootApplication

@SpringBootApplication은 스프링 부트 애플리케이션의 핵심 구성 어노테이션이다. 이 어노테이션은 다음 세 가지 기본적인 어노테이션을 포함한다:

  1. @Configuration: 클래스를 스프링의 Java 기반 설정 파일로 표시한다.
  2. @EnableAutoConfiguration: 스프링 부트가 자동으로 필요한 Bean 객체를 생성하고 설정하는 기능을 활성화한다.
  3. @ComponentScan: 지정된 패키지와 하위 패키지에서 스프링의 @Component, @Service, @Repository, @Controller 등의 어노테이션이 붙은 클래스를 찾아 빈 객체로 등록한다.

@SpringBootApplication 어노테이션은 Application Context 설정을 포함하고 있다.

하지만 어플리케이션 컨텍스트 자체는 따로 클래스로 존재한다.

스프링 프레임워크에서는 ApplicationContext 인터페이스가 있고, 이 인터페이스의 구현체, AnnotationConfigApplicationContext, ClassPathXmlApplicationContext 등이 있다.

스프링 컨테이너 생성과정

  1. 스프링 컨테이너 생성
    애플리케이션 컨텍스트라고 불리는 스프링 컨테이너를 생성한다. 이 컨테이너는 빈 객체의 생성, 관리, 의존성 주입을 담당한다. 스프링 부트 애플리케이션에서는 @SpringBootApplication 어노테이션이 있는 메인 클래스를 실행하면 자동으로 컨테이너가 생성된다.
  2. 빈 객체들의 스캔과 등록
    스프링 컨테이너는 어플리케이션 내에 정의된 빈 객체들을 스캔하고 등록한다. 빈 객체는 @Component, @Service, @Repository, @Controller 등의 어노테이션이 붙은 클래스를 대상으로 한다. 또한, @Configuration 어노테이션이 붙은 설정 클래스 내부의 @Bean 어노테이션을 사용하여 정의된 빈도 등록 대상이다. 빈 객체들은 싱글톤으로 관리되며, 필요할 때 스프링 컨테이너에서 가져와 사용한다.
  3. 의존성 주입 및 빈 객체들의 초기화
    스프링 컨테이너는 빈 객체들 간의 의존관계를 설정하고 초기화한다. 이 과정에서 @Autowired, @Inject, @Resource 등의 어노테이션을 사용하여 의존성 주입을 처리한다. 스프링 컨테이너는 의존성 주입을 통해 빈 객체들이 서로 협력할 수 있도록 한다. 이를 통해 개발자는 느슨한 결합과 유연한 구조의 코드를 작성할 수 있다.

빈의 생명주기

  1. 빈 정의
    스프링 컨테이너에 빈을 등록하기 위해 빈 객체의 클래스와 필요한 메타데이터를 정의한다. 이는 @Bean 어노테이션이나 XML 설정 파일을 통해 할 수 있다.
  2. 빈 생성
    스프링 컨테이너가 빈 객체를 생성한다. 이 단계에서 빈 객체의 인스턴스가 만들어지고 초기화 과정이 시작된다.
  3. 의존성 주입
    스프링 컨테이너가 빈 객체에 필요한 의존성을 주입한다. 이 과정에서 @Autowired 같은 어노테이션을 사용해 다른 빈 객체를 주입할 수 있다.
  4. 초기화
    스프링 컨테이너는 빈 객체의 초기화를 완료한다. 이때 @PostConstruct 어노테이션이 붙은 메서드나 InitializingBean 인터페이스의 afterPropertiesSet() 메서드를 사용해 초기화 로직을 실행할 수 있다.
  5. 사용
    애플리케이션에서 빈 객체를 사용한다. 스프링 컨테이너는 요청에 따라 빈 객체를 제공하고, 사용된 빈 객체는 다른 빈 객체와 협력하며 애플리케이션 로직을 수행한다.
  6. 소멸
    애플리케이션 종료 시, 스프링 컨테이너는 빈 객체의 소멸 과정을 진행한다. 이때 @PreDestroy 어노테이션이 붙은 메서드나 DisposableBean 인터페이스의 destroy() 메서드를 사용해 소멸 로직을 실행할 수 있다. 스프링 컨테이너는 빈 객체들을 제거하고, 자원을 반환한다.

'Backend > Spring' 카테고리의 다른 글

@Transactional 전파 전략  (0) 2023.05.07
DI와 IoC  (0) 2023.04.07
Spring Boot Controller Test  (0) 2023.04.07
Spring Session With Redis 설정하기  (0) 2023.03.09
SpringFox 3.0.0 Server URL Error  (0) 2023.03.03