본문 바로가기
Back/Java

[Java] IoC(제어의 역전), DI(의존성 주입)의 친절한 설명

by Inventer 2022. 1. 11.

1. Intro

IoC(Inversion of Control)의 개념을 설명한다.

직역하면 IoC는 제어의 역전으로 불리우는데, 글자만 봐서는 도통 감이 오지 않는다.

따라서 이를 예제코드와, 그림과 함께 설명하도록 하겠다.

 

IoC를 설명하기 전에 알아야 할 것이 있다.

바로 이 것을 왜 사용하는데? 부터 출발을 해야할 것이다.

이유는 간단하다 OOP 원칙 중, Loosely coupled 원칙을 지키기 위해서!

 

Loosely coupled는 "느슨한 결합"이다. 객체 지향 프로그래밍의 중요한 원칙 중 하나이다.

나사를 덜 조이는 느슨한이 아닌, 상호 연관성이 있는 객체끼리 최대한 분리하겠다. 이 의미이다.

자동차를 생각해보라. 예를 들어 타이어와 휠을 분리해놓지 않았다면, 비교적 자주 갈아주는 타이어를 갈 때마다 휠을 같이 교체해야 했을 것이다.

이러한 참사를 막기위해 Loosely Coupled 원칙을 OOP에서는 고수하고 있다.

 

2. IoC Example

먼저 Strongly coupled의 예제를 보겠다.

package org.example.ioc;

public class Wheel {
    private Tire myTire;

    public Wheel()
    {
        this.myTire = new Tire();
    }
}

<Code 1> Strongly coupled

<Fig 1> Strongly coupled

위 <Code 1> 처럼 구성을 한다면 <Fig 1> 처럼 Whell Class가 Tire Field를 가지고 형태로 강하게 결합된 형태를 볼 수 있다. Wheel 클래스가 Tire클래스에 직접적으로 의존한다는 것을 알 수 있고, 현재로선 Tire의 제어권을 Wheel이 갖고 있는 것을 확인할 수 있다. (Tire클래스가 생성되는 시점은, Wheel의 생성자)

 

이를 Loosely Coupled로 변경해본다. (= IoC 한다)

package org.example.ioc;

public class IocWheel {
    private Tire myTire;

    public IocWheel(Tire tire)
    {
        this.myTire = tire;
    }
}

<Code 2> Loosely coupled

<Fig 2> Loosely Copuled

당연하게도 위 <code 1>의 상황보다는 결합도가 약해진 것을 확인할 수 있고 또한 이는 제어가 역전된 것을 의미한다.

만약 테스트 코드에서는, 아래와 같이 사용할 수 있다.

Tier myTier = new Tier(); // dependency
Wheel myWheel = new Wheel(myTier);

코드를 보면,

myTier라는 dependency를 만들고, myWheel에 주입하지 않았는가?

이게 의존성 주입이라 불리는 Dependency injection이다.

 

3. IoC의 종류

<Fig 3> IoC

<Fig 3>은 IoC의 종류를 의미한다.

 

 

 


Ref.

https://redcoder.tistory.com/198

 

[Spring Framework] 스프링 IOC란?

    로재의 개발 일기 Spring IOC IOC란 제어권의 역전이라는 뜻으로, 객체의 생성 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 말합니다. 일반적으로 객체를 생성 및 제거를

redcoder.tistory.com

 

https://bestowing.github.io/spring/Spring1/

 

[Spring] IOC란?

목표: 스프링을 공부하며 필요한 개념을 정리한다.

bestowing.github.io

 

https://stackoverflow.com/questions/3058/what-is-inversion-of-control

 

What is Inversion of Control?

Inversion of Control (IoC) can be quite confusing when it is first encountered. What is it? Which problem does it solve? When is it appropriate to use and when not?

stackoverflow.com

 

댓글