Spring/Spring 핵심 원리

[Spring] 스프링 컨테이너와 스프링 빈이란?

SeongHun._. 2022. 12. 26. 02:52

스프링 컨테이너란?

스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다. 여기서 말하는 자바 객체는 스프링에서 빈(Bean)이라고 부른다. 이러한 스프링 컨테이너는 DIIoC의 원리가 적용된다.

 

개발자는 직접 객체를 생성하고 소멸시킬 수 있으나, 이를 스프링 컨테이너가 대신해주는 것으로 이해하면 된다.

 

BeanFactory

스프링 빈을 관리하고 조회하는 역할을 담당한다.

getBean() 메서드를 통해 빈을 인스턴스화 할 수 있다.

 

AppConfig 예시

@Configuration
public class AppConfig {

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

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    @Bean
    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
//        return new FixDiscountPolicy();
    }
}

 

위와 같이 @Bean에 메서드 스프링 빈을 등록할 때 빈 이름은 기본적으로 메서드 이름으로 생성되며, 앞 글자는 소문자로 바뀐다. 빈 이름은 @Bean(name =  "원하는 이름")을 통해 변경할 수 있다. 하지만 일반적으로는 바꿔서 사용하는 경우는 거의 없다.

 

 

스프링 컨테이너는 내부적으로 스프링 빈을 저장하는 저장 공간이 있으며, 빈 이름은 Key로,  빈 객체를 Value로 하여 Map에 저장한다.

 

ApplicationContext

일반적으로 스프링 컨테이너라고 부른다.

ApplicationContext는 BeanFactory의 하위 인터페이스이며, 여러 구현체가 존재한다.

 

  • 메시지소스를 활용한 국제화 기능 - 각 나라에 맞는 언어로 출력해준다.
  • 환경변수 - 로컬, 개발, 운영 등을 구분해서 처리한다.
  • 애플리케이션 이벤트 - 이벤트를 발생하고 구독하는 모델을 편리하게 지원한다.
  • 편리한 리소스 조회 - 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회한다.

 

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

스프링 빈은 다양한 방법으로 등록이 가능하다.(어노테이션 사용, XML 설정 정보 사용 등)

이러한 설정이 가능한 이유는 스프링 빈을 만들 때 BeanDefinition이라는 추상화를 사용하기 때문이며, 스프링 빈을 생성하기 위해서는 어떠한 정보를 통해서라도 BeanDefinition을 만들 수 있다면 빈을 생성할 수 있다.

 

하나의 @Bean에서는 하나의 메타 정보가 생성되며, 이러한 정보를 기반으로 스프링 빈을 생성합니다.

 

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

 

Reference

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com