ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 빈과 스프링 컨테이너
    스프링 2021. 8. 2. 17:34

    김영한님의 스프링 핵심 원리 - 기본편 강의를 듣고 작성했습니다.

     

    스프링 핵심 원리 - 기본편 - 인프런 | 강의

    스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 개발자가 되어보세요! 📣 확인해주

    www.inflearn.com


     

    스프링 컨테이너

    스프링 빈이 저장되는 싱글턴 컨테이너를 스프링 컨테이너라고 한다.

    AppConfig.java

    • ApplicationContext 클래스를 스프링 컨테이너로써 사용한다.
    • 스프링 컨테이너를 사용해서 기존에 AppConfig를 설정하여 객체를 생성하고 DI를 하는 것을 대체 할 수 있다.
    • 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정 정보로 사용한다. 
    • @Bean 어노테이션이 붙은 메소드를 전부 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 
    • 이렇게 등록된 객체를 스프링 빈이라고 한다.
    • 스프링 빈은 @Bean이 붙은 메서드 명을 스프링 빈의 이름으로 사용한다.
    • 객체를 조회할떄 AppConfig를 사용해서 직접 조회하는게 아닌 스프링 컨테이너를 통해 객체를 찾을 수 있다. (applicationContext.getBean 활용)

     

     


     

    스프링 컨테이너 생성 과정

     

    1. 스프링 컨테이너 생성

    • new AnnotationConfigApplicationContexst(AppConfig.class)
    • 스프링 컨테이너를 생성할 떄는 구성 정보를 지정해주어야 한다. 
    • 여기서는 AppConfig.class를 구성 정보로 지정했다.

     

    2. 스프링 빈 등록

    • 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다
    • 빈 이름은 기본적으로 메소드 이름이 사용되며 애노테이션 속성을 이용해 직접 부여할 수 도 있다.
    • ex) @Bean(name="memberService2")

    ** 빈 이름은 항상 다른 이름을 부여해야 한다. 같은 이름이라면 다른 빈이 무시되거나 기존 빈을 덮어버릴 수 있다.

     

     

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

    4. 스프링 빈 의존관계 설정 - 완료

     

    * 스프링 컨테이너는 설정 정보를 참고해서 의존 관계를 주입한다. 

     

     

    * 스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있다. 하지만 이렇게 자바 코드로 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리하게 된다.

     

     

    스프링 컨테이너의 여러 메소드들

    • applicationContext.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회한다
    • applicationContext.getBean(빈이름, 타입) : 빈 이름으로 빈 객체(인스턴스)를 조회한다.
    • applicationContext.getBean(타입)
    • * 조회 대상 스프링 빈이 없으면 예외가 발생한다
    • 예외 이름) NoSuchBeanDefinitionException: No bean named 'xxxx' available

    getRole()

    • beanDefinition.getRole() : 스프링에서 사용하는 빈의 역할 구분
    • ROLE_APPLICTION: 일반적으로 사용자가 정의한 빈
    • ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈

     

     

    ac.getBeansOfType(빈타입):  같은 타입의 스프링 빈이 둘 이상 있을 때, 해당 타입의 모든 빈을 조회할 수 있다. 

     

     


     

    상속관계 스프링빈 조회

    스프링빈은  부모타입으로 조회하면 자식 타입도 함께 조회한다. 

    만약 최상의 클래스인 Object 타입으로 조회하면, 모든 스프링 빈을 조회한다.

     

     


     

    BeanFactory와 ApplicationContext

    상속관계

     

    BeanFactory

    • 스프링 컨테이너의 최상위 인터페이스
    • 스프링 빈을 관리하고 조회하는 역할을 담당한다
    • getBean()을 제공한다.

     

    ApplicationContext

    • BeanFactory의 기능을 모두 상속받아서 제공한다. 
    • 빈을 검색, 관리하는 기능을 BeanFactory가 전부 제공하는데 굳이 상속하여 사용하는 이유는 무엇이냐면
    • 개발에는 빈의 검색, 관리뿐만 아니라 여러 기능이 필요한데 ApplicationContext 클래스가 여러 클래스들을 상속해 기능들을 제공해준다. 

    이 기능들에는 다음과 같은 것들이 있다. 

    • 메시지소스를 활용한 국제화 기능
    • 로컬, 개발, 운영등의 상황에 맞게 환경변수 처리
    • 애플리케이션 이벤트
    • 파일, 클래스패스, 외부등에서 리소스를 편리하게 조회하도록 해주는 기능등을 포함한다.

     

     

     


     

    스프링 빈 메타 정보 - BeanDefinition

    스프링은 빈을 설정하는것을 자바파일뿐만 아니라 xml등의 파일로도 설정 할 수 있도록 만들어져있다.

    어떻게 다양한 설정 형식을 지원할 수 있을까?

    다음 이미지와 같이 역할과 구현을 나눔으로써 다양한 파일 형식을 지원하도록 했다.

     

     

     

    BeanDefinition

    * 스프링 컨테이너는 설정 파일이 어떤 언어로 구현되었는지 알 필요 없이 BeanDefinition만 안다면 설정을 읽어들일 수 있다.

     

     

    • BeanDefinition을 메타정보라고 한다.
    • @Bean, <bean>하나당 각각 하나씩 메타 정보가 생성된다.
    • BeanDefinition을 직접 생성해 적용시킬수도 있다.

     

    '스프링' 카테고리의 다른 글

    컴포넌트 스캔  (0) 2021.09.01
    싱글톤 패턴과 싱글톤 컨테이너  (0) 2021.08.28
    객체 지향 원리 적용  (0) 2021.07.29
    스프링과 객체지향설계  (0) 2021.07.25
    스프링 빈과 의존 관계  (0) 2021.07.16

    댓글

Designed by Tistory.