스프링에서 나온 개념이 여기서도 나온다
nestJS도 컨테이너에 @Injectable 데코레이터가 붙은 클래스를 등록하여 언제 어디서든 의존성을 주입받을 수 있도록 한다. 당연히 싱글톤 패턴처럼 프로그램 내에 유일하다.
같은 모듈 내에서
/* messages.repository.ts */
import {Injectable} from "@nestjs/common";
import {readFile, writeFile} from 'fs/promises';
@Injectable()
export class MessagesRepository{
async findOne(id:string){
const contents = await readFile('./messages.json', 'utf-8');
const messages = JSON.parse(contents);
return messages[id];
}
async findAll(){
const contents = await readFile('./messages.json', 'utf-8');
const messages = JSON.parse(contents);
return messages;
}
async create(content: string){
const contents = await readFile('./messages.json', 'utf-8');
const messages = JSON.parse(contents);
const id = Math.floor(Math.random() * 999);
messages[id] = {id, content : content}
await writeFile('./messages.json', JSON.stringify(messages));
}
}
이런 리포지토리를 주입받고 싶다면 @Injectable()을 추가해준 다음, 사용할 클래스의 생성자에서
constructor(public messagesRepo: MessagesRepository) {}
이렇게 받아오기만 하면 된다.
이 때 모듈에서
@Module({
controllers: [MessagesController],
providers: [MessagesService, MessagesRepository]
})
export class MessagesModule {}
요렇게 등록되어 있어야만 찾아서 가져올 수 있으니 주의하자
다른 모듈 간의 의존성 주입
그러면 서로 다른 모듈에서는 어떻게 의존성을 주입받는가
/* power.service.ts */
@Injectable()
export class PowerService {
supplyPower(watts: number) {
console.log(`supply power ${watts}`);
}
}
당연히 @Injectable 데코레이터를 추가해준 다음 이 클래스가 Provider로 등록되어있는 모듈로 가서
@Module({
providers: [PowerService],
exports: [PowerService],
})
export class PowerModule {}
exports로 외부에서 사용 가능함을 표시해줘야 한다. 아니면 기본적으로 private하게 사용되어서 같은 모듈 내에서밖에 사용하지 못한다.
그리고 사용할 모듈에서는
@Module({
imports: [PowerModule],
providers: [CpuService],
})
export class CpuModule {}
이렇게 imports로 의존성을 가져올 모듈을 추가해주면 의존성 주입이 가능하다
'NestJS' 카테고리의 다른 글
| 반환 정보 편집하기 (1) | 2025.06.15 |
|---|---|
| 입력 정보 검증하기 (0) | 2025.06.15 |
| TypeORM 간단 사용법 (0) | 2025.06.15 |
| 컨트롤러 라우팅 / 요청 인자 받기 (0) | 2025.06.14 |
| nestJS 시작 (2) | 2025.06.14 |