스프링 컨테이너와 빈

고등어찌짐·2023년 11월 13일
0

Spring Core

목록 보기
3/4

스프링 컨테이너(Spring Container)

스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공한다. 스프링 컨테이너는 XML, 어노테이션 기반의 자바 설정 클래스로 만들 수 있다. 스프링 부트를 사용하기 이전에는 xml을 통해 직접적으로 설정해 주어야 했지만, 스프링 부트가 등장하면서 대부분 사용하지 않게 되었다.


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

//스프링 컨테이너 생성
//ApplicationContext를 스프링 컨테이너라고 함 (인터페이스임)
ApplicationContext applicationContext =
				new AnnotationConfigApplicationContext(AppConfig.class);

AppConfig.class(설정 정보)를 파라미터로 넘김!!
스프링 컨테이너는 이 설정 정보를 사용해서 스프링 빈을 등록하고, 참고해서 의존관계를 주입한다.

//어노테이션 기반의 자바 코드 설정 클래스
  
@Configuration //AppConfig에 설정을 구성한다는 뜻
public class AppConfig {
 
   @Bean //각 메서드에 @Bean 을 붙여준다. 이렇게 하면 스프링 컨테이너에 스프링 빈으로 등록한다.
   public MemberService memberService() {
   	return new MemberServiceImpl(memberRepository());
   }
  
   @Bean
     public OrderService orderService() {
     	return new OrderServiceImpl(
     	memberRepository(),
     	discountPolicy());
     }
   @Bean
     public MemberRepository memberRepository() {
     	return new MemoryMemberRepository();
     }
   @Bean
     public DiscountPolicy discountPolicy() {
     	return new RateDiscountPolicy();
     }
}

스프링 컨테이너는 @Configuration이 붙은 AppConfig 를 설정(구성) 정보로 사용한다. 여기서 @Bean 이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.

빈 이름은 메소드의 이름을 사용한다. 빈 이름을 직접 부여할 수도 있다.
주의: 빈 이름은 항상 다른 이름을 부여해야 한다

  <!-- XML 기반의 스프링 빈 설정 정보 -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://
www.springframework.org/schema/beans/spring-beans.xsd">
 <bean id="memberService" class="hello.core.member.MemberServiceImpl">
 <constructor-arg name="memberRepository" ref="memberRepository" />
 </bean>
 <bean id="memberRepository"
class="hello.core.member.MemoryMemberRepository" />
 <bean id="orderService" class="hello.core.order.OrderServiceImpl">
 <constructor-arg name="memberRepository" ref="memberRepository" />
 <constructor-arg name="discountPolicy" ref="discountPolicy" />
 </bean>
 <bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy" />
</beans>
  

xml 기반의 appConfig.xml 스프링 설정 정보와 자바 코드로 된 AppConfig.java 설정 정보를 비교해보면거의 비슷하다는 것을 알 수 있다.

BeanFactory와 ApplicationContext

BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스다.
  • 스프링 빈을 관리하고 조회하는 역할을 담당한다.
  • getBean() 을 제공한다.
  • 위에서 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능

ApplicationContext

  • BeanFactory 기능을 모두 상속받아서 제공한다.
  • 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데, 그러면 둘의 차이가 뭘까? 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능은 물론이고, 수많은 부가기능이 필요하다.

ApplicationContext가 제공하는 부가기능이란?

  • 메시지 소스 국제화 (한국에서 접속하면 한국어로, 영어권에서 접속하면 영어로)
  • 환경 변수 (로컬, 운영, 개발 등...)
  • 애플리케이션 이벤트
  • 편리한 리소스 조회

ApplicationContext는 BeanFactory의 기능을 상속받는다.
ApplicationContext는 빈 관리기능 + 편리한 부가 기능을 제공한다.
BeanFactory를 직접 사용할 일은 거의 없다. 부가기능이 포함된 ApplicationContext를 사용한다.
BeanFactory나 ApplicationContext를 스프링 컨테이너라 한다.

스프링 빈 설정 메타 정보?

BeanDefinition을 직접 생성해서 스프링 컨테이너에 등록할 수 도 있다. 하지만 실무에서 BeanDefinition을 직접 정의하거나 사용할 일은 거의 없다. 어려우면 그냥 넘어가면 된다^^!

BeanDefinition에 대해서는 너무 깊이있게 이해하기 보다는, 스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용하는 것 정도만 이해하면 된다.

profile
TIL 채우는 중

0개의 댓글