스프링 컨테이너와 스프링 빈 (1)

eunji·2024년 2월 2일
0

Spring

목록 보기
3/7
post-thumbnail

스프링 컨테이너 (Spring Container)

스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트로 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공한다.
스프링에서는 자바 객체를 빈(Bean)이라고 한다.

스프링 컨테이너 종류

스프링 컨테이너는 BeanFactory와 ApplicationContext로 구분할 수 있는데 BeanFactory를 직접 사용하는 경우가 거의 없으므로 일반적으로 ApplicationContext를 스프링 컨테이너라 한다.
BeanFactory는 빈의 생성과 관계설정 같은 제어를 담당하며, BeanFactory를 좀 더 확장한 것이 ApplicationContext 이다.

  • BeanFactory
    • 스프링 컨테이너의 최상위 인터페이스
    • 빈 등록, 생성, 조회 등 빈을 관리하는 역할
    • getBean() 메서드를 통해 빈을 인스턴스화 할 수 있음
    • @Bean 어노테이션이 붙은 메서드의 이름을 스프링 빈의 이름으로 사용하여 빈 등록
  • ApplicationContext
    • BeanFactory의 기능을 상속받아 제공하는 역할로, 그 외 부가 기능을 제공
      • 메시지 소스를 활용한 국제화 기능 : 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력
      • 환경변수 : 로컬, 개발, 운영 등을 구분해서 처리
      • 애플리케이션 이벤트 : 이벤트를 발행하고 구독하는 모델을 편리하게 지원
      • 편리한 리소스 조회 : 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회

스프링 컨네이터 특징

스프링 컨테이너는 빈의 인스턴스화, 구성, 전체 생명 주기를 관리한다. 스프링 컨테이너를 통해 원하는 만큼 객체를 가질 수 있으며, 애플리케이션의 컴포넌트를 관리할 수 있다. 또한 서로 다른 빈을 연결하여 애플리케이션 빈을 연결하는 역할을 한다.

  • 개발자는 모듈 간에 의존 및 결합으로 발생하는 문제로부터 자유로울 수 있음

스프링 컨테이너 생성

스프링 컨테이너는 XML을 기반으로 만들 수 있고, 어노테이션 기반의 자바 설정 클래스로 만들 수 있다.

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

  1. 스프링 컨테이너 생성(AppConfig.class)
  • new AnnotationConfigApplicationContext(AppConfig.class)로 구성 정보(AppConfig.class)를 지정
  1. 스프링 빈 등록
  • 구성 정보(AppConfig)로 등뢱된 클래스 내부에 @Bean 어노테이션이 붙은 메서드를 모두 호출하여 얻는 객체를 스프링 컨테이너에 등록
    • 빈 이름은 기본적으로 메서드 이름을 사용하며 이름을 직접 부여할 수도 있음
    • @Bean(name="memberService2")
    • 빈 이름은 항상 다른 이름을 부여해야 함(다른 빈이 무시되거나 기존 빈을 덮어버리는 등 오류 발생)
  1. 스프링 빈 의존관계 설정
  • 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI)함

어노테이션 기반 스프링 컨테이너 구성 방법

아래 코드는 어노테이션 기반의 자바 설정 클래스로 컨테이너를 구성하고 스프링 컨테이너에 등록하여 스프링 컨테이너를 생성하는 예시이다.

@Configuration
public class AppConfig {

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

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
profile
tech blog

0개의 댓글