스프링 컨테이너 생성
스프링 컨테이너 생성은 이전에 작성한 MemberApp 또는 OrderApp에서 사용한 방법으로 생성한다.
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext를 보통 스프링 컨테이너라고 부른다. ApplicationContext는 인터페이스인데, AnnotationConfiApplicationContext라는 ApplicationContext의 구현체를 사용하여 생성한다. AnnotaionConfig가 붙은 이름처럼 어노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 생성하게되며, 이외에 XML이나 Groovy를 통한 생성 방법도 있다.
사진처럼 ApplicationContext 인터페이스로 구현한 구현체가 AnnotaionConfigApplicationContext를 포함해서 많다.
스프링 컨테이너의 생성 과정
- 어노테이션 기반의 AppConfig.class를 바탕으로 스프링 컨테이너가 생성된다.
- 스프링 빈 저장소도 같이 생성된다.
- 스프링 빈 저장소는 빈 이름과 빈 객체의 쌍으로 구성된다.
- AppConfig.class에 @Bean 어노테이션을 가진 모든 메소드를 스프링 빈 저장소에 저장한다.
- 빈 이름은 기본적으로 메소드 이름을 사용하지만, 어노테이션에 name으로 직접 부여할 수도 있다.
- 빈 이름은 중복되면 안 된다. (덮어씌워지거나, 오류 발생)
- 스프링 빈 저장소에 모든 빈이 등록되면, 스프링 컨테이너는 AppConfig.class를 바탕으로 의존관계를 주입(DI)한다.
스프링 컨테이너에 등록된 모든 빈 조회
스프링 컨테이너에 실제로 스프링 빈들이 잘 등록되었는지 확인하기 위한 테스트 코드를 작성한다.
ApplicationContextInfoText
package spring.basic.beanfind;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import spring.basic.AppConfig;
public class ApplicationContextInfoTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("모든 Bean 출력하기")
void findAllBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + " object = " + bean);
}
}
@Test
@DisplayName("Application Bean 출력하기")
void findApplicationBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
//ROLE_APPLICATION : 직접 등록한 Application Bean
if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + " object = " + bean);
}
}
}
@Test
@DisplayName("Infrastructure Bean 출력하기")
void findInfrastructureBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
//ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 Bean
if(beanDefinition.getRole() == BeanDefinition.ROLE_INFRASTRUCTURE) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + " object = " + bean);
}
}
}
}
- getBeanDefinitionNames() 메소드로 스프링 컨테이너에 등록된 모든 빈 이름을 조회한다.
- getBean() 메소드로 빈 이름으로 빈 객체를 조회한다.
- getRole() 메소드로 빈 역할에 따른 빈 객체를 조회할 수 있다.
빈이 가질 수 있는 Role은 ROLE_APPLICATION(0), ROLE_SUPPORT(1), ROLE_INFRASTRUCTURE(2) 3가지다. APPLICATION은 사용자가 직접 등록한 빈이고, SUPPORT는 외부 라이브러리나 내부적으로 부요 빈을 돕는 설정/구성용 빈이고, INFRASTRUCTURE는 스프링 배우에서 사용하는 빈이다. 그리고 위 테스트 코드에서는 beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION
같이 비교하고 있는데, 괄호 안의 숫자처럼 beanDefinition.getRole() == 0
으로 작성해도 비교문은 True로 통과한다.
'스터디 > Spring' 카테고리의 다른 글
Spring 스터디2 - 6 (0) | 2025.04.27 |
---|---|
Spring 스터디2 - 5 (1) | 2025.04.19 |
Spring 스터디2 - 3 (0) | 2025.04.13 |
Spring 스터디2 - 2 (0) | 2025.03.30 |
Spring 스터디2 - 1 (0) | 2025.03.23 |