인프런 커뮤니티 질문&답변

grs0412님의 프로필 이미지

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

Chat Entity 생성하기

serivice, controller에서 의존성 주입시 순서보장은 어떻게 유지되나요?

해결된 질문

작성

·

87

0

@Injectable()
export class AuthService {

  constructor(

    private readonly jwrService: JwtService,

    private readonly userService: UsersService,

    private readonly configService: ConfigService,

  ) {} 

 

class에서 constructor로 주입받은 의존성을 가져올때 key, value 형식이 아닌 순서대로 가져오는데 어떻게 첫번째에 무슨 의존성이 오는지 확신할 수 있게 되는건가요?

단연한듯이 타입을 지정하고 내가 원하는 서비스를 꺼내오거나 레포지토리를 꺼내오는데 그 아래 어떤 바탕이 있는지 궁금합니다.

답변 2

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

순서는 위에서부터 아래로 인식될걸로 예상됩니다.

이는 쉽게 알 수 있는게 일부러 provider를 모듈에 등록해두지 않으면 위에서부터 아래로 순서대로 에러가 발생됩니다.

하지만 순서가 중요하지 않습니다. 어차피 모두 initialize가 된 상태에서만 초기화가 되기 때문에 클래스 내부에서 접근 가능한 상태는 이미 모두 초기화 된 상태입니다.

혹시 IoC 컨테이너에대한 강의를 스킵하셨다면 해당 섹션 참고 부탁드립니다!

감사합니다!

grs0412님의 프로필 이미지
grs0412
질문자

타입선언은 실제 자바스크립트 코드실행에 영향이 없는거 아닌가요? 컨트롤러에서 body에서 dto 타입선언만으로 어떻게 validation이 되는지 궁금합니다
자바스크립트에서 타입스크립트 타입선언이 어떤 것으로 되어있는지 가져올 수 있는 건가요?

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

위 질문과 동일한 질문인가요? 관련이 없어보여서 헷갈리네요.

다른 질문이라면 TS에서 Decorator 강의에서 설명 드렸지만 데코레이터는 결국 JS를 실행하는 로직을 들고 있습니다!

grs0412님의 프로필 이미지
grs0412
질문자

네 동일하다고 생각되는데

  @Post('post')
  async postPosts(@User('id') userId: number, @Body() postDto: PostDto) {
    const result = await this.postService.createPost(userId, postDto);
    return { data: { id: result.id }, message: ['게시글이 생성되었습니다.'] };
  }
 @Body() postDto: PostDto

위 에서는 타입선언 말고 따로 자바스크립트적으로 가드라던가 한게 없는데 class-validator에 영향을 줄 수 있는건가요?

 

 

constructor(  
  private readonly postService: PostService,
  private readonly jwtService: JwtService,
  private readonly userService: UsersService,
 ) {}

이렇게 의존성을 가져올때도 new Controller(postService, jwtService, userService)
이렇게 순서대로 넣어야 하는거 아닌가요? 제가 어떤 순서로 넣는지 nestjs 내부적으로 어떻게 추론되는지 궁금합니다

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

죄송합니다 잘 이해가 되지 않네요. 그냥 보이는대로 답변 드리도록 하겠습니다.

1) PostDto 타입을 어떻게 Validate 하는가?

ClassValidator 적용할때 ClassSerializationInterceptor 및 ValidationPipe를 사용하고 있습니다. 이 내부 로직들이 적용된 Class Validator annotation들의 검증을 모두 실행시킵니다. (위 설명해드린대로 마찬가지로 TS Decorator Reflection 입니다)

2) 어떻게 순서대로 넣어주는가?

이것도 마찬가지로 TS Decorator reflection입니다. 저희가 타입을 지정 해줬으니 어떤 순서로 넣어줘야할지는 모를수가 없습니다. (역으로 왜 모를거라 생각하는지가 궁금합니다)

감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. grs0412님.

의존성 주입과 관련된 순서 보장 문제에 대해 명확한 답변을 제공하기 위해 아래와 같은 유사한 질문과 답변을 참고하실 수 있습니다.

관련 질문 URL:

  1. AuthService를 주입 받지 못하는 이유를 모르겠어요
  2. @Injectable 관련 질문

풍부한 설명 추가:

의존성 주입 시 순서를 보장하는 것은 NestJSDI(Dependency Injection) 프레임워크가 담당합니다. DI 프레임워크는 코드 컴파일 시 타입 정보를 기반으로 의존성을 주입하므로, 순서에 관계없이 타입 정보를 통해 올바른 인스턴스를 주입할 수 있습니다.

또한, 주입된 의존성들은 클래스의 생성자 매개변수에 설정된 타입에 따라 자동으로 주입되므로 순서와 관계없이 올바른 의존성이 주입됩니다.

@Injectable()
export class AuthService {
  constructor(
    private readonly jwrService: JwtService,
    private readonly userService: UsersService,
    private readonly configService: ConfigService
  ) {}
}

위 코드에서 JwtService, UsersService, ConfigService는 모두 @Injectable() 데코레이터가 적용되어 있어, NestJS의 DI 시스템이 올바르게 작동하여 각 타입에 맞는 인스턴스를 주입해줍니다. NestJS의 DI 시스템은 타입스크립트의 리플렉션(reflection) 메타데이터를 사용하여 생성자 매개변수의 타입 정보를 알아내어 이를 기반으로 주입 대상을 결정합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

grs0412님의 프로필 이미지

작성한 질문수

질문하기