스프링 컨테이너 ApplicationContext

Seyeong·2022년 10월 20일

스프링

목록 보기
1/7

스프링 컨테이너

  • ApplicationContext를 스프링 컨테이너라 한다.

  • 기존에 스프링을 쓰지않고는 개발자가 AppConfig(딱히 의미가 있는 이름은 아니다. 그냥 파일명일뿐..)를 사용해서 객체를 생성하고 DI를 했지만, 스프링을 이용하면 위의 스프링 컨테이너를 통해서 빈을 가져온다.

  • 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정 정보로 사용하는데, 이때 @Bean이 붙은 '모든 메서드를 호출(실행)'하여 반환(return)된 객체를 스프링 컨테이너에 빈으로 등록한다.

  • 스프링 빈은 @Bean이 붙은 '메서드의 이름'을 스프링 빈의 이름으로 사용한다.

사실 스프링 컨테이너(ApplicationContext)를 이용하면 아래처럼 코드가 더 길어지고 실행도 복잡해진다.

스프링을 사용하지 않을 때

MemberService memberService = AppConfig.memberService();
이렇게 자바 코드만으로 객체를 가져올 수 있다.

스프링을 사용할 때

ApplicationContext ac =
new AnnotationApplicationContext(AppConfig.class);
위의 코드로 스프링 컨테이너를 가져온 뒤
MemberService memberSerivce =
ac.getBean("memberService", MemberService.class);
로 빈을 얻어와야 한다.

이렇게 겉보기에는 코드도 더 길고 복잡해보이는데도 불구하고 스프링 컨테이너를 사용하는 이유는 애플리케이션을 개발하는데 있어서 많은것을 지원해주기 때문이다.

스프링 컨테이너 생성 과정

1. 스프링 컨테이너 생성

ex) new AnnotationApplicationContext(Config);
스프링 컨테이너는 생성 시에 설정 정보(Config)를 넘겨주어야 한다.

2. 스프링 빈 등록 & 의존관계 주입 - 준비

스프링 컨테이너는 파라미터로 넘어온 설정 정보를 사용해서 스프링 빈을 등록한다. 추가적으로 의존관계들을 서로 연결짓기 위해 모든 스프링 빈을 생성하는 단계이기도 하다.

-> 참고로 생성자 주입의 경우, 해당 객체를 스프링 빈으로 등록하려면 그 객체를 생성하여 저장해야 하는데 이 과정에서 생성자 호출이 불가피하다. 즉, 생성자 주입은 스프링 컨테이너가 생성자를 호출하면서 해당 빈의 의존관계까지 같이 주입해버리는 특징이 있지만, 수정자 주입같은 경우는 모든 스프링 빈이 생성이 된 후에 주입이 되는 특징이 있다.

3. 의존관계 주입 - 완료

스프링 컨테이너는 설정 정보를 참고하여 의존관계를 주입(DI)한다.

BeanFactory와 ApplicationContext

최상위 인터페이스 BeanFactory

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

ApplicationContext 인터페이스

ApplicationContext 인터페이스는 BeanFactory를 상속받았기 때문에 BeanFactory의 모든 기능을 제공하며 추가로 많은 부가 기능을 제공한다.

ApplicationContext의 구조

ApplicationContext는 BeanFactory를 포함한 여러 인터페이스를 추가로 상속받고 있다.

실제 코드를 보면 사진보다 조금 더 많이 상속받고 있는것이 보인다.

이러한 ApplicationContext가 제공하는 부가기능은 다음과 같다.

  • 메시지 소스를 이용한 국제화 기능
  • 환경변수
    로컬, 개발, 운영 등을 구분해서 처리
  • 애플리케이션 이벤트
    이벤트를 발행하고 구독하는 모델을 편리하게 지원
  • 편리한 리소스 조회
    파일, 클래스 패스, 외부 등에서 리소스를 편리하게 조회

이러한 BeanFactory와 ApplicationContext는 스프링 컨테이너라고 불리며, 보통은 BeanFactory 단독으로 사용할 일은 거의 없고 이를 확장한 ApplicationContext를 사용하게 된다.

빈 설정 메타정보 BeanDefinition

스프링 컨테이너는 설정파일을 이용하여 스프링 빈을 생성한다.
좀 더 정확히는, '설정파일을 이용해 BeanDefinition을 생성하고 이를 이용해 스프링 빈을 생성'한다.

Annotation으로는 @Bean, XML로는 <Bean> 하나당 메타 정보가 생성되는데 스프링 컨테이너는 이러한 메타 정보를 기반으로 스프링 빈을 생성한다.

BeanDefinition 원리

Annotation 기반의 @Configuration 설정 정보를 기준으로 설명하자면

ApplicationContext를 상속받은 AnnotationConfigApplicationContext 구현체 내부엔 어노테이션을 기반으로 BeanDefinition을 생성해주는 필드가 존재한다. (AnnotatedBeanDefinitionReader)

이러한 BeanDefinition은 추상화되어 있으며 각각 Annotation, XML, 또는 개발자가 만든 어떠한 설정 정보들별로 각각 구현할 수 있게 하였다.

이렇게 생성된 BeanDefinition을 이용해 스프링 컨테이너는 스프링 빈을 생성한다.

0개의 댓글