DI (Dependency Injection) : 의존성 주입
- 객체 지향 프로그래밍에서 중요한 디자인 패턴 중 하나
- 객체가 필요로 하는 의존 객체를 외부에서 주입하하여 객체 간의 결합도를 낮추는 방식
사용하는 이유
의존성 주입을 통해 객체는 자신이 사용할 의존 객체를 직접 생성하지 않고, 외부에서 생성된 객체를 주입받기 때문입니다.
이로 인해 객체는 자신의 구현에만 집중할 수 있으며, 변경에 유연하게 대응할 수 있습니다.
장점
코드의 재사용성 증가, 코드의 유지보수성 향상, 객체 간의 결합도 감소, 단위 테스트 용이성 증가
Nest.js 에서 DI 하는 방법
- DI는 의존성을 “런타임”시점에 주입시켜주는 기술
- TypeScript는 컴파일 시점에만 인터페이스가 존재하고 “런타임” 시점에는 인터페이스가 사라지게 된다
→ DI컨테이너가 런타임 시점에 의존성을 주입시켜주지 못 해서 에러발생
프로바이더를 모듈에 등록할때 사용자 지정 프로바이더 문자열 토큰 주입 방식으로 해결
export interface TestRepository {
outputText(text: string): void;
}
@Injectable()
export class TestConsoleLog implements TestRpository {
outputText(text: string): void {
console.log(text);
}
}
@Module({
imports: [TypeOrmModule.forFeature([Test])],
controllers: [WorkoutLogController],
providers: [TestService,
// provide에 문자열 토큰 지정
{ provide: 'test', useClass: TestConsoleLog }
],
})
@Injectable()
export class TestService {
constructor(
@Inject('test') //// Inject 데코레이터 사용해서 porivde에 등록한 문자열 토큰 사용
readonly testRepository: TestRepository,
) {}
outputMessage(message: string): void{
this.testRepository.printText(message);
}
}
문자열 토큰방식으로 프로바이더를 등록 후 의존하고 있는 인터페이스에 @Inject('등록한 문자열 토큰') 데코레이터를 달아주면 useClass에 명시한 구현체가 주입된다.
참고 자료
'프로그래밍 > Nest.js' 카테고리의 다른 글
[ Nest.js ] jest 이용한 e2e 테스트 (0) | 2024.09.07 |
---|---|
[ Nest.js ] error, Jest did not exit one second after the test run has completed. (0) | 2024.08.27 |
[ Nest.js ] 대량의 데이터 삭제시 두가지 softDelete 방식 비교 (0) | 2024.07.23 |
[ Nest.js ] update vs createQueryBuilder vs query : 다량의 데이터 업데이트 속도 비교 (0) | 2024.07.22 |
[ Nest.js ] insert vs save : 둘 이상의 데이터 저장시 속도비교 (1) | 2024.07.22 |