기업협업을 진행중 강좌후기를 작성하면 강좌의 평균 별점과 강좌후기 작성자의 수가 올라가야하는데 이걸 기존 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
를 적용시켜서
자동으로 처리된다면 유저나, 어드민이나 좋은 사용경험이 될거라 생각하기때문에 많은곳에 적용중이다