본문 바로가기
  • Seizure But Okay Developer
BackEnd/Spring

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

by Sky_Developer 2023. 4. 22.

개요

스프링 컨테이너와 스프링 빈에 대해서 이해를 하기 위해 글을 작성합니다.

 

내용

스프링을 사용하는 근간이 되는 부분인 스프링 컨테이너가 생성되는 과정을 설명하겠습니다.

이 과정에서 ApplicationContext 이 사용되는데요.

// 스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

ApplicationContext을 간단 정리하자면

  • 스프링 컨테이너이자 인터페이스이며
  • XML 또는 어노테이션 기반 클래스 등으로 구현이 가능합니다

 

스프링 컨테이너가 구성되는 과정은 네 가지로 정리할 수 있습니다.

  1. 스프링 컨테이너 생성
  2. 스프링 빈 등록
  3. 스프링 빈 의존관계 설정 - 준비
  4. 스프링 빈 의존관계 설정 - 완료

각 과정에 대해서 간단히 설명하겠습니다.

 

1. 스프링 컨테이너 생성

 

위 그림처럼 빈 이름을 Key, 빈 객체를 Value로 갖는 스프링 빈 저장소가 생성되는 동시에 스프링 컨테이너도 생성됩니다.

이때 스프링 빈 저장소에 저장될 목록의 정보를 저장하기 위한 클래스가 매개변수로 넘겨집니다 (여기선 AppConfig.class)

new AnnotationConfigApplicationContext(AppConfig.class);

 

AppConfig.class

@Bean
public OOOService oooService {
	return new OOOServiceImpl(oooRepo());
}

@Bean
public XXXService xxxService {
	return new XXXServiceImpl(oooRepo(), ㅁㅁㅁPolicy());
}

@Bean
public OOORepo oooRepo {
	return new xxxoooRepo();
}

@Bean
public ㅁㅁㅁPolicy ㅁㅁㅁPolicy {
	return new xxxㅁㅁㅁPolicy();
}

 

 

이제 스프링 빈 저장소에 AppConfig.class 에 @Bean 과 같은 어노테이션이 붙은 메소드 들을 전부 스프링 빈 저장소에 등록합니다. 이 스프링 빈 저장소에 저장된 각각의 값들을 스프링 빈이라고 부릅니다.

 

AppConfig 코드에서 보듯 각각의 스프링 빈들은 서로를 의존하는데 스프링 컨테이너는 각 의존관계를 참고해서 의존관계를 주입합니다. 참고로 의존관계 주입에는 여러 단계가 나뉘어져 있습니다.

 

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

 

4. 스프링 빈 의존관계 설정 후

 

스프링 빈 조회

스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법은 아래와 같습니다.

  • ac.getBean(빈이름, 타입)
  • ac.getBean(타입)
  • ac.getBeansOfType(타입) - 해당 타입의 모든 빈 조회

타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생할 수 있습니다, 이때는 빈 이름을 지정해야 합니다.

 

스프링 빈 조회 - 상속 관계

부모 타입으로 조회하면, 자식 타입도 함께 조회합니다, 그래서 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회하게 됩니다.

 

 

BeanFactory와 ApplicationContext

BeanFactory와 ApplicationContext에 대해 조금 알아보겠습니다.

BeanFactory와 ApplicationContext 간에 관계는 아래 그림과 같은데요.

BeanFactory와 ApplicationContext 에 대해 각각 설명하면 아래와 같습니다.

 

BeanFactory

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

 

ApplicationContext

  • BeanFactory 기능을 모두 상속받아서 제공한다.
  • BeanFactory 기능을 모두 상속받지만 차이가 존재하는데 아래와 같다.
    • 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능은 물론이고, 수 많은 부가기능이 필요합니다.

 

ApplicatonContext가 제공하는 부가기능

 

각 인터페이스로 구분한 기능에 대해 간단히 설명하면 아래와 같습니다.

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

 

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

그러면 스프링은 어떻게 자바 코드 및 XML 형식등을 지원하는 것일까요? 그 중심에는 BeanDefinition 이라는 추상화가 있습니다.

 

추상화라고 했지만 역할과 구현을 개념적으로 나눈 것이라고 볼 수 있습니다. XML을 읽어서 BeanDefinition을 만들면 되고 자바 코드를 읽어서 BeanDefinition을 만들면 됩니다. 스프링 컨테이너는 자바 코드인지, XML인지 몰라도 되며 오직 BeanDefinition만 알면 됩니다.

 

이때 BeanDefinition 을 빈 설정 메타정보라 하는데요. @Bean, <bean> 당 각각 하나씩 메타 정보가 생성되고. 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성합니다.

 

 

 

참고

스프링 핵심 원리 - 기본편 (김영한)

'BackEnd > Spring' 카테고리의 다른 글

싱글톤 컨테이너  (0) 2023.04.29
객체지향 설계와 스프링  (0) 2023.04.16
DI 와 IoC 란 무엇인가? (최종 정리)  (0) 2023.03.23
Spring 배치 관련 정리  (2) 2022.12.21
Intellij_Spring 초기 세팅시 참고한 사이트들  (0) 2018.07.25

댓글