-
Spring - 스프링 컨테이너(Spring Container)와 종류, 그리고 Bean 조회 방법Spring/Spring 2022. 1. 18. 23:28728x90반응형
스프링 컨테이너(Spring Container)
스프링 컨테이너는 자바 객체의 생명 주기를 관리한다. 지금까지 포스팅해왔던 순수 자바 코드로 개발자가 직접 해왔던 작업들을 스프링 컨테이너가 객체를 등록, 소멸의 역할을 대신해주게 된다. 즉, 개발자가 흐름을 제어하는 것이 아닌 외부(스프링 컨테이너)에서 제어해주게 된다는 뜻이다. - 제어의 역전(IoC)
또한 스프링 컨테이너는 객체를 등록한 후 각 객체들의 의존 관계를 런타임 과정에서 설정해준다.
- 의존관계주입(DI)
이전 포스팅한 코드로 스프링 컨테이너에 객체를 어떻게 등록하고 어떻게 의존관계가 설정되는지 알아보자.
스프링 컨테이너에 설정 클래스 등록
지금까지 작성한 설정 클래스(AppConfig)를 스프링 컨테이너에 등록해보자.
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext를 스프링 컨테이너라하며 위 코드는 AppConfig를 스프링 컨테이너에 등록시킨 코드이다. 이와 같이 해당 설정 클래스를 스프링 컨테이너의 파라미터로 넘겨주면 설정 클래스에 객체를 생성하는 메서드들을 Bean으로 등록한다.
빈 이름은 default로 메서드 이름을 이용하지만 직접 이름을 부여할 수도 있다.
ex) @Bean(name = "생성할 Bean의 이름")해당 Bean들의 등록이 모두 끝이나면 스프링 컨테이너는 등록된 Bean들간의 의존관계들을 파악하고 자동으로 주입을 해준다.
Bean 조회
AppConfig 설정 클래스를 스프링 컨테이너에 등록을 했다. 이전 포스팅 코드에서 한번 테스트 코드로 해당 빈들이 잘 등록이 되었는지 확인해보자.
@Test @DisplayName("빈 이름으로 조회") void findBeanByname(){ MemberService memberService = ac.getBean("memberService", MemberService.class); System.out.println("memberService = " + memberService); System.out.println("memberService.getClass() = " + memberService.getClass()); Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class); }
해당 테스트 코드를 실행해보면 스프링 컨테이너에 AppConfig 설정에 설정했던 객체들이 Bean으로 잘 등록된 것을 확인할 수 있다. 해당 Bean을 직접 조회하는 기능은 실무에서는 별로 쓰이지 않지만 처음 공부할때 스프링 컨테이너에 Bean들이 어떻게 등록이 되어있는지 파악하기 좋기에 한번쯤은 스프링 컨테이너에 등록된 빈들을 모두 확인해보는 작업을 해보길 바란다.
더보기getBean("빈이름", 빈타입)
- 빈 이름으로 조회getBean(빈타입)
- 빈 타입으로 조회
String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { Object bean = ac.getBean(beanDefinitionName); System.out.println("name = " + beanDefinitionName + " object = " + bean); }
- 모든 Bean 조회
String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName); //Role ROLE_APPLICATION: 직접 등록한 애플리케이션 빈 //Role ROLE_INFRASTRUCTURE: 스프링이 내부에서 사용하는 빈 if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){ Object bean = ac.getBean(beanDefinitionName); System.out.println("name = " + beanDefinitionName + " object = " + bean); } }
- 등록한 빈 모두 조회 or 스프링 내부에서 사용하는 빈 모두 조회
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class); for (String key : beansOfType.keySet()) { System.out.println("key = " + key); System.out.println("value = " + beansOfType.get(key)); } System.out.println("beansOfType = " + beansOfType); org.assertj.core.api.Assertions.assertThat(beansOfType.size()).isEqualTo(2);
- 특정 타입 모두 조회
스프링 컨테이너(Spring Container)의 종류
BeanFactory
- 스프링의 최상위 컨테이너
- 빈을 등록, 생성, 조회 등 빈을 관리하는 역활을 한다.
ApplicationContext
- BeanFactory의 모든 기능을 상속받는 인터페이스
- 추가로 많은 부가 기능이 제공된다.
- 스프링 컨테이너는 주로 부가 기능이 추가된 ApplicationContext를 이용
- MessageSource : 국제화 기능
- EnvironmentCapable : 환경변수
- ApplicationEventPublisher : 애플리케이션 이벤트
- ResourceLoader : 리소스 조회
728x90반응형'Spring > Spring' 카테고리의 다른 글
Spring - 컴포넌트 스캔(Component Scan) (0) 2022.01.23 Spring - 싱글톤 컨테이너 (0) 2022.01.23 스프링의 등장 - 순수 자바 코드에서 스프링까지 3 , IoC(제어의 역전)와 Di 그리고 등장하는 스프링 (0) 2022.01.16 스프링의 등장 - 순수 자바 코드에서 스프링까지 2 (0) 2022.01.16 스프링의 등장 - 순수 자바 코드에서 스프링까지 1 (0) 2022.01.15