Ioc(Inversion of Control)
개념
Inversion of Control (IoC)는 객체의 생성과 관리 책임을 개발자가 아닌 프레임워크가 맡는 설계 패턴입니다. 즉 애플리케이션의 제어 흐름을 프레임워크가 관리하게 되며 이는 개발자가 직접 제어하는 대신 프레임워크가 애플리케이션의 구성 요소를 관리하고 연결함
목적
- 결합도 감소: 애플리케이션의 구성 요소 간의 결합도를 낮추어 유지보수성을 높입니다.
- 유연성 향상: 애플리케이션의 확장성과 유연성을 향상시킵니다.
- 테스트 용이성: 의존성 주입을 통해 테스트하기 쉬운 구조를 제공합니다.
3. DI (Dependency Injection) 개요
개념
- *Dependency Injection (DI)**는 IoC의 구현 방법 중 하나로 객체의 의존성을 외부에서 주입하여 객체 간의 결합도를 낮추는 설계 패턴입니다. DI는 객체의 생성과 관리가 아닌 의존성의 주입을 통해 객체를 구성함
유형
- 생성자 주입: 객체를 생성할 때 의존성을 주입합니다.
- 세터 주입: 객체의 세터 메서드를 통해 의존성을 주입합니다.
- 인터페이스 주입: 의존성을 구현체의 메서드를 통해 주입합니다.
Express와 NestJS에서의 IoC 및 DI
Express
IoC 및 DI의 사용
- Express는 기본적으로 IoC와 DI를 제공하지 않는다. 개발자가 직접 객체를 생성하고 관리해야 하며의존성 관리도 개발자가 직접 수행해야 한다.
- 예시:
- 라우터와 컨트롤러를 수동으로 연결해야 하며, 의존성을 직접 관리해야 합니다.
- 테스트 시, 의존성 주입을 수동으로 처리해야 합니다.
코드 예시
const express = require('express');
const app = express();
class UserService {
constructor() {
}
getUser() {
}
}
const userService = new UserService();
app.get('/user', (req, res) => {
res.json(userService.getUser());
});
- 문제점: 의존성 관리가 어렵고, 의존성을 직접 생성하고 연결해야 합니다.
NestJS
IoC 및 DI의 사용
- NestJS는 IoC와 DI를 강력하게 지원합니다. 프레임워크가 객체의 생성과 관리, 의존성 주입을 자동으로 처리합니다.
- 예시:
- NestJS는 의존성 주입을 통해 컨트롤러와 서비스를 자동으로 연결합니다.
@Injectable() 데코레이터를 사용하여 서비스의 의존성을 주입합니다.
코드 예시
import { Injectable, Controller, Get } from '@nestjs/common';
@Injectable()
class UserService {
getUser() {
}
}
@Controller('user')
class UserController {
constructor(private readonly userService: UserService) {}
@Get()
getUser() {
return this.userService.getUser();
}
}
- 장점:
- 자동 의존성 주입: NestJS는
UserController에서 UserService의 의존성을 자동으로 주입합니다.
- 유연성 및 테스트 용이성: 의존성 주입을 통해 구성 요소의 결합도를 낮추어 테스트가 용이합니다.
5. IoC 및 DI의 이점
1. 결합도 감소
- Express: 직접 객체를 생성하고 관리해야 하므로 결합도가 높아질 수 있습니다.
- NestJS: 프레임워크가 객체의 의존성을 관리하여 결합도를 낮춥니다.
2. 유연성 향상
- Express: 유연성을 확보하기 위해 개발자가 직접 의존성을 관리해야 합니다.
- NestJS: 프레임워크가 의존성 관리를 자동으로 처리하여 유연성을 높입니다.
3. 테스트 용이성
- Express: 테스트 시 의존성 주입을 수동으로 처리해야 하며, 테스트가 복잡해질 수 있습니다.
- NestJS: 자동으로 의존성을 주입하여 테스트가 용이하고, Mocking도 쉽습니다.
정리
NestJS가 Ioc와 DI를 지원하기 떄문에 개발 효율성과 유지보수에 도움이 많이 됨. 즉 express 대신 NestJS를 쓰자!