[스프링 기본] 스프링 컨테이너와 빈 (2)

마코레·2022년 5월 2일
0

백엔드개발

목록 보기
12/18

🤗 인프런 [스프링 핵심원리-기본편]을 듣고 기록하는 글입니다

BeanFactory


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

ApplicationContext


  • BeanFactory 기능을 모두 상속받아서 제공
  • bean 관리 조회 이외의 다른 수많은 부가기능을 applicationContext가 제공
  1. MessageSource - 메세지 소스를 활용한 국제화 기능

    • 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력하는것
  2. EnviornmentCapable - 환경변수

    • 로컬개발 / 테스트서버(개발환경) / 운영환경 이런식으로 실제로는 구성
    • 각 환경별로 어떤 db랑 연결해야하는지 등, 환경변수 관련 기능 처리
  3. ApplicationEventPublisher - 애플리케이션 이벤트

    • 이벤트를 발행, 구독하는 모델 편리하게 지원
  4. ResourceLoader - 편리한 리소스 조회

    • 파일, 클래스path, 외부 등에서 리소스를 편리하게 조회하는 기능

그외 설정 형식


설정 종류들

  • 이런식으로 java코드 외에도 xml, grovvy등이 존재함
  1. 자바코드 - AppConfig.class
    • AnnotationConfig
    • ApplicationContext
  2. XML - appConfig.xml
    • GenericXml
    • ApplicationContext
    • xml은 과거에 많이 사용했던거여서 구글에서 정보 검색할때나 그럴때도 xml이 많이 나오긴함. 나도 그걸 느껴서 어떻게 읽는지를 알아두면 적용하는데 더 편할거같음
  3. XXX - appConfig.xxx
    • Xxx
    • ApplicationContext

xml 파일 만드는법

bean 메타 정보 - BeanDefinition


  • 스프링이 이렇게 다양한 설정형식을 지원하는 방법 = BeanDefinition이라는 추상화 덕분
  • 역할과 구현을 개념적으로 나눈것
  • BeanDefinition을 빈 설정 메타정보라고 하는데, @Bean이나 < bean > 작성때마다 메타 정보가 생성되고, 이 메타정보를 기반으로 스프링 빈을 생성함

java 코드로 생성시 메타정보 생성 과정

  • AnnotatedBeanDefinitionReader를 사용해서 AppConfig를 읽고, BeanDefinition 생성

xml로 생성 시 메타정보 생성 과정

  • GenerixXmlApplicationContext는 XmlBeanDefinitionReader를 사용해서 appConfig.xml을 읽고 BeanDefinition을 생성하는것

메타정보 확인 코드

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("빈 설정 메타정보 확인")
    void findApplicationBean() {
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

            if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
                System.out.println("beanDefinition = " + beanDefinition +
                        "beanDefinition = " + beanDefinition);
            }
        }
    }

  • 이런식으로 다양한 정보를 가지고있음. 얘가 싱글톤인지, lazyinit인지 등등

  • BeanDefinition을 직접 생성해서 스프링 컨테이너에 등록가능.

  • 하지만 그런짓을 할리는 거의 없고, 그냥 다양한 형태의 설정정보를 BeanDefinition으로 추상화해서 사용하는구나만 알고있으면됨.

  • 가끔 스프링 코드같은거 보면 BeanDefinition이 보일때 있음. 그럴때 도움되라고 조금 배워둔거임

빈 등록방법

  1. 직접 springcontainer에 등록하는방법
  2. factory method를 쓰는 방법
    • 우리가 annotation을 사용해서 막 만들던 방식이 이쪽에 해당됨.
    • appConfig라는 factory method를 통해서 만들었다~
profile
새싹 백엔드 개발자

0개의 댓글