지금까지 순수한 자바코드로만 DI를 적용하였는데

스프링을 사용하여 바꿔보는 작업을 공부하였다.

 

 

package hello.core;

import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.order.Order;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

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

        /*AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService();
        OrderService orderService = appConfig.orderService();*/

        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",20000);

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

OrderApp클래스의 주석부분과  밑에 3줄이 같은 역할을 한다!

 

하는 기능은 같지만 콘솔에 찍히는 것들이  ConfigApp에 메서드들을 Bean으로 등록한 것들이 뜨는 것을 볼 수 있다.

 


 

스프링 컨테이너

 

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

 

기존에는 개발자가 AppConfig를 사용해서 직접 객체를 생성하고 DI를 했지만, 이제부터는

스프링 컨테이너를 통해서 사용한다.

 

스프링 컨테이너는 @Configuration이 붙은 AppConfig를 구성정보로 사용한다. 여기서 @Bean이라 적힌 

메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링

빈이라 한다.

 

스프링 빈은 @Bean이 붙은 메서드 명을 스프링 빈의 이름으로 사용한다.

 

이전에는 개발자가 필요한 객체를 AppConfig를 사용해서 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서

필요한 스프링 빈(객체)를 찾아야 한다. 스프링 빈은 applicationContext.getBean() 메서드를 사용해서 찾을 수 있다.

 

기존에는 개발자가 직접 자바코드로 모든 것을 했다면 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고,

스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경하였다.

 

그런데??? 코드가 복잡해진 것처럼 느껴질 수도 있는데 굳이 이렇게해서 얻는 장점이 무엇일까?

지금부터 차차 알아가보자

지금까지는 객체지향 원리와 다형성을 가지고 진행하다가 다형성만으로는 한계를 느껴 DIP OCP를 지키며

설계하는 DI를 알아보았다. 

+ Recent posts