작성
·
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님, tap
과 mergeMap
을 사용하는 데 있어 발생하는 문제에 대해 설명해드리겠습니다.
tap
연산자는 주어진 값에 대해 부수효과를 일으키는 데에 사용되며, 실제 값의 흐름에는 관여하지 않습니다. 즉, async/await
를 사용하여 비동기 작업을 실행할 경우, tap
내의 비동기 작업이 완료되기 전에 다음 연산자로 넘어갈 수 있습니다. 이러한 이유로 tap
안에서 async/await
를 사용할 때 트랜잭션 커밋이 기대대로 작동하지 않을 수 있습니다.
반면에, mergeMap
은 내부에서의 비동기 작업이 완료될 때까지 값을 병합하여 전달하는 역할을 합니다. mergeMap
을 사용하면 비동기 작업이 완료된 후에 다음 단계로 넘어가므로, tap
대신 mergeMap
이 정상적으로 작동하는 원인이 됩니다.
또한, 에러 메시지에서 TransactionInterceptor
가 적용되어야 한다는 것을 확인할 수 있는데, 이는 QueryRunner
커스텀 데코레이터와 관련된 설정 문제일 수 있습니다.
아래의 문서를 참고하여 asynchronous query에 대한 더 많은 정보를 얻으실 수 있습니다:
spring의 asynchronous method running capability 관련 문서
질문하신 내용과 실습을 진행하시면서 도움이 되시길 바랍니다. 추가적으로 궁금한 점이 있으시다면 언제든지 문의해 주세요.