DI - Container, Bean

귀찮Lee·2022년 6월 17일
0

Spring

목록 보기
6/30

◎ 스프링 컨테이너(Spring Container)

  • 스프링 컨테이너(Spring Container)

    • 빈의 인스턴스화, 구성, 전체 생명 주기 및 제거 관리
      • 개발자가 정의한 Bean을 객체로 만들어 관리하고, 개발자가 필요할 때 제공
    • 의존성 주입을 통해 어플리케이션의 컴포넌트 관리
      • 서로 다른 빈을 연결해 애플리케이션의 빈을 연결하는 역할
      • 개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있다. (개발자가 호출을 위한 매개 변수를 따로 준비X)
  • 스트링 컨테이너 사용 목적

    • 객체간의 의존성을 낮추기 위해 : Spring 특징 IoC/DI
    • 객체 내부에서 new 생성자를 사용해서 계속 사용하면, 의존도가 높아짐 (클래스 일부 수정시, 다른 클래스에서 다 수정해야함;;)
    • 의존하는 대상을 인터페이스로 하고, 의존성 주입을 스프링 컨테이너가 하면서 쉽게 수정이 가능

◎ 스프링 컨테이너 구현

  • 스프링 컨테이너 구현

    • " ApplicationContext " 를 스프링 컨테이너라고 하고 인터페이스로 구현되어 있다.
    public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
    			MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
    • XML, 애너테이션 기반의 자바 설정 클래스로 만들 수 있다.
      • 예전에는 개발자가 XML을 통해 모두 설정해 주었지만, Spring Boot를 사용하면서 XML을 거의 사용하지 않음
  • 스프링 컨테이너의 생성 과정

    • 스프링 컨테이너는 Configuration Metadata를 사용
      • spring-configuration-metadata.json : IDE 개발자가 사용자에게 application.properties 또는 application.yml 파일 로 작업 할 때 상황 별 도움말 및 "코드 완성"을 제공 할 수 있도록 설계한 json 파일
    • 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록
    • new AnnotationConfigApplicationContext(구성정보.class)로 스프링에 있는 @Bean의 메서드를 등록
      • 어노테이션 기반의 자바 설정 클래스로 만들 시
      // Spring Container 생성
      ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
  • 스프링 컨테이너 종류

    • BeanFactory
      • 스프링 컨테이너의 최상위 인터페이스
      • 빈을 등록하고 생성하고 조회하고 돌려주는 등 빈을 관리하는 역할
      • getBean() 메소드를 통해 빈을 인스턴스화 할 수 있음
      • @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용해 빈 등록 실시
    • ApplicationContext
      • BeanFactory의 기능을 상속받아 제공
      • BeanFactory 기능 + 부가기능
    • ApplicationContext 부가기능 (참고)
      • MessageSource : 메세지 다국화를 위한 인터페이스
      • EnvironmentCapable : 개발, 운영 등 환경변수 등으로 나눠 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하는 인터페이스
      • ApplicationEventPublisher: 이벤트 관련 기능을 제공하는 인터페이스
      • ResourceLoader: 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회

◎ 빈(Bean)

  • 빈(Bean)

    • 인스턴스화된 객체를 의미
  • 자바 빈 (Java Bean)

    • 단순하게 클레스에서 field와 Getter/Setter만 가지고 있는 클래스
    • 스프링 빈과는 다름
  • 스프링 빈 (Spring Bean) : 스프링 컨테이너에 등록된 객체

    • Spring Container가 @Bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
    • 클래스의 등록정보, 게터/세터 메서드를 포함
    • 컨테이너에 사용되는 설정 메타데이터로 생성됨
    • 설정 메타데이터
      • 컨테이너의 명령과 인스턴스화, 설정, 조립할 객체를 정의
      • XML 또는 자바 애너테이션, 자바 코드로 표현
  • bean 접근 방법

    • getBean 메서드 을 사용하여 bean의 인스턴스를 가져올 수 있습니다. (정확한 방법은 찾아보자)
    • 실제적으로 응용 프로그램 코드에서는 getBean() 메서드로 호출하여 사용하면 안된다.
      • POJO 참고 (다른 기술이나 규약에 얽매이지 않아야 한다.)
  • BeanDefinition (Bean 설정 메타정보)

    • Bean은 BeanDefinition(Bean 설정 메타정보, 인터페이스)으로 정의되고 BeanDefinition에 따라서 활용하는 방법이 달라짐
      • 추상화된 빈데피니션의 구현체가 만들어지면 스프링 컨테이너가 해당 내용으로 빈을 등록하고 관리함
      • @Bean or < bean > 당 각 1개씩 메타 정보가 생성
      • 스프링 컨테이너는 설정 형식이 XML인지 Java 코드인지 모르고 BeanDefinition만 알면 된다. (추상화된 인터페이스에 의존)
    • static AnnotationConfigApplicationContext ac = 
      new AnnotationConfigApplicationContext(AppConfig.class);
      • AppConfing.class를 파라미터로 ac(ApplicationContext)를 생성하게 되면 내부적으로는 AppConfig.class 정보를 바탕으로 BeanDefinition인터페이스의 구현체 중 하나인 객체를 만든다. 그걸 바탕으로 스프링 빈을 생성한다.
      • AnnotationConfigApplicationContext에 AppConfig.class를 넘겨줬을 때, BeanDefinition의 구현체인 AnnotatedGenericBeanDefinition을 만들게 된다.
      • 해당 객체에서 Bean 메타 정보를 가지고 SpringContainer에서 Bean을 생성하게 된다.
    • 참고 자료
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글