Problem

typeorm을 이용해서 구현 시 updatedAtcreatedAt같은 컬럼을 대부분 엔티티에 공통으로 추가해주고 싶었다. sequelize1를 사용했을 때는 이부분을 자동으로 해줘서 상대적으로 편리 했었지만 typeorm에서는 직접 작업해 줘야 했다.

export class TimestampableEntity {
  @CreateDateColumn({
    type: 'timestamp',
    default: () => 'CURRENT_TIMESTAMP',
  })
  public createdAt: Date;

  @UpdateDateColumn({
    type: 'timestamp',
    default: () => 'CURRENT_TIMESTAMP',
  })
  public updatedAt: Date;
}

위와 같이 TimestampableEntity를 이를 구현하고 상속 받은 다른 엔티티들을 사용하고자 했다.

export class UserEntity extends TimestampableEntity {
  ...
}

동작은 했지만 createdAtupdatedAt이 모든 컬럼의 가장 앞쪽에 생성되는 되는 문제가 생겼다.

Solution

안타깝지만 방법은 없었다. 여기2에서 자세한 내용은 확인할 수 있었다. 항상 ORM만을 이용해서 작업 한다면 상관 없겠지만 (대부분 그렇지 않으므로) 직접 쿼리해야 하는 상황이라면, 중요 필드가 뒷쪽에 위치할 경우 그 만큼 가독성이 떨어질 수 밖에 없었다. typeorm에서는 정의한 순서대로 필드의 순서가 보장되는 것은 아니지만, 상위 엔티티의 필드가 가장 앞쪽에 위치하는 것이 싫다면 typeorminheritance는 사용지 말아야 한다.

References