스프링 컨테이너

정민기·2021년 5월 10일
0

스프링 핵심 원리

목록 보기
4/5
post-thumbnail

스프링 컨테이너

AppConfig
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService(){
	...
    }
    @Bean
    public MemberRepository memberRepository() {
	...
    }
    @Bean
    public OrderService orderService(){
	...
    }
    @Bean
    private static DiscountPolicy discouontPolicy() {
	...
    }
}
OrderApp
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
...
public class OrderApp(){
	...
    	//apc는 ApplicationContext 인터페이스의 구현체이다.
	ApplicationContext apc = new AnnotationConfigApplicationContext(AppConfig.class);
	MemberService memberService = apc.getBean("memberService", MemberService.class);
	OrderService orderService = apc.getBean("orderService", OrderService.class);
	...
}
  • ApplicationContext를 스프링 컨테이너라 한다. ApplicationContext은 인터페이스이고 스프링 컨테이너의 최상위 인터페이스인 BeanFactory를 상속받아서 제공한다.
  • 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 매노테이션 기반의 자바 설정 클래스로 만들 수 있다. 위 예시 코드의 AppConfig는 애노테이션 기반의 자바 설정 클래스로 만든 것이다.
  • 스프링 컨테이너는 AnnotationConfigApplicationContext 객체를 통해 @Configuration이 붙은 AppConfig를 설정 정보로 사용한다. 이때 AppConfig 내부의 @Bean이 붙은 메서드를 모두 호출해서 반환된 객
    체를 스프링 컨테이너에 등록한다. 그리고 이 객체들을 스프링 빈이라 한다.
  • 스프링 빈은 @Bean이 붙은 메서드의 이름을 스프링 빈의 이름으로 사용하고 이 이름을 인자로 사용하는 applicationContext.getBean("이름", 타입) 메서드로 찾을 수 있다.

스프링 컨테이너 생성 과정

1. 스프링 컨테이너 생성

  • new AnnotationConfigApplicationContext(AppConfig.class)를 통해 스프링 컨테이너를 생성해준다. 이때 인자 값으로 구성 정보를 입력해주어야 하는데 이 경우 AppConfig.class를 구성 정보로 넘겨주었다.

2. 스프링 빈 등록

  • 스프링 컨테이너는 인자로 넘어온 설정 클래스, 즉 AppConfig@Bean이 붙은 메서드들을 스프링 빈 저장소에 이름과 객체 타입으로 등록한다.

3. 스프링 빈 의존관계 설정

  • 스프링 컨테이너는 AppConfig를 확인하고 스프링 빈끼리의 의존 관계를 주입한다. 이것을 DI라고 한다.

BeanFactory와 ApplicationContext

  • BeanFactory나 ApplicationContext를 스프링 컨테이너라 한다. 하지만 두가지가 같은 것은 아니다.

BeanFactory

  • 스프링 컨테이너의 최상위 인터테이스로 스프링 빈을 관리하고 조회(getBean())하는 역할을 담당한다.

ApplicationContext

  • BeanFactory의 기능을 상속받은 인터페이스로 스프링 빈을 관리하고 조회하는 역할을 수행한다.
  • 애플리케이션을 개발할 때 빈을 관리, 조회 이외에 MessageSource, EnvironmentCapable, EnvironmentCapable, ApplicationEventPublisher, ResourceLoader의 부가기능을 제공한다.
  • MessageSource : 메세지 소스를 활용하여 국제화 기능, 예를 들면 한국에서는 한국어로, 영어권에서는 영어로 출력하는 기능이다.
  • EnvironmentCapable : 환경변수, 개발을 할 때는 크게 3가지 환경이 있는데 로컬용, 개발용, 운영용이 있는데 각 환경 별로 구분해서 처리한다.
  • ApplicationEventPublisher : 애플리케이션 이벤트를 만들고 구독하든 모델을 편리하게 지원한다.
  • ResourceLoader : 파일, 클래스 패스, 외부 등에서 리소스를 편리하게 조회한다.

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

  • 스프링은 자바 config와 xml 등 다양한 설정 형식을 지원한다. 이것이 가능한 이유에는 BeanDefinition이 있다.
  • BeanDefinition은 스프링 빈의 정보를 추상화한 것으로 빈 설정 메타 정보라 한다. 즉 스프링 빈을 역할과 구현을 개념적으로 나눈 것이라 볼 수 있다.
  • 자바 코드를 읽든 xml을 읽든 스프링은 BeanDefinition을 만들고 스프링 컨테이너는 코드가 무엇인지는 상관하지 않고 BeanDefinition만 보면 된다.
  • 스프링 컨테이너는 이 BeanDefinition을 기반으로 스프링 빈을 생성하게 된다.



[Reference]

Inflearn 김영한 님의 스프링 핵심 원리 - 기본편 : https://www.inflearn.com/course/스프링-핵심-원리-기본편/dashboard

0개의 댓글

관련 채용 정보