NestJS+TypeORM one-to-one Relation에서 연관관계의 데이터 같이 삭제 및 보여주기 (feat. 나의 경험)

wonjun.Aden·2022년 12월 30일
0

TypeORM

목록 보기
1/3
post-thumbnail

글을 작성해야지 작성해야지 하다가 바쁘다는 핑계로 미루다가 드디어 작성해본다.
회사에서 이제 처음 NestJS를 도입하고 typeorm 관련되어 새로운 시도를 매일 하고 안되는 부분을 해결하려고 노력하고 있다.
그 중 첫번째로 내가 공유해보려고 하는 것은 테이블 간의 1:1 연관관계 속에서 데이터가 서로 같이 지워지게끔 cascade:true 옵션 관련하여 경험했던 부분을 공유해보려 한다.

문제점

typeorm의 one-to-one 관계에서 부모 엔티티를 삭제하면 자식 엔티티까지 삭제하는 방법을 찾아보고 있고
{cascase: true, onDelete: 'CASCADE'} 옵션 까지 다 넣었음.
이후 service단에서 delete(부모_idx)를 를 하였는데 부모 엔티티의 값은 지워졌지만 자식 엔티티의 연관된 값은 지워지지 않았음.

나는 모두 다 같이 지워지길 원했는데 부모 엔티티의 값만 지워진 것이다.

혼란했다.

구글 성님의 도움을 받으려고 온갖 키워드 조합을 하여 검색해 보았지만 원하는 답을 잘 나오지 않았다. ㅜㅜ
그래서 NestJS 슬랙 커뮤니티에 물어보았다.
다양한 의견이 오가던 중 @JoinColumn의 위치가 문제일 수도 있겠구나 라는 생각이 들었다.
그래서 바로 실행해보았다. 기존에는 부모 엔티티에 JoinColumn을 설정하였었는데 부모엔티티에서 빼고 자식 엔티티에 추가하여 설정해보았다.
아래와 같다.

해결방안

Before

부모 Entity
@OneToOne(
  () => Profile,
  (profile) => profile.user,
  {
    cascade: true,
    eager: true,
  },
)
@JoinColumn({ name: 'profile_idx' })
profile: Profile;
=========================
자식 Entity
@OneToOne(() => User, (user) => user.profile, {
  onDelete: 'CASCADE',
})
user: User;

After

부모 Entity
@OneToOne(
  () => Profile,
  (profile) => profile.user,
  {
    cascade: true,
    eager: true,
  },
)
profile: Profile;
=========================
자식 Entity
@OneToOne(() => User, (user) => user.profile, {
  onDelete: 'CASCADE',
})
@JoinColumn({ name: 'user_idx' })
user: User;

내가 바꾼거라곤 오직 JoinColumn의 위치였다. 부모쪽에서 자식쪽으로 위치를 바꾸니 부모의 값을 삭제하면 자식의 값도 삭제가 되었다.

Relationship에서 엔티티 설정하는 건 정말 중요하고 어렵다.
1:1 관계에서 부모 값을 지울때 자식의 데이터도 삭제하는 사례에서 나의 포스트가 조금이나마 도움이 되길 바라며 글을 작성했다.

다음 포스팅에선 TypeORM Migration 상황에서 Env파일이 분리되어 개발 환경에따라 migration 하는 DB의 정보도 다르게 하고 마이그레이션도 ENV파일에 따라 설정값이 달라지게 하는 방법에 대하여 간략하게 공유하려 한다. 하지만 아직 내가봐도 이렇게 하면 깔끔하지 못한데??? 라는 방식이라 아 이친구는 이렇게 시도해봤구나 라는 생각으로 봐주길 희ㅣㅣㅣㅣㅣ망해본당

그럼 이만!!! 오늘 하루도 롸이팅!!

profile
아프리카의 BackEnd Developer 장원준입니다.

0개의 댓글