T.I.L #35 IoC(Inversion of Control)와 DI(Dependency Injection)

개발자지망생·2023년 11월 16일
0

IoC(Inversion of Control)와 DI(Dependency Injection)란?

IoC (Inversion of Control)

  • 비유: IoC 레스토랑으로 비유하자면, 일반적으로 집에서 요리할때는 재료를 사고, 요리하고, 서빙하는 모든 과정을 스스로 관리한다. 그러나 레스토랑에 가면 이 모든 과정을 레스토랑이 관리해 준다. 나는 단지 무엇을 먹을지만 결정하면 된다.

  • 소프트웨어에서의 의미: 전통적인 프로그래밍에서는 프로그램의 흐름을 개발자가 직접 제어한다. 반면, IoC에서는 이러한 흐름의 제어를 프레임워크나 라이브러리에 넘긴다. 개발자는 필요한 부분에만 집중하고, 나머지는 프레임워크가 처리하게 된다.

DI (Dependency Injection)

  • 비유: DI를 자동차 조립 공자에 비유하자면, 자동차를 조립할 때 각 부품을 직접 만들어서 조립하기보다는, 완성된 부품들을 공급받아 조립하는 것이 더 효율적이다. 이 경우, 각 부품은 의존성이 되며, 공장은 이러한 의존성을 주입받아 자동차를 완성한다.

  • 소프트웨어에서의 의미: DI는 어떤클래스가 사용하는 의존성(다른 클래스나 모듈)을 외부에서 제공(주입)하는 기법이다. 클래스 내부에서 직접 의존성을 생성하는 대신, 외부(프레임워크)에서 필요한 의존성을 제공받아 사용한다. 이로 인해 코드의 결합도가 낮아지고, 유지보수 및 테스트가 용이해진다.

IoC와 DI 적용

  • 쇼핑 앱을 개발한다고 할 때, 이 앱에는 사용자 인증, 제품 목록 표시, 주문 처리 등의 기능이 필요하다.

  • IoC 적용: 프레임워크를 사용하여 어플리케이션의 전반적인 흐름을 관리한다. 예를 들어, HTTP 요청이 들어오면 프레임워크가 적절한 컨트롤러를 호출한다.

  • DI 적용: 사용자 인증 서비스, 제품 데이터베이스 접근 서비스 등의 구성 요소들은 외부에서 생성되어 각 클래스에 주입된다. 예를 들어, 주문 처리 클래스는 데이터베이스 접근 서비스를 필요로 하는데, 이 서비스는 프레임워크에 의해 해당 클래스에 주입된다.

의존성 (Dependency)이란?

  • 정의: 의존성이란 한 클래스(Class)가 다른 클래스의 인스턴스에 의존하는 관계를 의미한다. 다시 말해, 한 클래스가 제대로 가능하기 위해 다른 클래스의 기능이나 데이터가 필요한 상태이다.

  • 예시: A 클래스가 B 클래스에 데이터를 전달하거나 그 기능을 사용해야 한다면, A는 B에 의존하고 있다.

주입 (Injection)이란?

  • 정의: 주입은 의존성이 필요한 객체에 그 의존성을 외부하게 제공하는 것을 말한다. 이는 객체가 자신의 의존성을 직접 생성하지 않고, 외부(다른 클래스, 프레임워크)에서 생성된 의존성을 받아 사용하는 것이다.

  • 예시: A 클래스가 B의 인스턴스를 필요로 한다면, B 인스턴스를 외부에서 A에 주입할 수 있다. 이를 통해 A는 B의 구체적인 생성 방법을 알 필요가 없어지고, 코드의 유연성과 테스트 용이성이 증가한다.

의존성 주입(Dependency Injection)은 특히 제어의 역전(IoC) 원칙과 함께 사용되어 객체 간의 결합도를 낮추고, 유지보수 및 확장성을 높이는 데 큰 역할을 한다. 객체가 직접 의존성을 생성하고 관리하는 대신, 이를 외부에서 주입받아 사용함으로써 더 깔끔하고 유연한 코드 구조를 만들 수 있다.

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

  • 프로그램의 흐름을 프레임워크가 관리하며, 개발자는 프레임워크가 제공하는 특정 구조나 규칙에 맞춰서 코드를 작성한다.

  • 요청과 그에 대한 처리 방식을 프레임워크가 결정하고, 개발자는 단지 요청을 처리하는 데 필요한 함수(컨트롤러)만 작성한다.

  • 프레임워크가 제어 흐름을 관리하므로, 코드 수정이나 확장이 보다 쉬워진다. 개발자는 특정 요구 사항에 맞춰서 코드를 작성하기만 하면 된다.

  • 코드가 더 체계적이고 모듈화되어 있어 유지보수가 쉬워진다.

  • 개별 컴포넌트의 테스트가 쉬워지며, 특히 단위 테스트에 유리하다.

0개의 댓글