작성
·
192
·
수정됨
0
//query-runner.decorator.ts
import {
ExecutionContext,
InternalServerErrorException,
createParamDecorator,
} from '@nestjs/common';
import { QueryRunner } from 'typeorm';
export const QueryRunnerDecorator = createParamDecorator(
(data: unknown, context: ExecutionContext): { qr: QueryRunner } => {
const req = context.switchToHttp().getRequest();
if (!req.queryRunner) {
throw new InternalServerErrorException('queryRunner가 없습니다.');
}
return {
qr: req.queryRunner,
};
},
);
//posts.controller.ts
@Post()
@UseGuards(AccessTokenGuard)
@UseInterceptors(TransactionInterceptoer)
async postPosts(
@User('id') userId: number,
@Body() body: CreatePostDto,
@QueryRunnerDecorator() qr: QueryRunner,
) {
.... 중략
}
트랜잭션을 interceptor로 관리하는것을 배워서 너무 유익하고 100점 만점의 100점 꿀팁이었습니다.
https://www.npmjs.com/package/typeorm-transactional
해당 라이브러리를 원래 사용 했으나, 마음에 들지 않았었는데 덕분에 interceptor로 대체 할 수 있을것 같습니다 좋은 강의 만들어 주셔서 감사합니다!
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
rhkdtjd_12님, 트랜잭션 관리에 대한 실습 과정에서 유익한 정보를 얻으신 것 같아 기쁩니다.
NestJS와 TypeORM을 활용한 TransactionInterceptor
의 구현 방법을 배운 것은,
프로젝트에서 트랜잭션을 보다 세련된 방법으로 관리할 수 있는 좋은 시작점이 될 것입니다.
제공해주신 코드에서 사용된 @QueryRunnerDecorator
는 커스텀 데코레이터를 통해 현재 요청의 queryRunner
를
가져오는 예제로 보입니다. 이러한 방식은 코드의 중복을 줄이고, 체계적인 트랜잭션 관리로 이어질 수 있습니다.
또한 언급해주신 ‘typeorm-transactional’ 라이브러리 대신 인터셉터를 활용하게 되신 것에 만족하신 듯 하여 기쁩니다.
앞으로도 NestJS를 활용한 백엔드 개발에서 깊이 있는 지식과 실질적인 팁들을 많이 얻으시길 바랍니다.
감사합니다!