참고
Spring core basic 시리즈는 김영한 님의 "스프링 핵심 원리 - 기본편" 강의를 정리한 글입니다. 글에 첨부된 사진은 해당 강의의 강의 자료에서 캡쳐한 것입니다. 제 Github에만 올려뒀다가, 정보 공유와 강의 홍보(?)를 위해 블로그에도 업로드합니다. 마크다운을 잘 쓰지 못해서 가독성이 조금 떨어지는 점 양해 바랍니다.
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com
스프링 컨테이너 생성
스프링 컨테이너가 생성되는 과정을 알아보자.
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext
를 스프링 컨테이너라고 한다.
ApplicationContext
는 인터페이스이다. 즉 다형성이 적용된다. 스프링 컨테이너는 XML을 기반으로 만들 수 있고, annotation 기반의 자바 설정 클래스로 만들 수 있다.
우리가 사용했던 AnnotationConfigApplicationContext
가 ApplicationContext
의 구현체 중 하나이다. 이 구현체는 이름처럼 annotation 기반이다.
엄밀히 이야기 하면 스프링 컨테이너를 부를 때 BeanFactory
와 ApplicationContext
를 구분해서 이야기한다. 이 부분은 뒤에서 설명하겠다. BeanFactory
를 직접 사용하는 경우는 거의 없으므로 일반적으로 ApplicationContext
를 스프링 컨테이너라 한다.
스프링 컨테이너의 생성 과정
1. 스프링 컨테이너 생성
new AnnotationConfigApplicationContext(AppConfig.class)
를 통해 AppConfig 클래스의 정보를 넘겨주며 스프링 컨테이너를 생성한다.- 스프링 컨테이너를 생성할 때는 구성 정보를 지정해줘야 하고, 여기서는
AppConfig.class
를 지정해줬다.
2. 스프링 빈 등록
- 스프링 컨테이너가 파라미터로 넘어온 구성 정보(
AppConfig.class
)를 사용해서 스프링 빈을 등록한다. @Bean
이 붙은 메소드를 전부 호출한다. 메서드 이름을 빈 이름(key)로, 메서드 호출로 인해 생성된 객체를 빈 객체(value)로 등록한다.
빈 이름은 기본적으로 메서드 이름이 사용된다. 원한다면 직접 빈 이름을 부여할 수 있다.
주의할 점은 빈 이름은 중복되어서는 안된다는 것이다. 같은 이름을 부여하면 다른 빈이 무시되거나, 기존 빈을 덮어버리게 된다.
3. 스프링 빈 의존관계 설정 - 준비
객체를 생성해서 스프링 빈으로 등록한 상태
4. 스프링 빈 의존관계 설정 - 완료
- 스프링 컨테이너는 설정 정보(
AppConfig.class
)를 참고해서 DI를 한다. 여기서 의존관계는 동적인 객체 인스턴스의 의존관계를 의미한다. - 단순히 Java 코드를 호출하는 것 같지만 차이가 있다고 한다. 이 차이는 뒤에 싱클톤 컨테이너에서 다룬다.
참고 사항
실제 스프링의 라이프 사이클을 보면 위의 설명처럼 빈을 생성하는 단계와 DI를 하는 단계가 나누어져 있다. 하지만 앞에서 작성한 AppConfig.java
의 코드로 스프링 빈을 등록하게 되면, 생성자를 호출하면서 DI도 한번에 하게 된다.
@Bean
public MemberService memberService() {
//memberService bean을 등록하는 동시에 memberRepository와의 의존관계를 주입함
return new MemberServiceImpl(memberRepository());
}
자세한 내용은 의존관계 자동 주입에서 다시 다룬다.
정리
스프링 컨테이너를 생성하고, 구성 정보를 참고해서 스프링 빈을 등록한 뒤, DI를 했다. 이제 스프링 컨테이너에서 데이터를 조회해보자.
'Spring > Spring core basic' 카테고리의 다른 글
[Spring core basic] 19 - 스프링 빈 조회 (0) | 2022.05.02 |
---|---|
[Spring core basic] 18 - 컨테이너에 등록된 모든 빈 조회 (0) | 2022.05.02 |
[Spring core basic] 16 - 스프링으로 전환하기 (0) | 2022.05.02 |
[Spring core basic] 15 - IOC, DI, 그리고 Container (0) | 2022.05.02 |
[Spring core basic] 14 - SOLID가 어떻게 적용되었는가? (0) | 2022.05.02 |
댓글