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

2023. 2. 13. 14:44

스프링 컨테이너 (Spring Container)

스프링 컨테이너는 애플리케이션 내부에서 사용되는 객체들을 관리한다. 
정확히는 애플리케이션 빈의 생명주기를 관리하는데 빈 생성, 관리, 제거 등의 역할을 담당하는 곳이다. 객체들의 의존성 또한 관리해주기 때문에 개발자는 모듈 간 의존 및 결합으로 인해 발생하는 문제로부터 자유로워지고 핵심 로직에 집중할 수 있게 된다. 

컨테이너는 BeanFactory와 BeanFacotry를 상속받아 사용하는 ApplicationContext가 있다. 

ApplicationContext가 BeanFactory의 기능에 더해 부가적으로 국제화, 환경변수 등 여러 기능을 제공하기 때문에 대부분의 경우에는 ApplicationContext를 사용한다.

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
        
        }

스프링 컨테이너를 사용할 땐 AnnotationConext 인터페이스를 구현한 AnnotationConfigApplicationConext를 사용하고 파라미터로 @Configuration 애너테이션이 붙은 구성 정보 클래스를 넣어준다

@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();
    }
}


ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

 

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

1. 스프링 컨테이너 생성

new AnnotationConfigApplicationConext(AppConfig.class)처럼 파라미터로 구성 정보 클래스를 넣어준다. 

 

2. 스프링 빈 등록

컨테이너는 파라미터로 넘어온 클래스들을 실행시켜 빈들을 컨테이너에 등록한다.

이때 빈 이름은 @Bean 애너테이션이 붙은 메서드의 이름으로 저장된다. 

3. 스프링 빈 의존관계 설정

컨테이너는 설정 정보를 참고해서 의존관계 주입을 수행한다.

 


스프링 빈 (Spring Bean)

빈은 스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트이다.

즉, @Bean 애너테이션이 적힌 메서드를 모두 호출해서 스프링 컨테이너에 저장되는 객체들을 말한다.

 

빈 관련 메서드

1. ac.getBeanDefinitionNames() : 컨테이너에 등록된 모든 빈 이름 조회
2. ac.getBean() : 빈 이름으로 빈 객체 조회 (빈 이름, 타입), (타입)
                           -> 조회할 빈이 없으면 예외가 발생한다. (NoSuchBeanDefinitionException)
3. ac.getRole() : 스프링 내부에서 사용하는 빈과 자체적으로 등록한 빈 구별할 수 있는 메서드
3 - 1. BeanDefinition.ROLE_APPLICATION : 개발자가 정의한 빈
3 - 2. BeanDefinition.ROLE_INFRASTRUCTURE : 스프링 내부적으로 사용하는 빈

 

참고 자료  : 김영한님 스프링 핵심 원리 - 기본편

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

BELATED ARTICLES

more