Back-end/스프링 핵심원리 - 기본편

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

조 수빈 2024. 1. 1. 20:15

섹션 4, 스프링 컨테이너와 스프링 빈

📍 스프링 컨테이너 생성

// 스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

ApplicationContext = 스프링 컨테이너
인터페이스 <= ApplicationContext // 인터페이스 => XML / 애노테이션 기반 자바 코드 / ...
인터페이스 구현체 <= new AnnotationConfigApplicationContext(AppConfig.class);

참고) 정확히는 스프링 컨테이너를 BeanFactory, ApplicationContext로 구분함
But, BeanFactory를 직접 사용하는 경우 거의 X => 일반적으로 ApplicationContext를 스프링 컨테이너라 함


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

개념적 3가지 단계

  1. 스프링 컨테이너 생성
    스프링 컨테이너 생성 => 스프링 빈 저장소 (비어있음)

    • 구성 정보 지정해줘야 함 (AppConfig.class)
  2. 스프링 빈 등록
    파라미터로 넘어온 설정 클래스 정보(AppConfig.class)를 사용해 스프링 빈 등록

    1. @Bean 애노테이션 붙은 메서드 전부 호출

    2. 메서드 네임 => 빈 이름, return 객체 => 빈 객체

      Key : Value = 빈 이름 : 빈 객체

  3. 스프링 빈 의존관계 설정
    설정 정보 참고하여 의존관계 주입(DI)
    image

빈 이름

  • 메서드 이름 사용함
  • 직접 부여 가능 @Bean(name="memberService2")
  • 빈 이름은 항상 다른 이름을 부여해야 함

📍 스프링 빈 조회

ac.getBean(빈 이름, 타입)
ac.getBean(타입)

참고) 구체 타입으로도 조회 가능하지만, 변경 시 유연성 떨어짐


모든 빈 조회

ac.getBeanDefinitionNames();: 스프링에 등록된 모든 빈 이름을 조회
ac.getBean(beanDefinitionName): 빈 이름으로 빈 객체 조회 (Object 타입의 bean)

내가 등록한 빈만 조회 (스프링 내부 사용 빈 X)

getRole() 로 구분

ROLE_APPLICATION: 일반적으로 사용자가 정의한 빈
ROLE_INFRASTRUCTURE: 스프링이 내부에서 사용하는 빈

타입으로 조회

ac.getBeansOfType(): 해당 타입의 모든 빈 조회
❗ 타입으로 조회 시, 같은 타입의 스프링 빈이 둘 이상이면 오류 발생 => 빈 이름 지정하기

상속 관계
부모 타입으로 조회 => 자식 타입도 함께 조회
ex) Object 타입(모든 자바 객체의 최고 부모)으로 조회 => 모든 스프링 빈 조회


📍 BeanFactory와 ApplicationContext

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

ApplicationContext
BeanFactory 기능 모두 상속받아 제공
빈 관리 기능 + 여러 부가 기능

부가 기능 예시)

  • 메시지소스 활용한 국제화 기능
  • 환경변수 (로컬, 개발, 운영 등 구분하여 처리)
  • 애플리케이션 이벤트 (이벤트를 발행, 구독하는 모델을 편리하게 지원)
  • 편리한 리소스 조회 (파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회)

📍 다양한 설정 형식 지원 - 자바 코드, XML ..

스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있게 유연하게 설계되어 있음
ex) 자바 코드, XML, Groovy 등등
자바 코드(애노태이션 기반) => AnnotationConfigApplicationContext 클래스
XML => GenericXmlApplicationContext 클래스


📍 스프링 빈 설정 메타 정보 - BeanDefinition

BeanDefinition 추상화 => 스프링의 다양한 설정 형식 지원

역할과 구현을 개념적으로 나눈 것
image

스프링 컨테이너는 자바 코드인지, XML인지 몰라도 됨, BeanDefinition만 알면 됨

BeanDefinition을 빈 설정 메타정보라고 함
각각 @Bean, 당 하나씩 메타 정보 생성


스프링 핵심 원리 - 기본편