[Spring]스프링 핵심 원리(기본편) - 4. 스프링 컨테이너와 스프링 빈

Wooyong Jung·2023년 9월 15일
0
post-thumbnail
post-custom-banner
  • 해당 게시물은 인프런 "스프링 핵심 원리 - 기본편" 강의를 참고하여 작성한 글입니다.
  • 자세한 코드 및 내용은 강의를 참고해 주시길 바랍니다.
    강의링크 -> 스프링 핵심 원리 - 기본편 (김영한)

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

  • 스프링 컨테이너를 생성하고 컨테이너에 등록된 빈을 조회합니다.
  • BeanFactory와 ApplicationContext에 대해 알아봅니다.
  • 다양한 설정 형식을 지원하는 BeanDefinition에 대해 알아봅니다.

📄 스프링 컨테이너 생성

1) 스프링 컨테이너 생성

ApplicationContext applicationContext =
	new AnnotationConfigApplicationContext(AppConfig.class);

ApplicationContext : 스프링 컨테이너 인터페이스
AnnotationConfigApplicationContext : ApplicationContext 인터페이스의 구현체
AppConfig.class : 구성 정보

2) 스프링 빈 등록

스프링 컨테이너는 파라미터로 넘어온 구성 정보를 사용해서 스프링 빈을 등록

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

스프링 컨테이너는 구성 정보를 참고해서 의존관계를 주입(DI)


📄 컨테이너에 등록된 모든 빈 조회

AnnotationConfigApplicationContext ac = new
	AnnotationConfigApplicationContext(AppConfig.class);

@Test
@DisplayName("모든 빈 출력하기")
void findAllBean() {
    String[] beanDefinitionNames = ac.getBeanDefinitionNames();
    for (String beanDefinitionName : beanDefinitionNames) {
        Object bean = ac.getBean(beanDefinitionName);
        System.out.println("beanDefinitionName = " + beanDefinitionName + ", object = " + bean);
    }
}

ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회
ac.getBean() : 빈 이름으로 빈 객체를 조회


📄 스프링 빈 조회

ac.getBean(빈이름, 타입) : 스프링 빈을 찾는 가장 기본적인 조회 방법
ac.getBeansOfType() : 해당 타입의 모든 빈 조회

  • 부모 타입으로 조회하면, 자식 타입도 함께 조회
  • 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회

📄 BeanFactory와 ApplicationContext

BeanFactory

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

ApplicationContext

  • BeanFactory 기능을 모두 상속받아 제공
  • BeanFactory의 기능 외 수 많은 부가 기능 제공
    (메시지 소스를 활용한 국제화 기능, 환경변수, 애플리케이션 이벤트, 편리한 리소스 조회 등등)

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

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

ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
		...
<bean id="memberService" class="hello.core.member.MemberServiceImpl">
	<constructor-arg name="memberRepository" ref="memberRepository" />
</bean>
		...

xml 기반의 appConfig.xml 스프링 설정 정보와 자바 코드 기반의 AppConfig.java 설정 정보를 비교해보면 거의 비슷하다.


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

스프링은 BeanDefinition이라는 추상화를 이용해 이런 다양한 설정 형식을 지원한다.

  • AnnotationConfigApplicationContextAnnotatedBeanDefinitionReader 를 사용해서 AppConfig.class 를 읽고 BeanDefinition 을 생성한다.
  • GenericXmlApplicationContextXmlBeanDefinitionReader 를 사용해서 appConfig.xml 설정 정보를 읽고 BeanDefinition 을 생성한다.
  • 새로운 형식의 설정 정보가 추가되면, XxxBeanDefinitionReader를 만들어서 BeanDefinition 을 생성하면 된다.
profile
실패를 두려워하지 않는 백엔드 개발자가 되기 위해 노력하고 있습니다.
post-custom-banner

0개의 댓글