들어가며

  • 해당 포스트는 DI의 개념 에 대해서 먼저 읽고 와야 이해가 되는 부분들이 있을 수 있습니다.
 

DI의 개념 - 2. 다형성의 한계

돌아보기 1에서는 SOLID 원칙과 다형성에 대해서 잠시 언급했었다. 문제는 다형성을 사용하는것 만으로는 SOLID를 모두 지키면서 구현이 매우 힘들다는 점이다. 이번 포스트에서는 다형성의 한계

sehun5515.tistory.com

  • 이전까지 DI에 대한 개념을 익혔다. 클라이언트 클래스에서 의존하는 인터페이스의 구현체를 직접 지정하지 않고, 외부에서 지정하고, 인스턴스화 하여 그 인스턴스를 주입한다는 개념이 DI였다.
  • 이번에는 스프링 프레임워크에서 지원하는 핵심적인 개념인 IoC에 대해 알아보고, 스프링에서 어떻게 해당 개념을 지원하는지에 대해 서술한다.

 

 

IoC(Inversion of Controll)

  • DI를 생각하지 않고 어떠한 클래스에서 다른 인터페이스 구현체를 가져와야 할 때 일반적으로는 이렇게 구현할 것이다.
public class Test1 implements TestInterface1{
    private final TestInterface2 module = new TestInterface2Impl();
    private final TestInterface2 module2 = new TestInterface2Impl2();
    ...
}
  • 변경의 가능성을 뒤로 해두어도, 우리가 원하는 시점에 이러한 객체를 불러오도록 클라이언트 클래스 객체들이 컨트롤하였다.
    • 다시말해서, 객체를 생성하는 시점이나, 프로그램에서 어떠한 객체를 가져오거나 하는 일련의 제어가 클라이언트 클래스 객체에게 넘어가 있었다.
  • 하지만 우리가 DI를 사용하면서, 클라이언트 클래스는 그저 생성자에서 사용할 구현체들을 매개변수로 하여 주입받고 실행만 하도록 변경되었다. 즉 어떤 구현체들이 자신에게 넘어올지 클라이언트 클래스는 알지 못한다.
  • 이 객체들이 생성되고, 주입되는 일련의 제어권은 이제 관리자 클래스에서 수행하게 된다. 이전 포스트의 AppConfig 클래스를 가져왔다.
public class AppConfig{
    public MemberService memberService(){
        return new MemberServiceImpl(new MemoryMemberService);
    }

    public OrderService orderService(){
        return new OrderServiceImpl(
            new MemeoryMemberRepository(),
            //new FixDiscountPolicy()
            new RateDiscountPolicy()
        );
    }
}
  • 보면 객체의 생성과 관련된 모든 행동들이 AppConfig에서 수행되고 있다. 즉 객체를 생성하거나 주입할 때는 반드시 AppConfig을 거쳐서 수행되게 된다.
  • 이렇게 프로그램의 제어 흐름을 클라이언트 객체 자신이 직접 제어하는 것이 아닌 AppConfig와 같이 외부에서 제어하도록 관리하는 것을 제어의 역전 (Inversion of Controll)이라고 한다.

 

 

 

IoC Container와 Spring

  • IoC Container라고 하는 것은 위의 AppConfig 클래스처럼 객체를 생성하고 관리하면서 의존관계를 주입해주는 클래스를 말한다.
  • 최근에는 의존관계 주입에 초점을 맞추어 DI 컨테이너라고 하며, Spring에서는 스프링 빈(Bean) 컨테이너라고도 한다.
  • Spring에서는 기존에 개발자가 AppConfig 클래스를 사용하여 직접 제어하도록 하는게 아닌 스프링 프레임워크 자체에서 생성한 스프링 컨테이너에서 모든 객체를 관리하고, 의존관계 주입을 수행하게 된다.
  • 스프링 컨테이너는 @Configurtaion이라고 붙은 설정 정보를 기반으로 이 어노테이션이 붙은 클래스 내부에 적힌 @Bean 어노테이션이 붙은 모든 메서드들을 실행하여 반환된 객체를 컨테이너에 등록한다.
  • 이때 이 컨테이너에 등록된 객체들을 스프링 빈(Bean)이라고 한다.
  • 이떄 스프링 빈의 이름은 @Bean이 붙은 메서드의 이름으로 정한다.
  • Spring을 통해서 개발자는 직접 AppConfig등의 관리자 클래스를 이용하여 객체를 모두 등록하고, 주입할 필요가 사라졌다. 대부분의 등록과 주입은 Spring 프레임워크를 통해 수행되며 개발자가 직접 관리하던 시점에서는 얻기가 힘들었던 여러 장점들 역시 누릴 수 있게 되었다.
  • 이러한 장점들은 또 다음 시간에 다루어 보도록 하겠다.
복사했습니다!