inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

581

한글영문대소문자

작성한 질문수 7

0

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

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

 

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


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

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

typescript rest-api nestjs backend

답변 2

1

목화

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

자바스크립트와 타입스크립트에서, 비동기 작업을 처리할 때, 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)});
}

 

감사합니다!

cascade 질문

0

35

1

@types/bcrypt 설치과정이 누락된것같습니다.

0

41

1

process.env port key 에러

0

43

1

추상화

0

44

1

[공유] DTO optional 필드가 undefined로 잡혀 TypeORM 조건이 깨지는 현상

0

92

2

where 키워드가 들어가는 메서드와 아닌 메서드

0

53

1

BearerTokenGuard에서 db를 조회해서 유저 정보를 불러오는 이유?

0

66

1

app.controller app.service 는 지워도되나요?

0

67

1

@JoinColumn을 쓰는 경우와 안쓰는 경우의 차이

0

75

1

포트 3000에서 listen하는 곳까지 넘어가지 않습니다.

0

62

1

PickType 사용 시 `as const`를 꼭 사용해야 하나요?

0

99

2

socket connect 오류

0

95

2

강의를 들으면서 궁금한 점

0

95

2

DELETE 요청의 반환값은 어떤 기준으로 결정하는 게 좋을까요?

0

55

2

커리큘럼 질문

0

94

2

put 요청은 언제

0

88

3

typeorm VS prisma

0

337

2

142 강의 > 4:00 > 포스트멘 활용 관련 질문 드립니다.

0

74

2

User 데코레이터 버그 수정 전달드립니다.

0

64

1

git 주소 부탁드립니다.

0

109

2

nest g resource 명령어 에러

0

97

2

로그인 엔드포인트 관련 질문

0

81

2

yarn으로 express 다운 후 node 2_server.js 실행 안되는 경우

0

143

3

"흔히 사용되는 메서드" 강의 관련 질문입니다~

0

93

2