InversifyJS를 사용한 DI 컨테이너
컨테이너에 서비스를 등록하고 해결합니다.
InversifyJS를 사용한 DI 컨테이너은(는) CoddyKit의 무료 TypeScript Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 TypeScript Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
DI 컨테이너가 필요한 이유
큰 객체 그래프를 수동으로 연결하는 작업은 번거롭고 오류가 발생하기 쉽습니다. DI 컨테이너는 각 의존성을 만드는 방법을 등록하고 자동으로 해결합니다. InversifyJS는 널리 사용되는 TypeScript 컨테이너입니다.
설치 및 활성화
InversifyJS는 데코레이터와 리플렉션 메타데이터에 의존합니다. inversify에서 가져오고 experimentalDecorators와 reflect-metadata를 활성화합니다.
import "reflect-metadata";
import { Container, injectable, inject } from "inversify";클래스에 @injectable 표시하기
@injectable() 데코레이터는 컨테이너에 해당 클래스를 생성하고 주입할 수 있다고 알립니다. 컨테이너가 생성하는 모든 클래스에는 이 데코레이터가 필요합니다.
import { injectable } from "inversify";
@injectable()
class ConsoleLogger {
log(m: string) { console.log(m); }
}@inject로 의존성 선언하기
생성자 매개변수에 @inject(token)을 사용하면 컨테이너에 어떤 바인딩을 제공해야 하는지 알릴 수 있습니다. 토큰이 의존성을 식별합니다.
@injectable()
class OrderService {
constructor(@inject("Logger") private logger: ConsoleLogger) {}
place() { this.logger.log("placed"); }
}컨테이너 만들기
Container는 앱의 모든 바인딩을 보관합니다. 시작할 때 하나를 만들고 그곳에 의존성을 등록합니다.
import { Container } from "inversify";
const container = new Container();인터페이스를 구현체에 바인딩하기
연쇄형 API인 bind<T>(token).to(Impl)는 토큰(대개 인터페이스)을 컨테이너가 인스턴스화할 구체 클래스에 매핑합니다.
interface Logger { log(m: string): void; }
container.bind<Logger>("Logger").to(ConsoleLogger);서비스 해결하기
container.get<T>(token)은 요청한 서비스를 만들고, 필요한 의존성을 재귀적으로 생성하여 주입합니다.
container.bind<OrderService>(OrderService).toSelf();
const svc = container.get<OrderService>(OrderService);
svc.place();구현체 바꾸기
다른 로거를 사용하려면 토큰을 다른 클래스에 다시 바인딩하시면 됩니다. 사용하는 쪽은 구체적인 클래스가 아니라 토큰에 의존하므로 수정할 필요가 없습니다.
@injectable()
class SilentLogger implements Logger { log() {} }
container.rebind<Logger>("Logger").to(SilentLogger);싱글턴 범위
기본적으로 get을 호출할 때마다 새 인스턴스가 만들어질 수 있습니다. inSingletonScope()를 사용하면 앱 전체에서 하나의 인스턴스를 공유할 수 있습니다.
container.bind<Logger>("Logger").to(ConsoleLogger).inSingletonScope();컨테이너로 테스트하기
테스트에서는 새 컨테이너를 만들고 fake를 바인딩할 수 있습니다. 이렇게 하면 테스트 대상 단위를 격리하면서 동일한 연결 구성의 이점을 얻을 수 있습니다.
const testContainer = new Container();
testContainer.bind<Logger>("Logger").to(SilentLogger);컨테이너의 장단점
컨테이너는 큰 객체 그래프에서 반복 코드를 줄여 주지만 의존성, 데코레이터, 간접 참조를 추가합니다. 작은 앱에서는 수동 생성자 주입이 더 명확한 경우가 많습니다.
빠른 확인
이 레슨을 간단히 확인해 봅니다.
복습
InversifyJS는 @injectable, @inject(token), 그리고 Container를 사용합니다. bind<Interface>(token).to(Impl)로 바인딩하면 container.get이 의존성 그래프를 자동으로 해석합니다. reflect-metadata와 데코레이터가 필요하며, 상용구 코드를 줄이는 대신 간접 참조를 사용합니다.
자주 묻는 질문
“InversifyJS를 사용한 DI 컨테이너” 강의는 무료인가요?
네 — “InversifyJS를 사용한 DI 컨테이너” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 TypeScript Academy 강의 전체를 잠금 해제할 수 있습니다. TypeScript Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“InversifyJS를 사용한 DI 컨테이너”에서 뭘 배우나요?
컨테이너에 서비스를 등록하고 해결합니다. 브라우저에서 직접 실행하는 실습 코드로 TypeScript Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
TypeScript Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 TypeScript Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“InversifyJS를 사용한 DI 컨테이너” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 TypeScript Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 TypeScript Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 제어 반전 기초
- 생성자 주입
- InversifyJS를 사용한 DI 컨테이너
- 타입 안전한 서비스 토큰