개발놀이터

스프링을 사용해서 DI 구현하기 본문

Spring/Spring

스프링을 사용해서 DI 구현하기

마늘냄새폴폴 2021. 12. 26. 16:20

이 포스팅은 인프런 김영한 님의 스프링 핵심 원리 기본 편을 보고 각색한 포스팅입니다. 자세한 내용은 강의를 확인해주세요

 

순수한 자바를 이용해서 DI를 구현해봤다. 

https://coding-review.tistory.com/82

 

순수한 자바로 DI 구현하기

이 포스팅은 인프런 김영한님의 스프링 핵심 원리 기본편을 보고 각색한 포스팅입니다. 자세한 내용은 강의를 확인해주세요 코드에 들어가기 전 이 코드의 배경이 되는 스토리가 있는데 사장님

coding-review.tistory.com

 

이번에는 스프링을 이용해서 DI를 구현해보자

 

이전의 AppConfig를 다음과 같이 변경하면 된다.

@Configuration
public class AppConfig {

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

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

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

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

AppConfig에 설정을 구성한다는 뜻의 @Configuration 을 붙여준다.


각 메서드에 @Bean 을 붙여준다. 이렇게 하면 스프링 컨테이너에 스프링 빈으로 등록한다.

 

스프링 컨테이너에는 빈이름과 빈객체가 key, value로 저장되고 스프링은 스프링 빈 저장소에 있는 빈객체를 사용자가 호출하면 언제든지 사용할 수 있게 준비해놓는다.

 

이제 이 빈들을 사용해보자

public class MemberApp {

    public static void main(String[] args) {
//        AppConfig appConfig = new AppConfig();
//        MemberService memberService = appConfig.memberService();
//        OrderService orderService = appConfig.orderService();
//        MemberService memberService = new MemberServiceImpl();
//        OrderService orderService = new OrderServiceImpl();

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

        Long memberId = 1L;
        Member member = new Member(memberId, "memberA", Grade.VIP);
        memberService.join(member);

        Order order = orderService.createOrder(memberId, "itemA", 10000);

        System.out.println("order = " + order);
    }
}

AnnotationConfigApplicationContext는 ApplicationContext인터페이스의 구현 체중 하나이고 말 그대로 어노테이션을 기반으로 Config 즉 설정 정보를 가져오겠다는 말이다. 파라미터로 class정보를 넘겨서 해당 클래스에 @Bean을 찾아 스프링 빈으로 등록하겠다는 의미이기도 하다.

 

이후 getBean메서드를 이용하여 첫번째 파라미터로 빈 이름 두 번째 파라미터로 클래스 정보를 넘겨서 빈을 꺼내서 사용하면 된다.

 

관례상 빈 이름은 AppConfig에서 메서드 이름을 따른다.

 

코드가 전보다 더 복잡해진것 같은데 ApplicationContext 즉 스프링 컨테이너에 스프링 빈을 등록했을 때 장점이 있을까?

 

애플리케이션을 개발할 때는 빈은 관리하고 조회하는 기능은 물론이고, 수 많은 부가기능이 필요하다.

 

부가기능으로는 메시지소스를 활용한 국제화 기능이 있다. 예를 들어서 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력해주는 기능이다. 

 

또 환경변수를 관리해주는 기능이 있는데 로컬환경, 개발환경, 운영환경을 구분해서 관리해주는 기능이다.

 

애플리케이션 이벤트를 발행하고 구독하는 모델을 편리하게 지원도 해준다.

 

편리한 리소스를 조회해 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회할 수도 있다.

 

이외에도 많은 기능이 있다.

 

 

 

포스팅 후기 : 이전시간 자바로 DI 구현하기 다음 스프링으로 DI 구현하기를 진행해보았다. 다음시간엔 싱글톤패턴과 @Configuration의 비밀에 대해 포스팅 할 예정이다. 

'Spring > Spring' 카테고리의 다른 글

컴포넌트 스캔과 자동 의존 관계 주입  (0) 2021.12.27
싱글톤과 @Configuration  (0) 2021.12.27
순수한 자바로 DI 구현하기  (0) 2021.12.21
객체지향 설계 5원칙 SOLID  (0) 2021.12.20
타임리프 classappend  (0) 2021.12.14