Spring 3rd Step

최보현·2022년 7월 8일
0

Spring

목록 보기
5/10
post-thumbnail

인프런 김영한 강사님의 스프링 핵심 원리 - 기본편 sec04

출처 : 스프링 핵심원리 - 기본편

🌿스프링 컨테이너와 스프링 빈

Spring Container

ApplicationContext은 스프링 컨테이너이자 인터페이스

ApplicationContext applicationContext = new
AnnotationConfigApplicationContext(AppConfig.class);

new 이후로는 인터페이스의 구현 객체

🪛스프링 컨테이너 생성 과정

  1. 스프링 컨테이너 생성 => 빈 이름과 빈 객체를 담을 수 있게 만들어 짐
  2. 스프링 빈 등록 => 빈 이름은 메서드 이름으로 사용(🚨항상 다른 이름 부여해야 함!)
  3. 스프링 빈 의존관계 설정 준비
  4. 스프링 빈 의존관계 설정 완료 => 설정 정보를 참고해서 주입함

🔍등록된 빈을 조회 하는 방법

실무에서는 거의 쓸 일은 없다고 한다. 우선 초심자의 마음가짐으로..!

@Test
@DisplayName("모든 빈 출력하기")
void findAllBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name=" + beanDefinitionName + " object=" +
bean); }
  • .getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름 조회
  • .getBean() : 빈 이름으로 빈 객체를 조회
@Test
@DisplayName("애플리케이션 빈 출력하기")
  void findApplicationBean() {
  String[] beanDefinitionNames = ac.getBeanDefinitionNames();
  for (String beanDefinitionName : beanDefinitionNames) {
        BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
        //Role ROLE_APPLICATION: 직접 등록한 애플리케이션 빈
        //Role ROLE_INFRASTRUCTURE: 스프링이 내부에서 사용하는 빈
        if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
                Object bean = ac.getBean(beanDefinitionName);
                System.out.println("name=" + beanDefinitionName + " object=" + bean);
            }
        }
    }

<스프링 빈 조회 - BASIC>

  • .getBean(빈이름, 타입)
  • .getBean(타입)
    조회 대상이 없으면 예외 발생 NoSuchBeanDefinitionException: No bean named 'xxxxx' available

<스프링 빈 조회 - 동일한 타입 둘 이상>

  • .getBeansOfType() : 해당 타입의 모든 빈 조회 가능
    빈 이름을 지정해서 찾으면, 해결

<스프링 빈 조회 - 상속 관계>
부모 타입으로 조회하면 자식 타입도 함께 조회 됨
동일한 자식이 둘 이상 있으면, 중복 오류 발생 -> 빈 이름을 지정하면 해결

👨🏻‍🦳BeanFactory와 ApplicationContext

BeanFactory

스프링 컨테이너의 최상위 인터페이스
스프링 빈을 관리하고 조회하는 역할 => .getBean() 제공
대부분의 기능을 이 아이가 제공

ApplicationContext

자주 사용하는 아이
BeanFactory의 기능을 모두 상속받아서 제공
애플리케이션을 개발할 때 필요한 수 많은 부가기능 들을 제공

  • 메세지소스를 활용한 국제화 기능 (한국어, 영어 출력해 줌)
  • 환경변수 (로컬, 개발, 운영 등을 구분해서 처리)
  • 애플리케이션 이벤트 (이벤트를 발행하고 구독하는 모델 지원)
  • 편리한 리소스 조회

🦑다양한 설정 형식 지원

ex) XML, 자바 코드, Groovy 등등
XML 설정 사용 -> 거의 안 씀
GenericXmlApplicationContext를 사용하면서 xml 설정 파일을 넘기면 됨!

어떻게 이게 가능하지?
BeanDefinition
빈 하나당 메타 정보가 생성되고 BeanDefinition을 빈 설정 메타정보라고 함
-> 이를 기반으로 컨테이너가 스프링 빈을 생성함

BeanDefinition 정보

  • BeanClassName: 생성할 빈의 클래스 명(자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
  • factoryBeanName: 팩토리 역할의 빈을 사용할 경우 이름, 예) appConfig
  • factoryMethodName: 빈을 생성할 팩토리 메서드 지정, 예) memberService
  • Scope: 싱글톤(기본값)
  • lazyInit: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때 까지 최대한 생성을 지연처리 하는지 여부
  • InitMethodName: 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
  • DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
  • Constructor arguments, Properties: 의존관계 주입에서 사용한다. (자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
profile
Novice Developer's Blog

0개의 댓글