[Spring] 스프링 컨테이너와 빈
스프링 컨테이너 (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 : 스프링 내부적으로 사용하는 빈
참고 자료 : 김영한님 스프링 핵심 원리 - 기본편
'Programming > Spring' 카테고리의 다른 글
[Spring] RequestContextHolder를 통해 HttpServletRequest, Response 가져오기 (0) | 2023.02.17 |
---|---|
[Spring] 같은 타입의 빈 문제 해결 방법(@Primary, @Qualifier) (0) | 2023.02.15 |
[Spring] 예외처리 - ExceptionHandler, ControllerAdvice (0) | 2022.10.30 |
[Spring] Spring MVC 구조 (0) | 2022.10.25 |
[Spring] 스프링 의존관계 주입 방법 (0) | 2022.10.24 |