[Spring] Spring 기본 개념 (IoC, DI)

1. IoC (Inversion of Control)

개발 초기 자바 객체를 생성하고 객체간 의존관계를 연결하는 등의 제어권을 개발자가 직접 가지고 있었으나 서블릿, EJB(Enterprise Java Bean)이 등장하면서 제어권이 서블릿, EJB를 관리하는 외부 컨테이너로 넘어가면서 객체의 생성부터 생명주기의 관리까지 모든 객체에 대한 제어권이 사용하는 쪽(IoC Container)로 바뀐 것을 IoC, 제어의 역전이라 한다. 

  • 제어의 역전 = 메소드나 객체의 호출작업을 외부에서 결정되는 것을 의미
  • 스프링 컨테이너가 필요에 따라 개발자 대신 Bean들을 관리(제어)해주는 행위
  • 의존성을 역전시켜 객체 간 결합도 줄이고 유연한 코드 작성 가능 (가독성 및 , 코드 중복, 유지 보수 편안)
  • 제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리
  • 제어의 역전은 의존성 주입의 상위 개념이다.
  • IoC Container는 객체를 생성하고 객체간의 의존성을 이어주는 역할
    • BeanFactory - BeanFactory인터페이스는 IoC컨테이너의 기능을 정의하고 있는 인터페이스이며, Bean의 생성 및 의존성 주입, 생명주기 관리 등의 기능을 제공, 여기서 Bean이란 IoC컨테이너에 의해 생성되고 관리되는 객체를 의미
    • ApplicationContext - BeanFactory 인터페이스를 상속받는 ApplicationContext는 BeanFactory가 제공하는 기능 외에 AOP, 메세지처리, 이벤트처리 등의 기능을 제공
    • 모든 ApplicationContext  구현체는 BeanFactiory의 기능을 모두 제공하므로, 특별한 경우를 제외하고는 ApplicationContext를 사용하는 것이 바람

 

2. DI (Dependency Injection)

DI란 IoC를 구현하는 방법으로 IoC와 DI의 관계에 대해 알아보자

위의 그림처럼 IoC를 구현하는 방법으로 DL, DI2가지 방법이 있다.

 

1) DL(Dependency Lookup) : 의존성 검색

컨테이너에서 제공하는 API를 이용해 사용하고자 하는 빈(Bean)을 저장소에서 Lookup하는 것을 말한다.

 

2) DI(Dependency Injection) : 의존성 주입

각 객체간의 의존성을 컨테이너가 자동으로 연결해주는 것으로 개발자가 빈(Bean) 설정파일에 의존관계가 필요한 정보를 추가해주면 컨테이너가 자동적으로 연결해준다.

 

Spring 프레임워크에서는 setter 메소드로 의존성을 주입하는 Setter Injection, 인자(argument)를 갖는 생성자를 사용하여 의존성을 주입하는 Constructor Injection의 2가지 방식이 있다.

  • 스프링이 다른 프레임워크와 차별화되어 제공하는 의존관계 주입기능, 객체를 직접 생성하는게 아니라 외부에서 생성한 후 주입시켜주는 방식
  • 의존성 주입을 통해 모듈 간 결합도가 낮아지고 유연성이 높아짐
  • 객체안에 외부의 객체를 New 생성자로 직접 생성하는 방법(Constructor Injection)이 있고, 외부에서 생성된 객체를 setter()를 통해 사용하는 방법(Setter Injection)이 있다.
  • 스프링에서 객체를 Bean이라고 부름, 객체들의 생성과 소멸에 관리를 사동 수행함, 그리고 객체가 생성되는 곳을 Bean컨테이너 라고 부름

 

[참고]

https://gangnam-americano.tistory.com/60