Nest.js - Many to Many

크롱·2024년 10월 24일
1

Nest.js

목록 보기
9/15

단방향 Many to Many

하나의 블로그 post는 여러 tag들을 가질 수 있고
하나의 tag 또한 여러 post에 적용될 수 있으므로 Many to Many 이다
하지만 post 엔티티에만 tag를 가져야하므로 이는 단방향 Many to Many이다.

  • Many to Many 는 엔티티에 foreign key를 가질 수 없다
  • 그대신 중간다리 역할을 하는 새로운 테이블이 생기고, 이 곳에 post와 tag foriegn key가 존재한다


실습

import {
  Entity,
  ManyToMany,
  JoinTable,
} from 'typeorm';
import { Tag } from 'src/tags/tag.entity';

@Entity()
export class Post {
  
  ...
  
  @ManyToMany(() => Tag)
  @JoinTable()
  tags?: Tag[];
}

You need to define a decorator called join table, and this particular join table decorator must be put in an entity that is on the owning side of the relationship.
In our case, our post will be on the owning side of relationship because we want to fetch tags along with the post, as a part of the post.

단방향 Many to Many를 설정하기 위해선 owner side 엔티티에
@ManyToMany
@JoinTable()
데코레이터를 집어넣자.

단방향이므로 tag entity에는 Many to Many 안넣어도됨.



예제

예를들어 user가 새로운 post를 생성할때

만약 태그 자바스크립트를 붙이고싶으면 (tag 테이블에 이미 tag가 존재하다고 가정)
태그 table 안에
자스 id:1 라면
createPostDto 안에 tags:[1] 라고 가정해보자

그러면 이 post_tags_tag라는 새로운 테이블이 생기고, id가 잘 들어가있다.




양방향 Many to Many

post_tags_tag 테이블에는 post와 매칭된 tag가 함께 저장되어있다.
tag를 삭제할때, 해당 tag를 사용한 post는 당연히 삭제되지않지만 post_tags_tag 테이블에는 삭제됐으면 할때 tag-post 를 양방향 Many to Many로 만들어야한다.
tag 엔티티에 @ManyToMany를 사용하여 post 엔티티를 추가하자.

tag 엔티티는 joinTable 데코레이터가없어서 owner가 아니므로
👇tag 삭제할때 onDelete:'CASCADE' 해줘야함👇

이제 삭제를해보자


tag 테이블에 1,3 id를 가진 2개의 tag가 있다


post 테이블에 21,22 아이디를 가진 post들이 있는데
처음 생성할때 두 post에 tag 1,3을 넣어줬기때문에 중간테이블에 저렇게 기록되어있다


✍ id=1 인 tag를 삭제했다.

tag 테이블과 중간테이블에 잘 삭제되었다.




soft delete

엔티티에서 @DeleteDateColumn 이라는 컬럼과 보통 사용되는 softDelete
db에 완전히 삭제되지않고, 위 @DeleteDateColumn을 설정해둔 db컬럼에 언제삭제됐는지 timestamp만 기록되게 하는 것이다. 또한 중간테이블에도 db가 삭제되지않는다.
예를들어 id가 3인 tag를 softdelete 한다면 그냥 delete와 다르게 위에 post_tags_tag 에도 남아있다.

+ service 파일에서 softDelete이란 메소드를 사용해야한다.

profile
👩‍💻안녕하세요🌞

0개의 댓글

Powered by GraphCDN, the GraphQL CDN