본문 바로가기
Spring/Spring core basic

[Spring core basic] 17 - 스프링 컨테이너 생성

by Kloong 2022. 5. 2.

참고

더보기

Spring core basic 시리즈는 김영한 님의 "스프링 핵심 원리 - 기본편" 강의를 정리한 글입니다. 글에 첨부된 사진은 해당 강의의 강의 자료에서 캡쳐한 것입니다. 제 Github에만 올려뒀다가, 정보 공유와 강의 홍보(?)를 위해 블로그에도 업로드합니다. 마크다운을 잘 쓰지 못해서 가독성이 조금 떨어지는 점 양해 바랍니다.

 

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

스프링 컨테이너 생성

스프링 컨테이너가 생성되는 과정을 알아보자.

ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);

ApplicationContext 를 스프링 컨테이너라고 한다.

ApplicationContext 는 인터페이스이다. 즉 다형성이 적용된다. 스프링 컨테이너는 XML을 기반으로 만들 수 있고, annotation 기반의 자바 설정 클래스로 만들 수 있다.

우리가 사용했던 AnnotationConfigApplicationContextApplicationContext 의 구현체 중 하나이다. 이 구현체는 이름처럼 annotation 기반이다.

엄밀히 이야기 하면 스프링 컨테이너를 부를 때 BeanFactoryApplicationContext 를 구분해서 이야기한다. 이 부분은 뒤에서 설명하겠다. 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를 했다. 이제 스프링 컨테이너에서 데이터를 조회해보자.

댓글