우리 사이트는 유저가 탈퇴하더라도 유저가 작성한 리뷰나 글은 사이트에 남도록 기획하였다. 그래서 DB를 짤때부터 CASCADE는 RESTRICT로 설정하였다.
그리고 유저는 탈퇴하더라도 유저의 row를 삭제하지 않고 deletedAt에 해당 탈퇴한 날짜를 추가하도록 하는 soft delete를 하였다.
기존 코드 :
// user entity
@Entity('users', { schema: 'dimelo' })
export class Users extends BaseEntity {
...
@DeleteDateColumn()
deletedAt: Date | null;
// 탈퇴 로직
await this.usersRepository.softDelete({ id: user.id, deletedAt: null });
typeOrm에서는 DeleteDateColumn()으로 soft delte를 구현할 수 있도록 하였다. 그리고 유저탈퇴를 할때는 softDelete()에 탈퇴할 user id를 넣어 호출하면 deletedAt 컬럼에 자동으로 날짜를 추가할 수 있다.
하지만 이렇게 했더니 탈퇴한 유저가 작성한 게시글을 불러올 수가 없었다. CASCADE는 RESTRICT로 했음에도 typeorm soft delete를 이용하니 탈퇴한 유저는 참조가 안될 뿐더러 해당 글까지 참조가 안되었다.
https://orkhan.gitbook.io/typeorm/docs/delete-query-builder#soft-delete
typeOrm에서 제공하는 DeleteDateColumn()을 쓰지 않고 내가 직접 deletedAt컬럼을 만들어서 유저가 탈퇴를 하면 날짜를 추가하는 방식으로 고쳤다.
수정한 코드:
// user entity
@Column('date', { name: 'deleted_at', nullable: true })
deletedAt: Date | null;
// 탈퇴로직
const found = await this.usersRepository.findOne({
id: user.id,
deletedAt: null,
});
found.deletedAt = new Date();
await this.usersRepository.save(found);
이렇게 수정하니 탈퇴한 유저라도 유저가 쓴 글 게시글은 그대로 받아올 수 있었다. 로그인을 할때는 deletedAt: null인 유저들을 참조하면 된다.
가끔은 Orm의 모호함이 개발하는데 불편함을 가져오는것 같다..