강의

멘토링

로드맵

Inflearn brand logo image

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

ssavengers님의 프로필 이미지
ssavengers

작성한 질문수

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

QueryRunner 커스텀 데코레이터 만들기 & Transaction Interceptor 적용하기

tap() 안에서 async/await 쓸 때 트랜잭션 커밋이 제대로 안 되는 이유가 궁금합니다.

작성

·

81

0

코드팩토리 디스코드에 질문하면 더욱 빠르게 질문을 받아 볼 수 있습니다!

[코드팩토리 디스코드]
https://inf.run/54jjz

 

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

QueryRunner 커스텀 데코레이터 만들기 듣고 있는데

강의대로

return next.handle().pipe(

  catchError(async (e) => {

    await qr.rollbackTransaction();

    await qr.release();

    throw new InternalServerErrorException(e.message);

  }),

  tap(async () => {

    await qr.commitTransaction();

    await qr.release();

  }),

);

이렇게 코드를 짜면
포스트맨에서 응답으로
{

"message": "QueryRunner Decorator를 사용할려면 TransactionInterceptor를 적용해야 합니다.",

"error": "Internal Server Error",

"statusCode": 500

}

이렇게 나옵니다. 그래서 tap 대신에

mergeMap(async (value) => {

await qr.commitTransaction();

await qr.release();

return value;

}),

 

merge맵을 사용하면 문제가 해결되는데

강의에서는 tap을 써도 트랜잭션 커밋이 잘 되는 것처럼 보였는데, 설명 부탁드립니다.

답변 2

0

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

안녕하세요!

코드가 같은데 안되는 경우일 확률은 매우 낮을걸로 예상됩니다.

실제로 TransactionInterceptor를 적용 안하신 경우는 아닌가요?

제 코드랑 비교해서 어떤점이 다른지 확인 해보신 후 (말씀하신 위치는 아닐걸로 예상됩니다) 다시 질문 주시면 답변 드리겠습니다.

감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다.
ssavengers님, tapmergeMap을 사용하는 데 있어 발생하는 문제에 대해 설명해드리겠습니다.

tap 연산자는 주어진 값에 대해 부수효과를 일으키는 데에 사용되며, 실제 값의 흐름에는 관여하지 않습니다. 즉, async/await를 사용하여 비동기 작업을 실행할 경우, tap 내의 비동기 작업이 완료되기 전에 다음 연산자로 넘어갈 수 있습니다. 이러한 이유로 tap 안에서 async/await를 사용할 때 트랜잭션 커밋이 기대대로 작동하지 않을 수 있습니다.

반면에, mergeMap은 내부에서의 비동기 작업이 완료될 때까지 값을 병합하여 전달하는 역할을 합니다. mergeMap을 사용하면 비동기 작업이 완료된 후에 다음 단계로 넘어가므로, tap 대신 mergeMap이 정상적으로 작동하는 원인이 됩니다.

또한, 에러 메시지에서 TransactionInterceptor가 적용되어야 한다는 것을 확인할 수 있는데, 이는 QueryRunner 커스텀 데코레이터와 관련된 설정 문제일 수 있습니다.

아래의 문서를 참고하여 asynchronous query에 대한 더 많은 정보를 얻으실 수 있습니다:
spring의 asynchronous method running capability 관련 문서

질문하신 내용과 실습을 진행하시면서 도움이 되시길 바랍니다. 추가적으로 궁금한 점이 있으시다면 언제든지 문의해 주세요.

ssavengers님의 프로필 이미지
ssavengers

작성한 질문수

질문하기