[NestJS] TypeORM Subscribers 기능
지난 시간에는 [NestJS] TypeORM — Relation, Transactions 를 살펴보았다. 이번 시간에는 사용하는 Entity 에 Event Subscriber 를 설정하여 사용하는 방법을 알아보도록 하겠다. Audit Log 에사용하면 좋은 기능이 될 거 같다.
TypeORM — Subscribers
TypeORM 에 Subscriber 기능으로 특정 Entity 의 Event Subscriber Decorator 를 사용하여 DML 전후로 이벤트 처리가 가능하다. 이 기능은 DBMS 상에 Trigger 를 거는 행위와 비슷한 기능인데 어떤 기능 인지 코드로 살펴보자.
지난 챕터 CRUD 를 작성하는 문서에서 User 엔티티를 정의하고 해당 엔티티 객체에 Respository 디자인 패턴으로 데이터 조작을 해보았다. 해당 User 엔티티의 Event Subscriber 구독을 위해 아래와 같은 파일과 코드를 작성해 보도록 하겠다.
src/user/domain/UserSubscriber.ts
import { Connection, EntitySubscriberInterface, EventSubscriber, InsertEvent } from 'typeorm/index';
import { User } from './User';@EventSubscriber()
export class UserSubscriber implements EntitySubscriberInterface<User> {
constructor(connection: Connection) {
connection.subscribers.push(this);
} listenTo() {
return User;
} **beforeInsert(event: InsertEvent<User>): Promise<any> | void {
console.log('User 테이블에 입력 전 : ', event.entity);
} afterInsert(event: InsertEvent<User>): Promise<any> | void {
console.log('User 테이블에 입력 후 : ', event.entity);
}**}
UserSubscriber 라는 클래스를 만들고 EventSubscriberInterface 인터페이스를 implement 하였다. 생성자를 통해 TypeORM 다이내믹 모듈을 통해 선언되었던 connection 객체의 의존성을 주입하고 해당 connection 을 통해 현재 선언한 클래스를 subscriber 로 등록 한다.
등록한 이후 listenTo 메서드를 오버라이드 하여 return 을 구독하고자 하는 Entity 객체로 리턴하고 어떤 Action 에 대한 이벤트를 통해 구독을 할 것인지 메서드로 정의한다. beforeInsert, beforeDelete, beforeUpdate 혹은 afterInsert, afeterDelete, afterUpdate 등 Entity 객체에 데이터를 조작하기 전과 후에 Event를 발생시킬 수 있고 해당 이벤트 안에 간단히 console.log 의 코드를 통해 작동 유무만 확인 해보도록 하겠다.
지난 번 만든 API 를 호출하고 User 엔티티에 값을 입력하여 로그를 확인을 해보도록 하겠다
콘솔에는 다음과 같이 User 테이블 입력 전과 후의 Event가 구독을 통해 작동되는 것을 확인할 수 있을 것이다. 이 예제를 통해 향후 특정 Entity 의 값의 상태와 이력을 위해 별도의 Audit Table 에 이력이 남도록 Event Trigger를 작성 할 수도 있을 것 같다.
굉장히 간단하지만 임팩트있는 기능 같다. 각 상황에 알맞게 사용하면 좋은 기능이 될 듯 하다.