Spring/Spring Study

[Inflearn] 스프링 컨테이너와 빈

모모토 2021. 7. 1. 11:17
반응형

※ 본 포스팅은 Inflearn - 김영한 강사님의 '스프링 핵심 원리 - 기본편' 을 참고,공부하여 만들었습니다.

 

 

스프링 컨테이너란?

 

스프링 컨테이너를 설명하기 이전에 우리는 여태까지 순수 자바코드로 DI(Dependency Injection)를 주입하였다.

 

스프링을 이용하는 많은 이유중 제일 핵심은 간편하게 DI를 주입하여주는 이유가 아닐까 생각한다.

 

그렇다면 우선 우리가 여태 사용한 자바코드에 스프링을 적용하여보자

 

@Configuration //AppConfig에 하나 이상의 Bean 이 등록되어 있음을 의미
public class AppConfig {//나의 애플리케이션의 전반적인 구성과 설정을 책임!

    @Bean // @Bean으로 인하여 스프링 컨테이너에 소속됨
    public MemberService memberService(){ // memberService = Key
        return new MemberServiceImpl(memberRepository()); // 객체 = Value
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public OrderService orderService(){ // 오더서비스에 저장소와 할인정책을 주입시켜준다.
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    @Bean
    public DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }

}

 

@Configuration 은 AppConfig 클래스가 설정을 구성한다는걸 의미한다. 

 

각 메서드에 @Bean을 붙여줌으로써 각 메서드는 스프링 컨테이너에 스프링 빈으로써 등록이 된다.

 

엄밀하게는 스프링 컨테이너를 선언,생성을 하진 않은 상태이지만, 생성한것으로 간주해도 무방하다.

 

스프링으로 전환하는건 또 어떤 차이점이 있을까?

 

우린 이전에 스프링에 등록하지않고 AppConfig 클래스를 사용할땐 직접 객체를 생성하여 DI를 하였었다.

(전에 어떻게 사용하였는지 생각이 안 난다면 참고 ,  AppConfig 포스팅 )

 

AppConfig를 스프링으로 전환하고 나서 스프링 컨테이너를 사용하는 코드를 확인해보자

 

public class MemberApp {
    public static void main(String[] args) {

        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        //스프링 컨테이너 생성
       
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
        Member member = new Member(1L, "memberA", Grade.VIP);

// ... 생략 ...

    }
}

 

위의 코드에서 ApplicationContext를 스프링 컨테이너라고 부르며 인터페이스이다.

 

이 인터페이스는 BeanFactory라는 스프링컨테이너의 최상위 인터페이스를 상속받는다. 

 

실제로는 BeanFactory는 쓸일이 없기에 ApplicationContext를 스프링 컨테이너라고 부른다.

 

이러한 스프링 컨테이너의 생성과 빈의 등록을 다음 사진으로 이해해보자 백문불여일견

 

01

 

스프링 컨테이너를 생성하고 난 후(첫번째 사진) , 생성할때 넘겨준 AppConfig.class (구성정보)를 토대로 Bean을 등록한다.(두번째 사진)

 

스프링 컨테이너는 AppConfig.class 를 참고하여 의존관계도 주입하여 준다.

 


강의 도중에 이런말씀을 하셨다.

 

자바코드로 AppConfig 객체를 생성해서 DI를 하는게 더 코드가 편해보이지만 왜 스프링을 쓰는걸까?

 

그 이유에 대해서 고민하고 공부하는게 여러모로 좋은 개발자가 되는데 도움이 될것이라는 말씀을 하셨으니

 

본인도 앞으로는 그 이유에 대해서 포스팅을 해볼 예정이다.