Spring 컨테이너와 Bean

길셔·2021년 12월 13일
0

스프링(Spring)

목록 보기
4/10
post-thumbnail

- ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

  • 앞서 사용했던 이 코드를 자세히 살펴보면,
  • 인터페이스인 ApplicationContext는 스프링 컨테이너라 한다.
  • AnnotationConfigApplicationContext는 ApplicationContext의 구현체이다.
  • 스프링 컨테이너는 xml 기반 or 어노테이션 기반으로 자바 설정 클래스로 만들 수 있다.( 위에는 어노테이션 기반이다.)
  • 최상위에 BeanFactory가 있고, 하위에 ApplicationContext가 있어서 정확히는 스프링 컨테이너를 구분지어 불러야하지만,
    사실 직접적으로 BeanFactory를 사용할 일은 거의 없기 때문에 ApplicationContext를 스프링 컨테이너로 부른다.

- BeanFactory (Interface) - ApplicationContext (Interface) - AnotationConfigApplicationContext (구현체)

  • BeanFactory
    • 스프링 컨테이너의 최상위 인터페이스
    • 스프링 빈을 관리하고 조회하는 역할을 담당한다.
    • getBean()를 제공한다.
    • 지금까지 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능이다. ( like, getBean() )
  • ApplicationContext
    • BeanFactory 기능을 모두 상속받아서 제공한다.
    • BeanFactory와의 차이점은 애플리케이션을 개발할 때는 빈은 관리하고 조회하는 기능은 물론이고, 수 많은 부가 기능이 필요하다.
    • 기능 (Interface)
      • MessageSource (메시지소스를 활용한 국제화 기능) :
        한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력
      • EnvironmentCapable (환경 변수) :
        로컬, 개발, 운영 등을 구분해서 처리
      • ApplicationEventPublisher (애플리케이션 이벤트) :
        이벤트를 발행하고 구독하는 모델을 편리하게 지원
      • ResourceLoader ( 편리한 리소스 조회) :
        파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회
  • 요약 :
    • ApplicationContext는 BeanFactory의 기능을 상속받고, 빈 관리기능 + 편리한 부가 기능을 제공한다.
    • BeanFactory를 직접 사용할 일은 거의 없다. 부가기능이 포함된 ApplicationContext를 사용한다.
    • 그래서 ApplicationContext나 BeanFactory을 스프링 컨테이너라 한다.

- 컨테이너 작업 순서

1. 스프링 컨테이너 생성

  • new AnnotationConfigApplicationContext(AppConfig.class)
  • 스프링 컨테이너를 생성할 때는 구성 정보(AppConfig.class)를 지정해줘야한다.

2. 스프링 bean 등록

  • 컨테이너는 파라미터로 넘어온 설정 클래스(구성 정보(AppConfig.class))를 사용해서 @Bean이 붙어있는 곳을 확인한 후 등록한다.
  • 빈 이름은 메소드 이름을 사용하며 직접사용할 수도 있다. (컨테이너에서는 이 이름을 key로 사용)
  • 그리고 컨테이너는 메소드 안에 있는 return 값을 key의 value로 저장한다.
  • 빈 이름은 절대 헷갈리지X, 중복X

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

  • 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI) 한다.
  • 스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나뉘어있다. (자바 코드로 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리)

- Bean 존재 확인 메소드

  • .getBean(빈이름, [타입]), .getBeanOfType(),
  • bean 조회 (상속 관계)
    • 부모를 조회하면 자식 클래스까지 모두 출력된다.
    • 부모 클래스를 조회했을 때 자식이 여러개라면 빈 이름을 지정하면 된다.

- 다양한 설정 형식 지원

  • 스프링 컨테이너는 다양한 형식의 설정 정보를 받아드릴 수 있게 유연하게 설계되어 있다. (자바, XML, Groovy 등등)
    • ex) BeanFactory - ApplicationContext - AnnotationConfigAppicationContext > AppConfig.class
      BeanFactory - ApplicationContext - GenericXmlApplicationContext > appConfig.xml
      BeanFactory - ApplicationContext - XxxAplicationContext > appConfig.xxx
  • 어노테이션 기반 자바 코드 설정 사용 :
    • 여태 해왔던 new AnnotationConfigAppicationContext(AppConfig.class)를 사용하면서 자바 코드로된 설정 정보를 넘기면 된다.)
  • XML 설정 사용
    • 최근에는 스프링 부트를 많이 사용하면서 XML 기반의 설정은 잘 사용하지 않는다. 아직 많은 레거시 프로젝트들이 XML로 되어 있고, 또 XML을 사용하면
      컴파일 없이 빈 설정 정보를 변경할 수 있는 장점도 있으니 먼저 XML로 배워두는 것도 괜찮다.
    • GenericXmlApplicationContext 를 사용하면서 xml 설정 파일을 넘기면 된다.

- Bean 설정 메타데이터 정보 (BeanDefinition)

  • 스프링은 BeanDefinition으로 추상화를 해서 역할과 구현을 개념적으로 나누었다.
    • xml, 자바코드 등을 읽어서 BeanDefinition을 만들면 된다. 즉, 스프링 컨테이너는 자바 코드인지, xml인지 몰라도 되고 BeanDefinition만 알면 된다.
  • BeanDefinition을 빈 설정 메타정보라고 한다. (@Bean, 당 각가 하니씩 메타 정보가 생성된다.)
  • 스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
  • BeanDefinition은 직접 스프링 빈을 등록하는 방법과 FactoryBean을 통해 등록하는 방법이 있다.
    (일반적으로 @Configuration사용은 FactoryBean)
profile
까먹지말자

0개의 댓글