You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
namespace가 존재하지 않는다면 만들어주며, 존재한다면 기존의 namespace를 가져온다.
주입받은 EntityManager인 em을 현재 namespace.active.plandarEntityManager 로 설정해준다.
TransactionManager
이 클래스의 getEntityManager()를 통해 EntityManager를 가져온다.
// common/transaction.manager.tsimport{Injectable,InternalServerErrorException}from'@nestjs/common';import{createNamespace,getNamespace}from'cls-hooked';import{EntityManager}from'typeorm';import{PLANDAR_ENTITY_MANAGER,PLANDAR_NAMESPACE}from'@/utils/constants';
@Injectable()exportclassTransactionManager{getEntityManager(): EntityManager{constnameSpace=getNamespace(PLANDAR_NAMESPACE)??createNamespace(PLANDAR_NAMESPACE);if(!nameSpace)thrownewInternalServerErrorException(`${PLANDAR_NAMESPACE} is not active`,);returnnameSpace.get(PLANDAR_ENTITY_MANAGER);}}
TransactionManager 객체인 txManager 에 대해, txManager.getEntityManager() 를 통해 미들웨어에서 설정해준 entityManager를 가져온다.
// common/decorator/transaction.decorator.tsimport{InternalServerErrorException}from'@nestjs/common';import{getNamespace}from'cls-hooked';import{EntityManager}from'typeorm';import{PLANDAR_ENTITY_MANAGER,PLANDAR_NAMESPACE}from'@/utils/constants';exportfunctionTransactional(){returnfunction(_target: object,_propertyKey: string|symbol,descriptor: TypedPropertyDescriptor<any>,){constoriginMethod=descriptor.value;asyncfunctiontransactionWrapped(...args: unknown[]){constnameSpace=getNamespace(PLANDAR_NAMESPACE);if(!nameSpace||!nameSpace.active)thrownewInternalServerErrorException(`${PLANDAR_NAMESPACE} is not active`,);constem=nameSpace.get(PLANDAR_ENTITY_MANAGER)asEntityManager;if(!em)thrownewInternalServerErrorException(`Could not find EntityManager in ${PLANDAR_NAMESPACE} nameSpace`,);returnawaitem.transaction(async(tx: EntityManager)=>{nameSpace.set<EntityManager>(PLANDAR_ENTITY_MANAGER,tx);// 1returnawaitoriginMethod.apply(this,args);// 2});}descriptor.value=transactionWrapped;};}
namespace.active.plandarEntityManager에 tx를 할당해준다.
트랜잭션 안(em.transaction의 callback 함수)에서 service 함수를 수행해준다.
TypeORM 트랜잭션
Transaction을 위한 키값
namespace와 관련된 key값들
TransactionMiddleware
매 요청 전에 수행될 미들웨어
em
을 현재 namespace.active.plandarEntityManager 로 설정해준다.TransactionManager
이 클래스의
getEntityManager()
를 통해 EntityManager를 가져온다.TransactionManager 객체인
txManager
에 대해,txManager.getEntityManager()
를 통해 미들웨어에서 설정해준 entityManager를 가져온다.@transactional()
service의 함수에 이 데코레이터를 사용하면 해당 함수를 트랜잭션으로 묶이게 해준다.
namespace.active.plandarEntityManager
에tx
를 할당해준다.em.transaction
의 callback 함수)에서 service 함수를 수행해준다.RootRepository
각 Repository를 구현할 때 이 RootRepository를 상속해주어야 한다.
Repository
를 상속받아 Service에서도 각 Repository를 이용해 TypeORM의 메소드들을 사용할 수 있게 해준다.this.getRepo()
를 통해 쿼리를 수행할 수 있다.RootRepository를 상속받은 UserRepository
RootRepository<Entity 이름>
을 해주어야 한다.getName()
함수를 위와 같이 구현해주어야 한다.UserService
아래처럼 TypeORM의 함수들을 사용할 수도 있으며,
@Transactional()
을 이용해 트랜잭션으로 함수를 관리할 수 있다.RootRepository
에서TypeORM의
Repository를 상속했기 때문에
UserRepository에서 구현하지 않은
find()` 함수를 사용할 수 있다.@Transactional()
을 통해 해당 service 함수를 transaction으로 만들어준다.@Transactional()
에서 다른@Transactional()
을 호출한다면, 후자의@Transactional()
은 세이브포인트로 동작한다.The text was updated successfully, but these errors were encountered: