Home /Spring/ IoC, DI, DL
Post
Cancel

/Spring/ IoC, DI, DL



IoC


Inversion of Control(제어의 역전)

  • 어플리케이션 안에서 객체가 생성/해제 및 참조하는 작업을 전적으로 프레임워크가 관리하는 형태


스프링 애플리케이션에서는
오브젝트(빈)의 생성과 의존 관계 설정, 사용, 제거 등의 작업을
애플리케이션 코드 대신 스프링 컨테이너가 담당한다.
이를 스프링 컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖고 있다고 해서 IoC라고 부른다.
스프링 컨테이너를 IoC 컨테이너라고도 부른다.


IoC 의 개념은
꼭 스프링 프레임워크 뿐만 아니라 타 프레임워크 및 디자인 패턴과 같이 범용적인 곳에서 사용되는데,
어떤 객체의 사용 여부가 타 객체에의해 수동적으로 결정되어 사용되는 방식도
IoC 의 개념이 적용된 거라고 볼 수 있다.



  • 특징
    • 제어의 흐름을 바꿔줌
    • 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라,
      외부에서 결정되는 것
    • IoC를 사용하면 객체의 의존성을 역전시켜 객체 간의 결합도를 줄여줌
    • 유연한 코드를 작성 할 수 있게 하여
      가독성 및 코드 중복, 유지 보수를 편하게 할 수 있음



DI


Dependency Injection(의존성 주입)


  • 특징
    • 스프링이 다른 프레임워크와 차별화하여 제공하는 의존 관계 주입 기능
    • 객체를 직접 생성하는 게 아니라, 외부에서 생성한 후 주입 시켜주는 방식
    • Bean 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 방식 (DL의 컨테이너 의존성을 줄인 방식)
    • DI(의존성 주입)을 사용하면 모듈 간의 결합도가 낮아지고 유연성이 높아짐
    • DI 기반으로 개발을 하면 특정 인터페이스 규격만 맞추면 다양한 형태의 결과 생성 가능


  • 의존 관계

      • 의존 관계라는건
        A 가 B 타입 클래스 내에 메서드를 사용하는 경우 클래스 간의 의존관계가 있다 라고 표현한다.
        이는 결국 B 클래스 내부의 기능이 추가/수정되는 경우 A 타입 객체에게도 영향이 가는 것을 의미한다.
      • 이때 A 클래스와 B 클래스 간의 의존관계를 느슨하게 할 수 있는 방법이
        A 클래스가 B 클래스를 직접 참조하는 것이 아닌 C 인터페이스를 참조하도록 하고,
        B 클래스는 C 인터페이스를 구현하도록 하는 것이다.
      • 이렇게 인터페이스를 통해 구현 클래스간의 직접적인 의존 관계를 없애주게 되면
        B 클래스 내부 변경에 대한 영향을 덜 받게 된다.
      • 인터페이스를 통한 느슨한 의존 관계에서는
        클래스 다이어그램만으로는 실제 A 클래스가
        런타임 시점에 C 인터페이스를 구현한 어떤 구현 클래스를 사용할지 알 수 없다.
      • 사전에 설정을 통해 어떤 클래스의 객체를 쓸지 정해둘 수는 있으나
        그 내용이 설계나 코드 상에는 나타나지 않는다.
      • 결국 컨테이너 설정에 따라 구체적인 사용 클래스를 지정해주고,
        런타임 시점에 객체간의 의존 관계를 연결해주는 작업이 바로 의존관계주입이다.


설계 시점에서 알 수 없는 런타임 시점에 객체간의 의존관계를 제3자(스프링 컨테이너)가 결정하고,
컨테이너가 객체 레퍼런스를 제공해주는 것! 그것이 의존관계 주입의 핵심!



DL


Dependency Lookup, 의존성 검색

  • 의존관계가 있는 객체를 외부에서 주입 받는 것이 아닌,
    의존관계가 필요한 객체에서 직접 검색하는 방식
  • 저장소에 저장되어 있는 Bean에 접근하기 위해
    개발자들이 컨테이너에서 제공하는 API를 이용해서 Bean을 검색하는 방식
  • 클라이언트 객체(의존관계가 필요한 객체)에서는 의존하고자 하는 인터페이스 타입만 지정해서 검색할 뿐
    해당 인터페이스를 구현한 구체적인 클래스 객체에 대한 결정과 해당 객체에 대한 생명 주기는
    IoC 컨테이너에서 책임진다.



IoC 컨테이너????????


  • 스프링에서는 IoC를 담당하는 컨테이너를
    빈 팩토리, DI 컨테이너, 애플리케이션 컨텍스트라고 부른다.

  • 오브젝트의 생성과 오브젝트 사이의 런타임 관계를 설정하는 DI 관점으로 보면,
    컨테이너를 빈 팩토리 또는 DI 컨테이너라고 부른다.



+ 애플리케이션 컨텍스트


application context


  • 스프링 컨테이너는 단순한 DI 작업보다 더 많은 일을 하는데,
    DI를 위한 빈 팩토리에 여러 가지 기능을 추가한 것

  • 애플리케이션 컨텍스트는 그 자체로 IoC와 DI 그 이상의 기능을 가진것과 마찬가지




(참고)



공부한 내용을 여러글과 책 읽은 내용을 바탕으로 정리하고 있습니다.
좋은 글로 저의 공부에 도움을 주시는 분들께 감사드립니다.

This post is licensed under CC BY 4.0 by the author.