[Nest] TypeORM Subscribe

ShinJuYong·2022년 6월 23일
1

Nest

목록 보기
10/13
post-thumbnail

왜썻니

기업협업을 진행중 강좌후기를 작성하면 강좌의 평균 별점과 강좌후기 작성자의 수가 올라가야하는데 이걸 기존 RDBMS에있는 Trigger처럼 쓰고싶엇다

  • 강좌 - 강좌리뷰
    강좌리뷰가 작성되면 강좌의 평균별점과 작성자가 늘어나야함
  • 결제 - 강좌 할인
    강좌가 판매되면 강좌할인이 선착순인경우 선착순을 줄이거나..등등

위 두 사례말고도 Trigger를 적용할만한곳이 많이보여 작업을 시작했다.

어떻게썻니

@EventSubscriber()
export class CourseReviewSubscriber
  // EntitySubscriberInterface를 상속받아 사용한다
  // (Generic Type을 CourseReview => 트리거를 지정할대상 )
  implements EntitySubscriberInterface<CourseReview>
{
  constructor(connection: Connection) {
    connection.subscribers.push(this);
  }

  // 코스리뷰를 Subscriber시킨다.
  listenTo() {
    return CourseReview;
  }

  // 리뷰가 작성되는 이벤트가 발생하면
  // 해당 이벤트가 작동한다.
  async beforeInsert(event: InsertEvent<CourseReview>) {
    // event.entity => Insert를 통해 들어온 Entity 정보가 담겨있다.
    const cid = event.entity.course.id;

    const courseReviews: [CourseReview[], number] = await getRepository(
      CourseReview,
    ).findAndCount({
      where: {
        course: {
          id: cid,
        },
      },
    });

    const courseReviewStarAvg = Math.ceil(
      courseReviews[0].reduce((acc, cur) => {
        return (acc += cur.reviewStar);
      }, event.entity.reviewStar) /
        (courseReviews[1] + 1),
    );

    // 위의 로직을 통과한후 Update시켜줌
    await getRepository(Course).update(
      { id: cid },
      { reviewScore: courseReviewStarAvg, reviewMany: courseReviews[1] + 1 },
    );
  }
@Module({
  imports: [
    TypeOrmModule.forFeature([
      CourseReview,
      Category,
      Course,
      UserCourse,
      User,
    ]),
  ],
  // 사용할곳에 Provider로 추가해준다.
  providers: [
    ...
    CourseReviewSubscriber,
    ...
  ],
})
export class CourseReviewModule {}

좋은 방법일지는 모르겠지만 위처럼 다양한곳에 Trigger를 적용시켜서
자동으로 처리된다면 유저나, 어드민이나 좋은 사용경험이 될거라 생각하기때문에 많은곳에 적용중이다

참고한곳


TypeORM Subscriber

TypeORM Subscriber GitBook

0개의 댓글