나의 개발일기

스프링 컨테이너와 빈 본문

Spring

스프링 컨테이너와 빈

이성제 2023. 9. 26. 18:16

스프링 컨테이너

  • 스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트이다.
  • ApplicationContext를 스프링 컨테이너라 한다.
  • 스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공한다.
  • 스프링에서는 자바 객체를 빈(Bean)이라 한다.
  • 즉, 스프링 컨테이너는 내부에 존재하는 빈의 생명주기를 관리(빈의 생성, 관리, 제거 등)하며, 생성된 빈에게 추가적인 기능을 제공하는 것이다.
  • 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로 만들 수 있다.

빈(Bean)

  • Spring에 의하여 생성되고 관리되는 자바 객체를 Bean이라고 합니다.
  • 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다
@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(MemberRepository());
    }

    @Bean(name = "memberRepo") // 빈에 직접 이름 부여
    public MemberRepository MemberRepository() {
        return new MemoryMemberRepository();
    }
  • 빈 이름
    • 빈 이름은 메서드 이름을 사용한다.
    • 빈 이름을 직접 부여할 수 도 있다.
    • 주의 : 빈 이름은 항상 다른 이름을 부여해야 한다. 중복 시  다른 빈이 무시되거나, 기존 빈을 덮어버리거나 설정에 따라 오류가 발생한다.

BeanFactory와 ApplicationContext

BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스다.
  • 스프링 빈을 관리하고 조회하는 역할을 담당한다.
  • getBean()을 제공한다.
  • 사용하는 대부분의 기능은 BeanFactory가 제공하는 기능이다

ApplicationContext

  • 기능을 모두 상속받아서 제공한다.
  • 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해 준다
  • 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능은 물론이고, 수많은 부가기능이 필요하다.
  • ApplicationContext가 제공하는 부가 기능
    • 메시지소스를 활용한 국제화 기능
      • 예를 들어서 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력
    • 환경변수 로컬, 개발, 운영 등을 구분해서 처리
    • 애플리케이션 이벤트 이벤트를 발행하고 구독하는 모델을 편리하게 지원
    • 편리한 리소스 조회 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회

스프링 빈 조회 

스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법

  • 모든 빈 출력
    • getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회한다.
    • getBean() : 빈 이름으로 빈 객체(인스턴스)를 조회한다
  • 애플리케이션 빈 출력
    • 스프링이 내부에서 사용하는 빈은 getRole()로 구분할 수 있다.
      • ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈
      • ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈

상속 관계

  • 부모 타입으로 조회하면, 자식 타입도 함께 조회한다.
  • 그래서 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회할 수 있다.

 

정리

  • ApplicationContext는 BeanFactory의 기능을 상속받는다.
  • ApplicationContext는 빈 관리기능 + 편리한 부가 기능을 제공한다.
  • BeanFactory를 직접 사용할 일은 거의 없다. 부가기능이 포함된 ApplicationContext를 사용한다.
  • BeanFactory나 ApplicationContext를 스프링 컨테이너라 한다

'Spring' 카테고리의 다른 글

컴포넌트 스캔  (0) 2023.10.19
싱글톤 컨테이너  (0) 2023.10.11
IoC, DI, 컨테이너  (0) 2023.09.20
SOLID 객체 지향 5대 설계 원칙  (0) 2023.09.08
Spring 정리  (0) 2022.11.17