오봉이와 함께하는 개발 블로그

Spring - 스프링 핵심 원리 이해2 - 5(객체 지향 원리 적용) 본문

BE/Spring

Spring - 스프링 핵심 원리 이해2 - 5(객체 지향 원리 적용)

오봉봉이 2022. 6. 4. 23:21
728x90

스프링으로 전환

  • 순수한 자바 코드만으로 DI를 적용했지만, 스프링으로 전환하자.

AppConfig 스프링으로 변경

@Configuration
public class AppConfig {
    @Bean
    public MemberSerivce memberSerivce() {
        return new MemberServiceImpl(memberRepository());
    }

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

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

    @Bean
    public DiscountPolicy discountPolicy() {
        // return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }
}
  • @Configuration
    • 설정을 구성한다는 뜻의 어노테이션
  • @Bean
    • 스프링 컨테이너에 스프링 빈으로 등록

MemberApp 스프링 컨테이너

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

        // 스프링 사용
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);

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

        Member findMember = memberService.findMember(1L);
        System.out.println("new member = " + member.getName());
        System.out.println("find member = " + findMember.getName());
    }
}

OrderApp 스프링 컨테이너

public class OrderApp {
    public static void main(String[] args) {
//        AppConfig appConfig = new AppConfig();
//        MemberService memberService = appConfig.memberService();
//        OrderService orderService = appConfig.orderService();
////        MemberSerivce memberSerivce = 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);
        System.out.println("order.calculatePrice = " + order.calculatePrice());
    }
}

스프링 컨테이너

  • ApplicationContext를 스프링 컨테이너라 함.
  • 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정 정보로 사용
    • @Bean이라 적힌 메소드를 모두 호출해서 반환된 객체를 컨테이너에 등록
      • 스프링 컨테이너에 등록된 객체를 스프링 빈이라 함.
      • 스프링 빈은 @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다.(memberService, orderService)
      • 이전에는 AppConfig를 통해 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해 스프링 빈(객체)를 찾아야 함
        • 스프링 빈은 applicationContext.getBean()을 통해 찾을 수 있음
  • 개발자가 직접 자바코드로 모든 것을 했다면 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고 스프링 컨테이너에서 스프링 빈을 찾아 사용할 수 있도록 변경됨

코드가 복잡해진 느낌인데 스프링 컨테이너를 사용하면 어떤 장점이...?

출처 : 인프런 김영한 지식공유자님의 스프링 완전 정복 로드맵 강의
728x90
Comments