Spring

스프링 컨테이너와 스프링 빈

JUNGKEUNG 2022. 7. 10. 13:48
반응형

스프링 컨테이너란?

스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다.

여기서 말하는 자바 객체를 스프링에서는 빈(Bean)이라고 부른다.

 

개발자는 new 연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸시킬 수 있는데, 스프링 컨테이너가 이 역할을 대신해 준다. 즉, 제어 흐름을 외부에서 관리하고 객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 만들어 준다.

 

 

 

스프링 컨테이너의 종류

BeanFactory와 ApplicationContext가 있다.

  • BeanFactory는 빈을 등록하고 생성하고 조회하고 돌려주는 등 빈을 관리하는 역할이다. getBean() 메서드를 통해 빈을 인스턴스화 할수 있다.
  • ApplicationContext도 BeanFactory처럼 빈을 관리할 수 있다. Main 코드에서 BeanFacotory를 ApplicationContext로만 바꾸고 실행 할수 있다.

 

 

BeanFactory 와 ApplicationContext의 차이점

BeanFactory는 스프링 컨테이너의 최상위 인터페이스이다. ApplicationContext는 BeanFactory 기능을 모두 상속 받아서 제공한다.그럼 둘의 차이점이 없는것일까? 둘의 차이점은 분명하게 있다. 바로 부가기능의 차이이다.

ApplicationContext는 BeanFactory의 기능을 모두 상속받아 사용하면서 다른 부가기능을 추가적으로 제공해준다.

그래서 BeanFactory를 직접 사용할 일은 거의 없다. 부가기능이 포함된 Application Context를 사용한다.

 

 

추가 설명

MessageSource - 한국에서 들어오면 한국어, 영어권에서 들어오면 영어로 출력 해주는 기능

EnvironmentCapable - 로컬, 개발, 운영등을 구분해서 처리

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

ResourceLocader - 파일,클래스패스,외부 등에서 리소스를 편리하게 조회

 

 

 

스프링 컨테이너 생성

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Appconfig.class);

ApplicationcationContext 는 스프링 컨테이너라고 설명했다. 

new AnnotationConfigApplicationContext(Appconfig.class); 는 자바 설정 클래스를 기반으로 스프링 컨테이너로 만든것이다. 

인프런 김영한 - 스프링핵심 기본

new AnnotationConfigApplicationContext(Appconfig.class);  스프링 컨테이너를 생성할 때는 구성 정보를 지정해주어야 한다.  여기서는 Appconfig.class를 구성 정보로 지정 했다.

 

 

스프링 빈 등록

인프런 김영한 - 스프링핵심 기본

스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다.

 

빈이름

  • 빈 이름은 메서드 이름을 사용한다
  • 빈 이름을 직접 부여할 수 있다. ( @Bean(name="memberService2")
주의 : 빈 이름은 항상 다른 이름을 부여해야 한다. 같은 이름을 부여하면, 다른 빈이 무시되거나, 기존 빈을 덮어버리거나 설정에 따라 오류가 발생한다.

 

 

스프링 빈 의존관계 설정

생성된 스프링빈에 의존관계를 설정해줘야 한다. 기존 AppCOnfig에는 MemberService와 OrderService가 있는데 이 두 클래스를 생성하기 위해서는 각각 할인정책, 회원 리포지토리를 의존관계를 주입해줘야 한다. 이런 정보가 AppConfig라는 구성정보 클래스에 담겨있기에 이를 베이스로 스프링 빈 의존 관계를 설정해 준다.

인프런 김영한 - 스프링핵심 기본
이 처럼 스프링은 빈을 생성하고 의존관계를 주입하는 단계가 있는데 자바 코드를 통해 스프링 빈을 등록하면 생성자를 호출하며 의존관계 주입도 처리가 된다.
 

다양한 형식 지원 - 자바 코드, XML

스프링 컨테이너는 다양한 형식의 설정 정보를 받아드릴 수 있게 유연하게 설계되어 있다.

 

 
 
 
 

스프링 빈 설정 메타 정보 - BeanDefinition

 
  • 스프링은 다양한 형식을 지원하는데 그 중심에는 BeanDefinition이라는 추상화가 있다
  • XML 이든, 자바 코드이든 스프링 컨테이너는 BeanDefinition만 알면 된다.

인프런 김영한 - 스프링핵심 기본

 

 

BeanDefinition 정보

BeanClassName  : 생성할 빈의 클래스 명 (자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)

factoryBeanName  : 팩토리 역할읠 빈을 사용할 경우 이름, 예) appconfig

factoryMethodName : 빈을 생성할 팩토리 메서드 지정, 예) memberService

Scope : 싱글톤(기본값)

lazylinit : 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 떄 까지 최대한 생성을 지연 처리하는지 여부

InitMethodName : 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명

DestoryMethodName : 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명

Constructor arguments, Properties : 의존관계 주입에서 사용한다.

 

 

 

참고 자료


 

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

https://steady-coding.tistory.com/459

'Spring' 카테고리의 다른 글

의존관계 자동 주입  (0) 2022.07.24
싱글톤 컨테이너  (0) 2022.07.10
객체 지향 프로그래밍  (0) 2022.06.01
Spring 과 Spring boot  (0) 2022.06.01
JpaReporitory vs EntityManager  (0) 2021.11.23