작성
·
97
·
수정됨
0
안녕하세요.
강의대로 Guard에 대해 같이 진행하였지만, App.module.ts에
{
provide: APP_GUARD,
useClass: AccessTokenGuard,
},
를 넣으면,
bearertokengaurd에서 isPublic이 항상 undefined로 나와서 exception이 나옵니다...dependency 오류는 안나오는걸로 보아 다른 문제인 것 같은데 도저히 못 찾겠습니다..
@Injectable()
export class BearerTokenGuard implements CanActivate {
constructor(
private readonly reflector: Reflector,
private readonly authService: AuthService,
private readonly memberService: MemberService,
) {}
여기 디버깅 했을 때 reflector, authService, memberService 모두가 undefined으로 나옵니다.
정확히
this.reflector.getAllAndOverride
가 터지고 있습니다...
뭐가 문제 일까요?
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다.
kwa9010님, 문제 상황에 대해 잘 설명해주셨네요.
BearerTokenGuard
에서 reflector
, authService
, memberService
가 undefined로 나오는 문제는 대개의 경우 NestJS의 Dependency Injection (DI) 시스템에서 의존성을 올바르게 주입하지 못하는 경우에 발생합니다. 이러한 문제는 다음과 같은 이유로 발생할 수 있습니다:
Module 설정 오류: App.module.ts
또는 관련 모듈에서 Reflector
, AuthService
, MemberService
를 올바르게 등록하지 않았을 경우 발생할 수 있습니다. 각각의 서비스와 Guard
가 속한 모듈을 확인해보고 필요한 경우 모듈에 서비스를 제공해야 합니다.
순환 참조: AuthService
, MemberService
또는 이들이 의존하고 있는 다른 서비스 간에 순환 참조가 있는 경우에도 이와 같은 문제가 발생할 수 있습니다. 이 경우, 의존성 주입 시점에 서비스가 아직 완전히 초기화되지 않아 undefined로 나올 수 있습니다.
Custom Provider 문제: APP_GUARD
와 같이 NestJS에서 제공하는 Global Scope Provider를 사용할 때, 의존성 주입 순서에 문제가 있을 수 있습니다. 특히, Reflector
가 NestJS 프레임워크에 의해 자동으로 주입되는 것이 아니라, 직접 제공해야 하는 경우가 있습니다. 이때는 Reflector
를 명시적으로 모듈에 제공해야 할 수 있습니다.
Decorator의 오용: @Injectable()
데코레이터가 적절히 사용되었는지도 확인해주세요. 경우에 따라 클래스나 의존성에 @Injectable()
이 누락되어 의존성 주입이 수행되지 않을 수 있습니다.
해결 방법은 다음과 같이 시도해볼 수 있습니다:
AppModule
뿐만 아니라 AuthService
, MemberService
가 선언되어 있는 모듈의 설정도 확인해보세요.forwardRef(() => AnotherService)
를 사용하여 순환 참조 문제를 해결해보세요.Reflector
가 필요한 경우, CoreModule
이나 Guard를 사용하는 모듈에서 Reflector
를 명시적으로 제공하는 것을 고려하세요.이러한 해결 방안을 적용해도 문제가 해결되지 않는다면, 모듈 및 서비스 구성을 더 상세히 점검해보는 것이 필요할 수 있습니다.