IoC와 DI

설하나·2022년 12월 5일
0

TIL

목록 보기
10/11

📝 Inversion Of Control (IOC)

정의

프로그램의 흐름 (객체의 생성 , 생명주기)을
개발자가 직접 제어하는 것이 아닌 외부에서 제어 및 관리해주는 것을 말한다.

제어의 역전은 일반적인 디자인 패턴중 하나로 원래 개발자가 프로그램의 흐름을 제어하는 주체이지만 프레임 워크가 의존성을 상자화시키면서 생명주기를 관리하게 되었다. 즉 의존성의 제어권이 개발자에서 프레임워크로 넘어가게 되었으며 이를 제어권의 흐름이 변경되었다고 한다.

📝 IOC Container

스프링에서는 Application을 구성하는 Bean을 관리하기 위하여 IOC개념을 이용
Spring IOC Container가 객체를 관리함으로써
DI(의존성 주입) , AOP(관점 지향 프로그래밍)이 가능해지게 된다.
Spring IOC Container가 주도권을 가져감으로써
객체의 관리, 의존관계의 결정 및 설정 등의 역할을 맡게된다.

Express.js에서는 이런 IoC 컨테이너에 해당되는 기능이 내장되어 있지 않다.

📝 의존성 주입 (DI)

DI(Dependency Injection) 의존성 주입은 Tight Coupling(강한 결합)을 Loose Coupling(느슨한 결합)으로 전환 시키는 방법이며, 제어의 역전(Inversion of Control)의 기술중 하나이다.

DI(Dependency Injection) 의존성 주입에 총 3가지의 방법이 존재하며 이 중 Constructor Inject(생성자 주입)이 많은 Design pattern에서 권장한다.


처음에는 IoC와 DI의 개념을 받아들이기가 어려웠다. 하지만, 코드를 직접쳐보면서 강한결합은 무엇인지 느슨한 결합은 무엇인지 알아보았다.

export class ProductController {
    constructor(moneyService, productService){
        this.moneyService = moneyService
        this.productService = productService
    }
    
    buyProduct(req, res) {
        // 1. 가진돈 검증하는 코드(10줄 => 2줄)
        const hasMoney = this.moneyService.checkValue() // true 또는 false
    
        // 2. 판매여부 검증하는 코드(10줄 => 2줄)
        const isSoldout = this.productService.checkSoldout() // true 또는 false
    
        // 3. 상품 구매하는 코드
        if(hasMoney && !isSoldout) {
            res.send('상품을 구매합니다.')
        }
    }

    refundProduct(req, res) {
        // 1. 판매여부 검증하는 코드(10줄 => 2줄)
        const isSoldout = this.productService.checkSoldout() // true 또는 false
    
        // 2. 상품 환불하는 코드
        if(isSoldout){
            res.send('상품을 환불합니다.')
        }
    }

}

생성자 주입을 하여 의존성 주입을 하였고 의존성을 주입하였기때문에 제어가 역전되었다. 단순한 코드 몇줄이지만 한참을 들여다 본것같다. 지웠다가 다시 써봤다가 말로도 따라해보며 이해하려고 노력하였다.

오늘의 공부는 끝~~~


출처
IoC-참고 링크 1
IoC-참고 링크 1
DI - 참고 링크 1

profile
Backend

0개의 댓글