[TypeORM] SubScriber에서 camel Case 방식 칼럼값 업데이트 시 QueryFailedError: column does not exist 발생 시

좋아요 API를 구현하고, 테스트 하던 중 아래와 같이 Column "likecount" does not exist 에러가 발생하였다.

Columns not Exist 에러 로그를 보면 column 이름이 lowercase 처리되어있음을 확인할 수 있다.

그런데 해당 칼럼은 스토리 테이블에 존재하는 칼럼이다.

왜 있는데 Column을 찾지를 못하니.....

아래와 같이 TypeORM의 EntitySubscriberInterface를 implement해서 LikeSubScriber를 구현하였는데 afterInsert와 InsertEvent<Entity>를 통해 Like 테이블에 새로운 row가 추가될 때마다 Story 테이블의 해당 스토리 likeCount 칼럼에 +=1을 하는 방식으로 해당 이슈를 참고하여 구현하였다.

 

How can I incr/decr a value? · Issue #680 · typeorm/typeorm

How can I increase a value by one in one step? Seems that updateById can not do this. Can I do that by using queryBuider? Thanks.

github.com

async afterInsert(event: InsertEvent<Like>) {
    const manager = this.connection.manager;
    const like = event.entity;

    await manager
      .createQueryBuilder()
      .update(Story)
      .set({ likeCount: () => 'likeCount + 1' })
      .where('id = :id', { id: like.storyId })
      .execute();

    const story = await manager.findOne(Story, like.storyId);
    await manager.save(Notification, {
      type: NotificationType.LIKE,
      targetId: story.userId, // 알림 받는 유저 ID
      title: `${story.id}`,
      body: '',
      userId: like.userId, // 알림을 보낸 유저 ID
    });
  }

위와 같이 구현하였을 때, QueryFailedError: column "likecount" does not exist가 발생하는데 에러난 쿼리를 로그로 확인해보면 아래와 같았다.

에러 로그에 나온 쿼리를 살펴보면 이상하게 SET "likeCount" = likeCount + 1 부분에서 뒤의 likeCount에는 "" 처리가 안되어 있고, 쿼리에서와 달리 에러 로그에서는 칼럼값이 모두 lowercase로 변경되어있었다.

해당 관련 TypeORM 문서를 찾아보니, .set({() => "" }) 관련 예시에는 아래처럼 소문자로만 칼럼명이 구성되어있다.

업데이트되는 칼럼명이 소문자로만 구성되어있다.

혹시나해서 칼럼명을 소문자로만 구성시, 에러발생 여부에 대해 체크해보기 위해 likeCount 칼럼명을 likecount로 변경하였더니 해당 QueryFailed Error가 발생하지않았다. 입력되는 쿼리를 체크해보니 다음과 같이 정상적으로 작동하였다.

PostgreSQL에서 camelCase 방식의 칼럼 값을 lowercase로 전환하는 것 같아 아래와 같이 처리하였다. 

 await manager
      .createQueryBuilder()
      .update(Story)
      .set({ likeCount: () => '"likeCount" + 1' })
      .where('id = :id', { id: like.storyId })
      .execute();

위의 코드에서 볼 수 있듯이 'likeCount + 1'에서 likeCount의 값을 따로 분리하여 ""으로 한 번 더 처리하니 QueryFailedError 없이 정상적으로 SubScriber가 작동하였다.