강의

멘토링

커뮤니티

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

gigo96님의 프로필 이미지
gigo96

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

에러 핸들링과 db 조회 시 await을 붙이는 경우와 안붙이는 경우가 궁금합니다.

해결된 질문

작성

·

390

·

수정됨

0

  1. 에러 핸들링의 경우 그냥 throw로 에러를 던져주기만 하는데 await을 붙여 에러를 받아야되는 이유가 궁금합니다.

 async checkSoldout({ productId }) {
    const product = await this.productRepository.findOne({
      where: { id: productId },
    });

    if (product.isSoldout)
      throw new UnprocessableEntityException('이미 판매가 완료된 상품입니다.');
  }
@Mutation(() => Product)
  async updateProduct(
    @Args('productId') productId: string,
    @Args('updateProductInput') updateProductInput: UpdateProductInput,
  ) {
    // 여기서 에러를 받았을 때 await을 붙여야 정상동작을 하는데 이유가 궁금하네요.
    await this.productService.checkSoldout({ productId });

    return this.productService.update({ productId, updateProductInput });
  }

 

  1. 제가 실험삼아 db를 업데이트 할 때 await을 빼고 로직을 수행해 봤는데 정상적으로 동작하는 듯 보입니다. 이게 왜 동작하는 건지 모르겠네요...

    // async await을 모두 제거했습니다.
    update({ productId, updateProductInput }) {
        const newProduct = {
          id: productId,
          ...updateProductInput,
        };
    
        return this.productRepository.save(newProduct);
      }
    @Mutation(() => Product)
      async updateProduct(
        @Args('productId') productId: string,
        @Args('updateProductInput') updateProductInput: UpdateProductInput,
      ) {
        await this.productService.checkSoldout({ productId });
        // 리턴을 받을 때도 기다리지 않고 바로 진행했습니다.
        return this.productService.update({ productId, updateProductInput });
      }

    이 때 서버를 돌리고 쿼리를 실행해보면 정상적으로 수행이 되는데(출력해보면 pending 상태입니다...) 이해가 잘 안되네요..

답변 1

0

안녕하세요. gigo96님

  1. 해당 로직에서 await를 제외할 시, 검증(checkSoldout())이 끝나는 것을 기다리지 않고, 다음 업데이트 로직을 실행하게 됩니다. 따라서 에러 핸들링이 제대로 되지 않은 채, 로직이 수행되게 됩니다. 따라서 검증을 하기 위해 await를 사용하여 해당 로직을 실행하여야 합니다.

  2. 해당 코드의 로직과 같이 내부 통신만을 필요할 때는 await를 사용하지 않아도 무방합니다. 다만 해당 데이터 값을 확인하기 위해서는 await를 사용해야 pending 상태 없이 값을 콘솔로 확인 가능합니다. 더불어 내부 통신만 하는 경우지만, 로직에 데이터 가공이 필요한 부분이 있다면 이 또한 await를 사용하여 다음 로직이 실행될 때 데이터를 잘 가져와 문제가 생기지 않도록 방지해 주셔야 합니다.

감사합니다.

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

죄송하지만 제가 잘 못 이해한것인지 2번 답변이 잘 이해가 되지 않습니다...

혹시 플레이그라운드에서 api 요청을 보내는 것도 내부 통신에 해당 되는 것인가요? 위 2번 코드로 서버를 실행시키고 플레이그라운드에서 api요청을 보내면 정상적으로 처리되어서 그게 조금 이상해서 질문을 드렸습니다!

제 생각으로는 2번 코드의 경우 api 요청을 보냈을 때 정상적으로 요청이 수행되지 않아야 된다고 생각했는데
스크린샷 2023-01-16 오후 12.40.48.png사진을 보면 정상적인 요청 수행이 이루어져서 이게 이해가 잘 안갔습니다.

아 그리고 pending 상태를 확인했던 것은 내부적으로 완료되었는지 아닌지 확인하기 위해서 잠깐 체크해봤던것입니다.

this.productRepository.save() 등의 모든 로직들은

  1. 정상수행하고

  2. 결과를 반환합니다.

이 과정에서 안에 들어있는 내용을 확인하고자 할 때에는, await로 기다려야 내부를 확인 가능합니다.
하지만, Nestjs에서는 외부로 나가는 return을 만나게 되면 Nestjs 자체적으로 await를 붙여 기다려주고 완료될 시, 밖으로 내보내 줍니다.

따라서, 브라우저나 플레이그라운드 등에서는 정상적인 결과를 확인할 수 있지만, 콘솔에서는 출력시 pending이 나오게 됩니다. 감사합니다.

gigo96님의 프로필 이미지
gigo96

작성한 질문수

질문하기