본문 바로가기

공부 자료/Spring

[Spring Core] 스프링 컨테이너(Spring Container), 스프링 컨텍스트(Spring Context)

 

 

컨테이너

: 내부에 또 다른 컴포넌트를 가지고 있는 어떤 컴포넌트를 의미

: 객체를 생성하고 객체를 서로 연결함

: 객체를 설정하는 단계를 지나 마지막으로 생명주기 전반(생성~관리~소멸)을 관리함

: 객체의 의존성을 확인해 생성한 뒤 적절한 객체에 의존성을 주입함

: 스프링은 스프링 컨테이너를 통해 객체를 관리

: 스프링 컨테이너에서 관리되는 객체를 빈이라고 함

 

@Configuration : 구성정보를 담당하는 것을 설정할때 붙여줌

@Bean: 각 메서드에 붙여 스프링 컨테이너에 자동으로 등록

 

 

스프링 컨테이너(Spring Container)

: 스프링 프레임워크의 핵심 컴포넌트로 내부에 존재하는 애플리케이션 빈의 생명주기를 관리(Bean 생성, 관리, 제거 등의 역할을 담당)

 

 

What(스프링 컨테이너란?)

: ApplicationContext 를 말하며 인터페이스로 구현되어 있음 (다형성 적용)

: @Configuration이 붙은 클래스를 설정 정보로 사용함

@Bean이 적힌 메서드를 모두 호출하여 반환된 객체를 스프링 컨테이너에 등록하며, 등록된 객체를 스프링 빈이라고 함

(스프링 빈은 applicationContext.getBean() 메서드를 활용해 찾기 가능)

: 스프링 애플리케이션의 런타임 환경을 나타내는 스프링 컨텍스트를 생성하고 관리

 

- XML, 애너테이션 기반의 자바 설정 클래스로 만들 수 있음

- 빈의 인스턴스화, 구성, 전체 생명 주기 및 제거까지 관리(Bean을 객체로 만들어 관리하고 개발자가 필요할 때 제공)

- 스프링 컨테이너를 통해 원하는 만큼 많은 객체를 가질 수 있음

- 의존성 주입을 통해 애플리케이션의 컴포넌트를 관리

  - 서로 다른 빈을 연결해 애플리케이션의 빈을 연결하는 역할을 함

   - 모듈 간에 의존 및 결합으로 인해 발생하는 문제에서 자유로울 수 있음

   - 메서드가 언제, 어디서 호출되어야 하는지, 메서드 호출을 위해 필요한 매개 변수를 준비해 전달하지 않음

 

 

Why(스프링 컨테이너 사용 이유)

: 객체 사용을 위해 사용하는 new 생성자로 인해 의존성이 높아져 높은 결합성을 보이기 때문

: 낮은 결합도와 높은 캡슐화를 위해 객체간 의존성을 낮추기 위해 Spring 컨테이너를 사용

>> 구현 클래스에 있는 의존을 제거하고 인터페이스에만 의존하도록 설계할 수 있기 때문

 

 

How(생성 과정)

1) 비어있는 스프링 컨테이너 생성(스프링 컨텍스트 초기화)

2) 스프링 설정 파일들을 기반으로 하여 빈을 등록

>> Configuration Metadata를 사용하며, 파라미터로 넘어온 설정 클래스 정보를 사용해 스프링 빈을 등록

(new AnnotationConfigApplicationContext(구성정보.class)로 스프링에 있는 @Bean의 메서드 등록)

* 스프링 빈 조회에서 상속관계가 있을 경우 부모타입으로 조회하면, 자식 타입도 함께 조회되기 때문에 모든 자바 객체의 최고 부모인 object 타입으로 조회하면 모든 스프링 빈 조회가 가능함

3) 스프링 설정 파일들을 기반으로 하여 스프링 빈 의존관계를 주입

 


 

Spring Container 종류

1) BeanFactory

: 스프링 컨테이너의 최상위 인터페이스

: 빈을 등록/생성/조회/돌려주는 등의 관리 역할을 담당함

: getBean() 메서드를 통해 빈 인스턴스화가 가능함

: @Bean이 붙은 메서드 명을 스프링 빈의 이름으로 사용해 빈 등록을 함

 

 

2) AppicationContext

: BeanFactory의 기능을 상속받아 제공

: 스프링 컨테이너이자 컨텍스트 역할을 수행

: 빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고 그 외 부가기능을 제공

  * 부가기능

- MessageSource : 메세지소스를 활용한 국제화 기능 (한국어,영어 등)

- EnvironmentCapable : 환경변수 (로컬,개발,운영등을 구분해서 처리)

- ApplicationEventPublisher : 이벤트를 발행하고 구독하는 모델을 편리하게 지원

- ResourceLoader : 파일, 클래스패스, 외부 등 리소스를 편리하게 조회

 


 

스프링 컨테이너에서 스프링 컨텍스트라는 것을 생성하고 관리한다고 했는데, 그렇다면 스프링 컨텍스트는 무엇인가?

 

스프링 컨텍스트란?

: 애플리케이션의 런타임 환경을 나타냄

즉, 스프링 애플리케이션 설정 정보 포함 / 빈의 라이프사이클 관리 / 빈의 의존성 주입 처리

: 빈의 생성, 설정, 관리, 검색 및 런타임 시 빈 간의 협력을 관리

: ApplicationContext의 인터페이스를 구현한 클래스들을 나타내어 스프링 빈을 관리하고 애플리케이션을 구성

 

 

스프링 컨테이너와 스프링 컨텍스트가 많이 햇갈리는데, 

스프링 컨테이너는 스프링 빈의 생성 및 관리를 담당하는 일종의 스프링 컨텍스트라고 생각하면 됨

즉, 스프링 컨테이너는 스프링 컨텍스트를 생성하고, 스프링 컨텍스트는 애플리케이션 빈을 관리한다고 보면 됨

 

 

* 빈에 대한 설명

https://kcode-recording.tistory.com/50

 

[Spring Core] 빈(Bean)

빈(Bean) : 스프링 컨테이너(Spring Container)에 의해 관리되는 재사용 소프트웨어 컴포넌트(자바 객체) : 인스턴스화된 객체를 의미 : 스프링 컨테이너에 등록된 객체를 스프링 빈(Spring Bean)이라 하며,

kcode-recording.tistory.com