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

한글영문대소문자님의 프로필 이미지
한글영문대소문자

작성한 질문수

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

Find 함수 사용해서 다수의 데이터 가져오기

getAllPost() 함수 관련 질문 드립니다.

작성

·

466

0

// posts.service.ts
async getAllPost() {
    return this.postsRepository.find();
}

안녕하세요, 궁금한 사항이 있어 질문 남깁니다.

 

위 코드에서 find() 메서드는 Promise를 리턴하니까 service에 존재하는 getAllPost 함수는 Promise를 리턴하게 되지 않나요?
해당 코드를 실제로 돌려보니 return await this.postsRepository.find() 처럼 돌아가는게 이해가 잘 안됩니다.


강의에서는 "컨트롤러에서 바로 반환을 해주기 때문에 async, await을 안 붙혀도 상관이 없다" 라고 말씀해주셨는데, 음... 바로 반환을 하면 Promise가 return되어야 하지 않나란 생각이 듭니다.

이 부분에 대한 부연 설명이 가능할까요?
감사합니다.

답변 2

0

저도 궁금해서 찾아보고 혹시나 도움이 될까 해서 추가로 남겨봅니다.

자바스크립트와 타입스크립트에서, 비동기 작업을 처리할 때, awaitPromise가 해결될 때까지 기다렸다가 그 다음 코드 줄의 실행을 계속합니다. 하지만, await을 사용할 필요성은 코드 실행의 맥락과 달성하려는 목표에 따라 달라집니다.

 

프로미스 직접 반환

비동기 함수에서 프로미스를 직접 반환하면서 그 함수 내에서 해결될 필요 없이 반환한다면, await을 사용할 필요가 없습니다. 이는 비동기 함수 자체가 프로미스를 반환하고, 다른 프로미스를 직접 반환함으로써 본질적으로 그들을 연결하는 것입니다. 이는 함수의 호출자가 그 프로미스의 해결이나 거부를 처리하도록 위임하고 싶을 때 유용합니다.

async function fetchData() {
  return fetch('https://api.example.com/data'); // 프로미스를 직접 반환
}

// 호출자가 프로미스를 처리함
fetchData().then(data => console.log(data)).catch(error => console.error(error));


해결된 값 사용 필요

함수 내에서 반환하기 전에 프로미스의 해결된 값을 사용해야 한다면, 프로미스가 해결될 때까지 실행을 일시 중지하기 위해 await을 사용해야 합니다.

async function fetchData() {
  const response = await fetch('https://api.example.com/data'); // 프로미스가 해결될 때까지 기다림
  const data = await response.json(); // 해결된 값을 사용
  return data; // 데이터 반환
}

// 호출자가 프로미스를 처리함
fetchData().then(data => console.log(data)).catch(error => console.error(error));


예외 처리

try-catch 블록 내에서 await을 사용할 때, 프로미스 실행 중 발생하는 모든 에러를 잡을 수 있습니다. await 없이 직접 프로미스를 반환한다면, 에러 처리를 호출자에게 위임하게 되며, 호출자는 .catch() 또는 비동기 함수 내의 try-catch 블록을 사용해야 합니다.


요약

- `await` 사용 불필요: 비동기 함수에서 해결된 값을 조작하거나 사용할 필요 없이 직접 프로미스를 반환할 때.

- `await` 사용 필요: 프로미스의 해결된 값을 사용하거나 함수 내에서 에러 처리를 수행해야 할 때.

await을 사용할지 여부는 코드의 구체적인 요구사항과 프로미스 및 그 해결을 어떻게 처리하고 싶은지에 따라 달라집니다.

0

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

안녕하세요!

말씀하신대로 await를 하든 안하든 둘 다 Promise가 반환되기 때문에 차이가 없습니다.

반환 타입에 Promise 타입을 정의하고 await 반환과 await 하지 않은 반환을 테스트 해보세요. 모두 다 정의에 문제가 없는걸 확인 가능하실겁니다.

 

예제 1

async function test():Promise<number>{
    return await getNumb();
}

async function getNumb(): Promise<number>{
    return new Promise<number>((resolve)=>{resolve(1)});
}

예제 2

async function test():Promise<number>{
    return getNumb();
}

async function getNumb(): Promise<number>{
    return new Promise<number>((resolve)=>{resolve(1)});
}

 

감사합니다!

한글영문대소문자님의 프로필 이미지
한글영문대소문자

작성한 질문수

질문하기