AppConfig 클래스에 어노테이션을 추가해보자.

@Configuration, @Bean
  • @Configuration : 스프링 컨테이너의 구성요소로 하겠다는 의미    (스프링 컨테이너는 요런것들로 구성할거야) 
  • @Bean : 스프링 컨테이너에 빈(객체)로 등록시키겠다 라는 의미

 

 

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService(){

        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public static MemoryMemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
    @Bean
    public OrderService orderService(){
      return new OrderServiceImpl(memberRepository(),discountPolicy());
    }
    @Bean
    public DiscountPolicy discountPolicy(){
       // return new FixDiscountPolicy();
        return  new RateDiscountPolicy();
    }
}

 

이렇게 코드를 수정하면 각각의 메서드들이 스프링 컨테이너에 등록이 된다.

 

 

MemberApp 에 스프링 적용해보기

AppConfig appConfig= new AppConfig();
MemberService memberService = appConfig.memberService();

 

그럼 위의 코드 처럼 appConfig.memberService로 memberService 객체를 직접 호출해서 사용하는 것이 아닌 스프링 컨테이너에 빈들을 등록시키고 꺼내쓰는 방식으로 코드를 작성해보자

 

ApplicationContext applicationContext=new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
applicationContext.getBean("호출할 메서드 이름",반환 타입);
  •  ApplicationContext ( = 스프링 컨테이너 ) 
  • AppConfig 클래스에서  @Bean이 있는 메서드들을 호출하여 객체를 생성해서 스프링 컨테이너에 등록시켜둔다.

빈으로 등록시켰다는 로그

OrderApp에 스프링 적용해보기

 ApplicationContext applicationContext= new AnnotationConfigApplicationContext(AppConfig.class);
 MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
 OrderService orderService = applicationContext.getBean("orderService", OrderService.class);

 

빈으로 등록시켰다는 로그

 

AppConfig와  스프링의 차이점

 

AppConfig 클래스를 직접 이용할 때에는 객체를 우리가 메서드를 호출해서 직접 생성해줬다.

하지만 스프링 방식을 이용하면 @Bean으로 등록된 메서드들을 호출하여 생성된 객체들을 스프링 컨테이너에 담아 놓고 있다가,  우리가 해당 메서드를 getBean으로 호출하면 컨테이너에 담겨져 있던 객체를 반환해준다.

 

간단히 말해, 이전 방법은 우리가 객체를 직접 생성하는 것이고 스프링을 적용한 방법은 스프링이 미리 객체를 생성해뒀다가 필요한 객체를 우리에게 넘겨주는 것이다.

 

 

 

 

궁금한점

  그런데 왜 굳이 스프링을 사용할까? 객체를 미리 만들어서 컨테이너에 담아두면 뭐가 좋은걸까? 
 오히려 직접 호출해서 사용하는 코드가 더 간결하고 직관적이게 보이는데 ....

 

                                                     ▶      [섹션5-1] 웹 어플리케이션과 싱글톤 ( 순수 DI컨테이너의 문제점 )  글을 읽어보자!! 

 

 

+ Recent posts