프로그램의 흐름 (객체의 생성 , 생명주기)을
개발자가 직접 제어하는 것이 아닌 외부에서 제어 및 관리해주는 것을 말한다.
제어의 역전은 일반적인 디자인 패턴중 하나로 원래 개발자가 프로그램의 흐름을 제어하는 주체이지만 프레임 워크가 의존성을 상자화시키면서 생명주기를 관리하게 되었다. 즉 의존성의 제어권이 개발자에서 프레임워크로 넘어가게 되었으며 이를 제어권의 흐름이 변경되었다고 한다.
스프링에서는 Application을 구성하는 Bean을 관리하기 위하여 IOC개념을 이용
Spring IOC Container가 객체를 관리함으로써
DI(의존성 주입) , AOP(관점 지향 프로그래밍)이 가능해지게 된다.
Spring IOC Container가 주도권을 가져감으로써
객체의 관리, 의존관계의 결정 및 설정 등의 역할을 맡게된다.
Express.js에서는 이런 IoC 컨테이너에 해당되는 기능이 내장되어 있지 않다.
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('상품을 환불합니다.')
}
}
}
생성자 주입을 하여 의존성 주입을 하였고 의존성을 주입하였기때문에 제어가 역전되었다. 단순한 코드 몇줄이지만 한참을 들여다 본것같다. 지웠다가 다시 써봤다가 말로도 따라해보며 이해하려고 노력하였다.
오늘의 공부는 끝~~~