스프링 컨테이너

신경연·2023년 5월 11일
0

Spring

목록 보기
3/5

Spring Container (IOC Container)

Spring Framework에서 IOC를 사용한다고 하는데, Spring Container가 그 역할을 수행합니다.
Spring Bean들의 생명주기(Life Cycle)를 관리합니다. 즉, Bean 생성, 관리, 제거 등의 역할을 담당합니다.
스프링 컨테이너가 빈을 관리하는 과정은 DI(의존성 주입)가 이루어진 빈들을 BeanFactoryApplicationContext라는 2개의 컨테이너로 제어하고 관리합니다.

1. 목적

좋은 객체지향 설계를 하고, 객체 간의 의존성을 낮추기 위해

자바에서 객체를 사용하기 위해서는 new 생성자가 필요합니다. 그런데 이렇게 하게 되면, 객체가 많이 존재하게 됨에 따라 서로 어지럽게 참조가 되어 서로에 대한 의존성이 높아집니다.
따라서 이를 막음으로써 좋은 객체 설계를 하기 위해 IOC가 등장하고, 이리저리 개발을 하다가 나온것이 Spring인데 이때 객체 간의 의존성을 낮추기 위해 Spring 컨테이너가 사용됩니다.

2. BeanFactory vs ApplicationContext

1) 구조

  • BeanFactory :스프링 빈을 관리하고 조회하는 역할 담당
  • MessageSource : 다국어 메시지 처리 기능 제공
  • EnvironmentCapable : 프로파일 기능, 프로퍼티 기능들을 제공
  • ApplicationEventPublisher : 이벤트 기반의 프로그래밍을 할 때 필요한 기능을 제공
  • ResourceLoader : 리소스를 읽어오는 기능을 제공

ApplicationContext 인터페이스는 스프링 빈을 관리하고 조회하는 BeanFactory 인터페이스를 포함하여, 다른 여러 인터페이스들을 다중 상속하고 있는 모습을 보여주고 있습니다.
한마디로 정리하면, BeanFactory기능을 모두 상속해 Bean 객체를 관리하며, 메시지 처리, 리소스, 이벤트와 관련된 기능을 추가적으로 가지고 있는 인터페이스입니다.
애플리케이션을 개발할 때는 빈 관리, 조회하는 기능외에 수많은 부가 기능이 필요하기 때문에 주로 BeanFactory보다는 ApplicationContext를 사용을 더 많이 하게 됩니다.

2) 차이

BeanFactory를 상속하지만 Bean의 관리 및 조회 기능에도 조금 차이가 있습니다.
BeanFactory는 Bean을 미리 생성하지 않습니다. getBean을 사용해서 호출된 시점에 빈을 생성합니다.
ApplicationContext는 App을 실행할 때 Context 초기화 시점에 모든 Singleton 빈을 미리 다 생성하고, Application이 시작된 이후에는 빈이 이미 다 생성되어있기 때문에 빈을 지연없이 제공하고 받습니다. 싱글톤 객체가 사라지는 시점은 Applicaton이 종료되는 시점입니다.

3. 빈 등록 방식 (어노테이션)

빈 등록은 자동과 수동 방식이 존재합니다.

1) 수동 방식 (@Configuration + @Bean)

수동 등록은 Config 클래스안에 @Bean을 추가한 메서드로 직접 빈을 등록하며, 의존성 주입도 여기서 진행합니다. 이때 메서드 이름이 빈 이름이 됩니다.
아래 사진은 지난 프로젝트의 WebSecurityConfig Class의 일부입니다.

@Configuration

이것이 적용되어 있는 클래스는 이 안에 관리해야 하는 빈들이 있다고 Spring Container에게 알려 주는 어노테이션입니다. 이 어노테이션이 설정된 클래스의 빈들이 싱글톤 방식으로 보장되어야한다는 것을 알려주는 것이기도 합니다.

@Bean

메소드 레벨에서 선언하며, 반환되는 객체(인스턴스)를 개발자가 수동으로 빈으로 등록하는 애노테이션입니다. 해당 메소드가 반환하는 객체를 빈으로 등록해줍니다.

2) 자동 방식 (@ComponentScan + @Component)

자동 등록은 Config 클래스의 @ComponentScan 에 의해 진행됩니다. 스프링은 @Component가 붙은 클래스의 객체를 스프링 빈으로 추가하며, 클래스 이름 첫글자를 소문자로 바꾼 것이 빈 이름이 됩니다.
아래 사진은 SpringBoot 프로젝트 생성시 생성되는 Application Class이고,
@SpringBootApplication 안을 확인해 보니 @ComponentScan이 존재하였다.

@Component

클래스 레벨에서 선언함으로써 Spring 런타임 시에 @ComponentScan 에 의해 해당 클래스가 빈으로 등록이 됩니다.

@ComponentScan

이 어노테이션이 적용된 해당 클래스의 패키지와 하위 패키지에 있는 @Component 및 @Service, @Repository, @Controller 이 부여된 Class들을 탐색하여 빈으로 등록해주는 어노테이션입니다.
(물론, 저 어노테이션들은 내부에 @Component 를 가지고 있습니다.)

출처

https://devloper-dreaming.tistory.com/148

profile
반갑습니다

0개의 댓글