배꼽파지 않도록 잘 개발해요

[NestJS] @Inject 데코레이터를 사용할 때는 provide할 때 사용한 이름으로 주입받아야 함 본문

BackEnd/Express / NestJS

[NestJS] @Inject 데코레이터를 사용할 때는 provide할 때 사용한 이름으로 주입받아야 함

꼽파 2024. 8. 26. 17:02

NestJS는 모듈 기반 아키텍처를 사용하는 프레임워크이다. import와 export만 제대로 해주면 되는 express와는 다르다.

이로 인해 의존성 주입(Dependency Injection)과 모듈 간의 관계 설정이 정말 중요하다.

 

그래서 아래와 같은 깜찍발랄한 오류들을 자주 만날 수 있다.

[Nest] 7816  - 2024. 08. 26. 오후 4:47:41   ERROR [ExceptionHandler] Nest can't resolve dependencies of the AuthSessionService (?). Please make sure that the argument Redis at index [0] is available in the AuthModule context.

Potential solutions:
- Is AuthModule a valid NestJS module?
- If Redis is a provider, is it part of the current AuthModule?
- If Redis is exported from a separate @Module, is that module imported within AuthModule?
  @Module({
    imports: [ /* the Module containing Redis */ ]
  })

오류 메시지에서 AuthSessionService가 Redis 의존성을 해결하지 못한다고 하는 것은, AuthSessionService에서 필요로 하는 Redis 프로바이더가 AuthModule에서 올바르게 주입되지 않았다는 뜻이다.

 

무슨 말인지 모르겠어도 눈에 들어오는 파일이 AuthModule, RedisModule, AuthSessionService니까 서로 제대로 주입이 되었는지 순서대로 찾아가면서 확인하면 된다.

 

나의 경우에는 아래가 문제였다.

 

현재 Redis 모듈에서 'REDIS_CLIENT'라는 문자열을 사용하여 Redis Client를 제공하고 있다.

 

이걸 이런식으로 주입하니 NestJS가 'Redis' 타입의 출처를 찾지 못하였다.

private readonly redisClient: Redis

 

그래서 @Inject('REDIS_CLIENT')를 통해 명시적으로 주입을 해주었다.

    constructor(
        @Inject('REDIS_CLIENT') private readonly redisClient: Redis
      ) {}

@Inject()가 없어도 컴파일 에러는 발생하지 않는데, 서버를 실행하면 에러가 났다.

 

결론은 provide를 할 때 지정한 문자열로, 다른 곳에서 inject를 하여야 한다는 말이다.

728x90