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

jhreplay.lee님의 프로필 이미지

작성한 질문수

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

async와 await 로직을 사용해야 하는 기준을 잘 모르겠어요

해결된 질문

23.11.12 09:09 작성

·

413

0

비동기 로직을 호출만 하고 끝나는게 아니라 결과값을 활용해야할 때 async, await를 활용해야 한다고 이해하고 있는데요. 한가지 이해가 잘 가지 않는 부분이

Auth Service에서

async registerWithEmail(
    user: Pick<UsersModel, 'nickname' | 'email' | 'password'>,
  ) {
    const hash = await bcrypt.hash(user.password, HASH_ROUNDS);
    const newUser = await this.usersService.createUser({
      ...user,
      password: hash,
    });

    return this.loginUser(newUser);
  }

async 함수는 결국 Promise를 반환하니까

Auth Controller에서

@Post('/register/email')
  registerByEmail(
    @Body('nickname') nickname: string,
    @Body('email') email: string,
    @Body('password') password: string,
  ) {
    return this.authService.registerWithEmail({
      nickname,
      email,
      password,
    });
  }

async, await를 사용하지 않으면 제대로 동작하지 않을 줄 알았는데 비동기 호출의 결과인 token이 잘 반환되더라구요. 혹시 이유를 알 수 있을까요?

async, await를 판단하는 강사님 만의 기준이 혹시 있으신지, 그리고 굳이 async, await가 필요 없는 곳에도 사용하게되면 성능의 차이가 생기는지도 궁금합니다.

답변 2

0

jhreplay.lee님의 프로필 이미지
jhreplay.lee
질문자

2023. 11. 12. 17:39

registerByEmail에서도 registerWithEmail의 결과를 기다려야 한다고 생각했는데 기다리지 않아도 의도한 대로 token이 잘 반환되는 점이 궁금했습니다.

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

2023. 11. 12. 17:44

안녕하세요! '기다린다'는 말이 조금 애매합니다. 왜냐면 이미 말씀드린대로 await를 써도, await를 쓰지 않아도 결국 반환 타입은 Promise입니다. 말씀하신대로 Promise를 '기다려'서 Promise를 벗겨내고 내부의 타입을 받아내는 역할은 registerByEmail() 함수를 실행하는 다른 함수입니다. registerByEmail()에서 registerWithEmail()에 await를 입력하냐 안하냐는 해당 함수가 Promise 타입을 반환하냐에 어떤한 영향도 주지 않습니다. registerWithEmail() 함수가 애초에 Promise 타입을 반환하게 돼있기 때문입니다.

jhreplay.lee님의 프로필 이미지
jhreplay.lee
질문자

2023. 11. 12. 17:50

아, registerByEmail에서는 Promise를 리턴하면 안된다고 생각했는데 강사님 설명 덕분에 이제 잘 이해했습니다!

0

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

2023. 11. 12. 16:53

안녕하세요!

'제대로 작동하지 않을 것 같았다'가 어떤 말씀이실까요?

JS/TS 강의에서 알려드린 것처럼 async 함수는 Promise 타입을 반환하게 됩니다.

이건 await를 사용하든 안하든 똑같습니다.

async/await를 사용하고 안하고의 '주관적 기준'은 존재하지 않습니다.

Promise를 '기다려야하면' await를 사용해야하고 아니면 await를 사용하지 않으셔도 됩니다.

감사합니다!