Spring - IoC 컨테이너, DI

Spring

Posted by kwon on 2020-05-13

Spring - IoC 컨테이너, DI

IoC(Inversion of Control - 제어의 역전)

  • Inversion of Control : 의존 관계 주입(Dependency Injection)이라고도 하며, 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는게 아니라, 주입 받아 사용하는 방법을 말함.

    • 작업을 수행하는 쪽에서 Object를 생성하는 제어 흐름의 개념을 거꾸로 뒤집는다.
    • IoC 에서는 Object가 자신이 사용할 Object를 생성하거나 선택하지 않는다.
    • 또한 Object는 자신이 어떻게 생성되고 어떻게 사용되는지 알 수 없다.
    • 모든 Object는 제어 권한을 위임받는 특별한 Object에 의해서 만들어지고 사용된다.
  • 제어의 역전이란 객체의 생성에서부터 생명주기의 관리까지 모든 객체애 대한 제어권이 바뀌었다는 것을 의미한다.

  • 스프링이 모든 의존성 객체를 스프링이 실행될 때 다 만들어 주고 필요한 곳에 주입시켜줌으로써 Bean들은 싱글톤 패턴의 틀징을 가지며, 제어의 흐름을 사용자가 컨트롤하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.

  • 목적

    • 객체 의존관계의 결합도를 낮추고 유지보수성을 향상시키기 위해

IoC 구현 방법

DL(Dependency Lookup) - 의존성 검색

  • 저장소에 저장되어 있는 빈(Bean)에 접근하기 위해 개발자들이 컨테이너에서 제공하는 API를 이용하여 사용하고자 하는 빈을 Lookup하는 것

DI(Dependency Injection) - 의존성 주입

  • 각 계층 사이, 각 클래스 사이에 필요로 하는 의존 관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것
  • DL을 사용하면 컨테이너의 종속성이 생기게 되는데 이를 줄이기 위해 DI를 사용한다.
    • Setter Injection : setter를 이용하여 클래스 사이의 의존 관계를 연결
      • 객체를 생성 후 의존성을 삽입하는 방식이기 때문에 구현 시 좀 더 유연하게 사용 가능
      • setter를 통하여 필요한 값이 할당되기 전까지는 객체를 사용할 수 없다.
    • Constructor Injection : 생성자를 이용하여 클래스 사이의 의존 관계를 연결
      • 생성자에 파라미터를 지정함으로써 생성하고자 하는 객체가 필요로 하는 것을 명확하게 알 수 있다.
      • setter메서드를 사용하지 않으므로 간단하게 필드를 불변 값으로 지정이 가능하다.
      • 생성자의 파라미터가 많을 경우 코드가 복잡해 보일 수 있다.

컨테이너란?

  • 컨테이너는 보통 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하는 것이다.
  • 컨테이너는 적절한 설정만 되어있다면 작성된 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤해준다.

BeanFactory (빈팩토리)

  • 애플리케이션 컴포넌트의 중앙 저장소, 스프링의 IoC를 담당하는 핵심 컨테이너.
  • 빈 설정 소스로부터 빈 정의를 읽어들이고, 빈을 구성하고 제공한다.

ApplicationContext (애플리케이션 컨텍스트)

  • BeanFactory기능에 다양한 추가기능을 제공한다. (BeanFactory를 상속)
    • 국제화가 지원되는 텍스트 메시지 관리 기능
    • 이벤트 발행 기능
    • 리소스 로딩 기능
  • 대부분의 경우 BeanFactory보다는 ApplicationContext을 주로 사용한다.

빈(Bean) - 스프링 빈

  • 스프링 IoC 컨테이너가 관리하는 객체
  • 스프링에서 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트
  • 여러 annotation을 사용하여 일반적인 객체를 Bean으로 등록할 수 있고, Bean에 등록된 객체들을 쉽게 주입받아 사용 가능하다.
  • 의존성 주입을 하기 위해서는 Bean으로 등록되어야 한다. (의존성 주입은 Bean끼리만 가능하다.)
  • 라이프사이클 인터페이스를 이용 가능하다.

참조
https://www.inflearn.com/course/spring-framework_core/dashboard > https://limmmee.tistory.com/13 > https://isstory83.tistory.com/91