문홍의 공부장

[Spring] 스프링 핵심 개념: Ioc(제어의 역전)과 DI(의존성 주입) 본문

개발/Spring

[Spring] 스프링 핵심 개념: Ioc(제어의 역전)과 DI(의존성 주입)

moonong 2020. 2. 7. 15:39
반응형

1. IoC(Inversion of Control)

제어의 역전(IoC)이란 한마디로 말하면 프로그램의 제어 흐름 구조가 바뀌는 것이다. (기존 개발자(사용자) 주도 => Spring 주도)

일반적으로, main() 같은 프로그램이 시작되는 지점에서 다음에 사용할 오브젝트를 결정, 생성하고, 만들어진 오브젝트 내의 메소드를 호출하는 작업을 반복한다. 이런 구조에서 각 오브젝트는 프로그램 흐름을 결정하거나 사용할 오브젝트를 구성하는 작업에 능동적으로 참여한다. 즉, 모든 종류의 작업을 사용하는 쪽에서 제어하는 구조이다.

이에 반하여 IoC는 제어 흐름의 개념을 거꾸로 뒤집는다. 오브젝트는 자신이 사용할 오브젝트를 스스로 생성하거나 선택하지 않는다. 그리고 자신이 어떻게 만들어지고 어디서 사용되는지 알 수 없다. 모든 제어 권한은 자신이 아닌 다른 대상(Spring)에게 위임하는 것이다. 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어, 필요에 따라 스프링에서 사용자의 코드를 호출한다.

객체의 생명주기를 스프링 컨테이너가 관리하는 IoC 개념이 있기 때문에, DL(Dependency Lookup) 과 DI(Dependency Injection)이 가능해진다.

2. DI (Dependency Injection)

스프링의 핵심 개념. 객체 사이의 의존관계를 자기 자신이 아닌 외부에 의해 설정된다는 개념이다. 스프링에서는 외부 환경설정 파일(xml 등)을 사용하여 손쉽게 객체 간의 의존관계를 설정하기에, 스프링을 DI 컨테이너라고 부르기도 한다.

DI 컨테이너는 어떤 클래스가 필요로 하는 인스턴스를 자동으로 생성, 취득하여 연결시켜주는 역할을 한다. DI 컨테이너가 인스턴스를 생성하도록 하려면, 프로그램 소스 내부에서 new 로 직접 생성하지 않고 설정파일에서 필요로 하는 클래스의 정보를 설정해 주어야 한다.

만일 스프링을 사용하지 않고 직접 데이터를 입력(주입)한다면, 데이터가 바뀔 때마다 소스코드가 변경되어야 한다. 하지만, 스프링을 이용하여 자바 빈 객체간 의존성을 주입한다면, 소스코드의 수정 없이 환경설정 파일만 바꿈으로써 프로그램을 제어할 수 있다. 즉, 모듈 간의 결합도를 낮추어 애플리케이션의 유연한 변경을 가능하도록 하기 위해 DI의 개념을 사용하는 것이라 볼 수 있다.

의존성 주입의 방법에는 1) 생성자를 통한 주입 2) Setter 메소드를 통한 주입이 있다.

1) 생성자 주입(Constructor Injection)

  • 생성자를 통해서 의존 관계를 연결시키는 것을 말한다.
  • XML 설정 파일에서 <bean>요소의 하위요소로 <constructor-arg>를 인자의 개수만큼 추가해야 한다.
  • 객체를 전달할 경우에는 ref요소를 사용: 두 개의 클래스가 모두 생성되어야 함. 인자에 클래스의 참조 (ref) 로 설정
  • 전달인자가 2개 이상인 경우: 기본데이터 타입일 경우에는 <value>요소를 사용하여 의존관계를 연결시키기 위한 값을 지정한다
<bean id="add" class="sample02.CalcAdd">
    <constructor-arg index="0" value="25"/>
    <constructor-arg index="1" value="36"/>
</bean>

2) Setter 메소드 주입(Setter Injection)

  • setter메소드를 이용하여 의존 관계를 연결시키는 것을 말한다.
  • <property>요소의 name 속성을 이용하여 값의 의존 관계를 연결시킬 대상이 되는 필드값을 지정한다
<bean id="mul" class="sample02.CalcMul">
    <property name="x" value="25"/>
    <property name="y" value="36"/>
</bean>

References:

https://jhleed.tistory.com/61
https://isstory83.tistory.com/91

반응형