스프링 핵심 원리 - 기본편 # Section 4

2024. 6. 9. 02:10Spring/스프링 핵심 원리 - 기본편

반응형

❓ 스프링 컨테이너

  • ApplicationContenxt 를 스프링 컨테이너라 한다.
  • ApplicationContext 는 인터페이스다.

스프링 컨테이너 생성 과정

  1. 스프링 컨테이너 생성
  2. 스프링 빈 등록
  3. 스프링 빈 의존관계 설정 - 준비
  4. 스프링 빈 의존관계 설정 - 완료
    • 설정 정보를 참고해서 의존관계를 주입(DI) 한다.

❓ 스프링 컨테이너의 등록 된 빈 조회 방법

@Test
@DisplayName("모든빈 출력하기")
void findAllBean() {
    String[] beanDefinitionNames = ac.getBeanDefinitionNames();
    for (String beanDefinitionName : beanDefinitionNames) {
        Object bean = ac.getBean(beanDefinitionName);
        System.out.println("name = " + beanDefinitionName + " object = " + bean);
    }
}
@Test
@DisplayName("애플리케이션 빈 출력하기")
void findApplicationAllBean() {
    String[] beanDefinitionNames = ac.getBeanDefinitionNames();
    for (String beanDefinitionName : beanDefinitionNames) {
        BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

        // BeanDefinition.ROLE_APPLICATION      : 일반적으로 사용자가 정의한 빈
        // BeanDefinition.ROLE_INFRASTRUCTURE   : 스프링이 내부에서 사용하는 빈
        if(beanDefinition.getRole() == BeanDefinition.ROLE_INFRASTRUCTURE) {
            Object bean = ac.getBean(beanDefinitionName);
            System.out.println("name = " + beanDefinitionName + " object = " + bean);
        }
    }
}
@Test
@DisplayName("빈 이름으로 조회")
void findBeanByName() {
    MemberService memberService = ac.getBean("memberService", MemberService.class);
    System.out.println("memberService = " + memberService);
    System.out.println("memberService class = " + memberService.getClass());

    assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("이름 없이 타입으로만 조회")
void findBeanByType() {
    MemberService memberService = ac.getBean(MemberService.class);
    assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
 @Test
@DisplayName("구체 타입으로 조회")
void findBeanByName2() {
    MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
    assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
@Test
@DisplayName("빈 이름으로 조회X")
void findBeanByNameX() {
    assertThrows(
            NoSuchBeanDefinitionException.class
            , () -> ac.getBean("test", MemberService.class
            )
    );
}
@Test
@DisplayName("타입으로 조회 시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다.")
void findBeanByTypeDuplicate() {
    assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(MemberRepository.class));
}

 

❓ BeanFactory 와 ApplicationContext

BeanFactory

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

ApplicationContext

  • BeanFactory 기능을 모두 상속받아서 제공한다.
  • BeanFactory 를 상속하기에 이외 부가적인 기능을 제공한다.
    • 메세지소스를 활용한 국제화 기능
    • 환경변수
    • 애플리케이션 이벤트
    • 편리한 리소스 조회

❓ BeanDefinition

 

  • BeanClassName : 생성할 빈의 클래스 명
  • factoryBeanName : 팩토리 역할의 빈을 사용할 경우 이름
  • factoryMethodName : 빈을 생성할 팩토리 메서드 지정
  • Scope : 싱글톤
  • lazyinit : 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 생성을 지연 처리 하는지 여부
  • InitMethodName : 빈을 생성, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
  • DestoryMethodName : 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
  • Constructor argumnets, Properties : 의존관계 주입에서 사용한다.

강의 출처

김영한의 스프링 로드맵 - 스프링 핵심원리 기본편

 

반응형