본문 바로가기

제어 역전 / 의존성 주입

@정소민fan2025. 6. 14. 20:31

스프링에서 나온 개념이 여기서도 나온다

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
정소민fan
@정소민fan :: 코딩은 관성이야

코딩은 관성적으로 해야합니다 즐거운 코딩 되세요

목차