스프링 핵심 원리 - 기본편 : Spring Container, Bean

jkky98·2024년 6월 27일
0

Spring

목록 보기
6/77

스프링 컨테이너 생성

////// 컨테이너 생성 //////
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);


///// AppConfig /////

@Configuration
public class AppConfig {

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

우리는 위와 같이 스프링 컨테이너를 생성할 수 있다. 생성시 생성자에 AppConfig.class를 넘겨 @Configuration아래의 컨테이너 내부 정보를 읽어 적용한다.

이름이 굉장히 긴 편인데, AnnotationConfig은 컨테이너 내부의 설정을 애노테이션 방식으로(@Configuration, @Bean 사용)작성한 클래스 파일을 이용하기 때문에 붙은 이름이며, ApplicationContext는 두 개의 단어 각각 Application, 해당 컨텍스트가 애플리케이션 전체를 관리하고 설정하는 역할을 한다는 것을 의미한다. 이때 컨텍스트란 실제 번역으로는 "맥락", "환경"으로 번역되므로 애플리케이션 전체를 관리하는 환경 이를 줄여서 우리가 컨테이너라고 부르는 듯 하다.

Bean 가져오기

// 하나만 가져오기
ac.getBean(빈이름, 타입)
ac.getBean(타입)

// 모두 가져오기
ac.getBeanDefinitionNames() // -> 진짜 모두 가져오기 때문에 내가 등록하지 않고 디폴트로 존재하는, 스프링이 자체 생성한 빈까지 모두 가져온다.
// 여러개 가져오기
ac.getBeansOfType() 
// 해당 타입의 모든 빈 가져온다.
// 이때 다형성이 적용되어 해당 타입의 자식 타입도 함께 조회된다.
ac.getBeansOfType(Object.class)
// 모두 가져오기가 된다.

스프링 컨테이너 계층

처음에 우리가 생성한 AnnotationConfigApplicationContext의 인터페이스가 ApplicationContext이므로 AnnotationConfigApplicationContext말고도 다른 컨테이너 구현체가 존재한다는 것을 추측할 수 있다. 클래스 이름의 어원을 이해했으니, 알 수 있는 점은 ApplicationContext앞에 존재하는 단어조합은 설정파일에 관한 것이다.

실제로 AppConfig에 애노테이션과 함께 설정을 구성하는 것이 아니라 GenericXmlApplicationContext의 경우는 Xml파일로 설정을 구성하기도 한다.

ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");

위와 같이 appConfig.xml 파일을 넘긴다고 보면 된다.(xml은 구 시대적 방식이며 최근에는 스프링부트의 지원의 영향도 있고 애노테이션 방식을 보통 사용한다.)

ApplicationContext는 다시 BeanFactory의 상속을 받는데, BeanFactory는 .getBean()등 빈에 관련한 처리 메서드들을 제공한다. 보통의 기능들은 모두 BeanFactory에서 제공이 되는데 ApplicationContext는 부가기능을 주로 포함한다.

BeanDefinition

AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용하여 AppConfig.class를 읽어서 BeanDefinition을 생성한다. 즉 우리는 AnnotationConfigApplicationContext의 생성자에 AppConfig.class를 넣어 읽어들이는 것 처럼 보이지만 실제로는 다른 구현체가 AppConfig.class를 읽고 BeanDefinition을 만들어 AnnotationConfigApplicationContext는 BeanDefinition에만 의존한다.

그리고 다른 방식의 ApplicationContext구현체들도 모두 BeanDefinition을 사용한다. BeanDefinition이 만들어진 과정이 구현마다 다를 뿐이다.

출처 : 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

profile
자바집사의 거북이 수련법

0개의 댓글