개발

[개발지식] 제어의 역전 (Inversion of Control, IoC)

김나나_ 2024. 7. 19. 13:21

📌 제어의 역전이란?

프레임워크 없이 개발할 때에는 객체의 생성, 설정, 초기화, 메소드 호출, 소멸 (이하 객체의 생명주기)을 프로그래머가 직접 관리한다. 또한 전통적인 프로그래밍에서는 외부 라이브러리를 사용할 때, 개발자가 직접 외부 라이브러리를 호출하는 형태로 이용한다.

프레임워크를 사용하면 객체의 생명주기를 모두 프레임워크에 위임할 수 있다. 즉, 외부 라이브러리가 프로그래머가 작성한 코드를 호출하고, 흐름을 제어한다.

 

  • 제어의 역전은 기존의 개발 방식에서 개발자가 직접 흐름을 제어하는 것이 아니라, 외부의 프레임워크나 라이브러리가 제어 흐름을 대신하게 되는 것을 말한다.
  • 개발자가 작성한 객체나 메서드의 제어를 개발자가 아니라 외부에 위임하는 설계 원칙을 제어의 역전이라고 한다. 
    즉, 프레임워크는 제어의 역전의 개념이 적용된 대표적인 기술이다.
  • 원칙의 이름 그대로 제어에 대한 권한이 개불자에서 외부 환경으로 역전되는 것이다.
  • IoC는 우리의 코드가 프레임워크의 일부분이 되어 프레임워크에 의해 제어되는 것 이라고 생각하면 된다.
  • 어플리케이션의 제어 책임이 프로그래머에서 프레임워크로 위임되므로, 개발자는 핵심 비즈니스 로직에 더 집중할 수 있다는 장점이 있다.

 

📌 IoC와  DI

IoC는 DI(Dependency Injection)와 밀접한 관련이 있다.

DI는 IoC 원칙을 실현하기 위한 여러가지 디자인패턴 중 하나이다. IoC와 DI 모두 객체간의 결합을 느슨하게 만들어 유연하고 확장성이 뛰어난 코드를 작성하기 위한 패턴이다.

 

 

📌 IoC의 구현 방법

주로 아래와 같은 방법들을 사용한다.

  • Factory Patern
    객체 생성을 전담하는 팩토리 클래스를 두어 객체를 생성하는 방식
    팩토리 클래스를 사용하여 객체를 생성하면, 객체 생성에 대한 책임이 팩토리 클래스로 이전되므로 IoC 가 구현된다.

  • Template Method Pattern
    객체 생성을 추상화하여, 하위 클래스에서 구체적인 구현을 담당하는 방식
    하위 클래스에서 구현하는 부분에 대한 제어의 역전이 이루어지므로 IoC가 구현된다

  • Service Locator Pattern
    객체 생성 및 관리를 위한 서비스 위치자 패턴
    서비스 로케이터 클래스는 객체 생성 및 관리에 대한 책임을 가지며, 클라이언트는 서비스로케이터를 통해 필요한 객체를 가져오게 된다. 따라서 서비스 로케이터 클래스가 객체의 생성과 관리를 담당하므로, 제어의 역전이 이루어져 IoC가 구현된다

  • Dependency Injection (DI)
    객체 생성 및 관리에 대한 책임을 IoC 컨테이너가 가지며, 필요한 객체를 직접 생성하거나 외부에서 주입받는 방식
    DI 는 생성자 주입, 속성 주입, 메소드 주입등 다양한 방식으로 이루어 질 수 있다.



📌 IoC의 장단점

장점

  • 코드의 유연성재사용성이 증가한다.
    IoC 컨테이너를 사용하면 의존성을 관리하기 쉬워져 코드 변경이 쉬워진다.
  • 테스트의 용이성이 증가한다.
    의존성 주입을 통해 테스트용 객체를 쉽게 만들 수 있으므로 테스트 코드를 작성하는 데 있어서도 도움이 된다.
  • 결합도가 낮아져 유지보수가 용이해진다
    의존성을 관리하는 작업이 자동화되어 객체 간의 결합도가 낮아져 유지보수가 용이해진다.
  • 객체간의 의존성 관리를 통해 개발 시간을 단축 시킨다.

 

단점

  • 의존성 주입이 많아질수록 코드의 가독성이 떨어진다. 코드의 복잡성이 증가한다.
  • IoC 컨테이너가 복잡해질수록 초기 설정과 성능 이슈가 발생할 수 있다.
  • IoC 컨테이너를 사용하면 일부 개발자는 어떤 객체가 어떻게 생성되는 지에 대한 이해를 잃을 수 있다.

 

 

 

참고: 

https://velog.io/@kwontae1313/%EC%A0%9C%EC%96%B4-%EC%97%AD%EC%A0%84IoC%EA%B3%BC-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85DI

 

제어의 역전(IoC)

프레임워크와 라이브러리의 가장 큰 차이점을 제어의 역전(IoC)라고 하였다. 제어하는 것은 개발자의 역할이라고 생각하지만, 프레임워크를 쓰게 되면 프레임워크의 틀안에서 개발자의 짜둔 어

velog.io

 

https://hudi.blog/inversion-of-control/

 

제어의 역전 (Inversion Of Control, IoC)

학습 동기 우아한테크코스 레벨2에서 스프링을 본격적으로 사용하면서, 스프링에서 제공하는 의존성 주입과 스프링 빈(Bean)을 접하게 되었다. 이 개념들에 익숙해지기 전 밀접하게 관련이 있어

hudi.blog