본문 바로가기

entity 작성 / OneToOne || OneToMany & ManyToOne || ManyToMany / 관계도 MySQL 적용 본문

개발/nest.js

entity 작성 / OneToOne || OneToMany & ManyToOne || ManyToMany / 관계도 MySQL 적용

자전하는명왕성 2023. 2. 4. 01:22

 

오늘은 저번에 업로드한 ERD를 기준으로 MySQL에 엔티티를 적용해보았다.

// 상품 / product.entity.ts

@Entity() // 엔티티 임을 선언
export class Product {
  @PrimaryGeneratedColumn('uuid') // uuid 를 통해 id 생성
  id: string;

  @Column()
  product_Name: string;

// 중략 //
}

엔티티 작성은 다음과 같다.

데코레이션을 통해 Entity 를 선언하고, 

PrimaryGeneratedColumn 을 통해 PK임을 선언함과 동시에

임의의 id 를 만드는 uuid 를 생성한다.

그리고 그 아래로 콜론 값으로 들어오는 엔티티를 각 타입에 맞추어 작성해준다.

 

관계 작성

다음은 관계 작성에 대해 다룬다.

TypeORM 에는 아래 질의문을 통해 관계를 설정해줄 수 있다.

  • OneToOne
  • OneToMany / ManyToOne
  • ManyToMany

 

OneToOne ( = 일대일 관계)

https://typeorm.io/one-to-one-relations 

오늘 실습에서는 다루지 않았던 내용이라 typeORM 독스에 나와있는 내용으로 대체한다.

// A.ts
@Entity()
export class A {
    @PrimaryGeneratedColumn()
    id: number
    // 중략 //
}

// B.ts
@Entity()
export class B {
    @PrimaryGeneratedColumn()
    id: number
    
	// 중략 // 
    
    @OneToOne(() => A)
    @JoinColumn()
    a : A
}

// A : id
// B : id , A(FK)

일대일 관계에서는 B 에서 OneToOne / JoinColumn 을 사용하여 A의 인스턴스를 포함할 수 있다.

 

OneToMany / ManyToOne (일대다 다대일 관계)

일대다 다대일 관계는 A가 B의 여러 인스턴스를 포함하지만, B는 A의 이느턴스를 하나만 포함하는 관계다.

// A.ts
@Entity()
export class A {
    @PrimaryGeneratedColumn()
    id: number
    // 중략 //
    
    @ManyToOne(()=> B, (b) => b.a)
    b: B
}

// B.ts
@Entity()
export class B {
    @PrimaryGeneratedColumn()
    id: number
    
	// 중략 // 
    
    @OneToMany(() => A, (a) => b.a)
    a : A[] // A 안의 many 를 가져오기 위한 '[]'
}

// A : id, B(FK)
// B : id

중요한 점은 ManyToOne / OneToMany 에서는 @joinColumn 을 생략할 수 있다.

** One 인 B가 A의 인스턴트로 자연스레 참조

 

실습에서 product 와 productCategory 를 다대일로 연결한 모습

OneToMany 는 단독으로 사용할 수 없지만, ManyToOne은 단독 사용이 가능한 것 같다.

 

ManyToMany (다대다)

다대다 관계는 A가 B의 여러 인스턴스를 포함하고, B가 A의 여러 인스턴스를 포함하는 관계다.

// A.ts
@Entity()
export class A {
    @PrimaryGeneratedColumn()
    id: number
    // 중략 //
	
    @JoinTable()
    @ManyToMany(() => B, (b) => b.a)
    b: B[]	// B안의 'many'를 가져오기 위한 '[]' 사용
}

// B.ts
@Entity()
export class B {
    @PrimaryGeneratedColumn()
    id: number
    
	// 중략 // 
    
    @ManyToMany(() => A, (a) => b.a)
    a : A[] // A 안의 many 를 가져오기 위한 '[]'
}

// A : id
// B : id
// A_B : A_id, B_id

ManyToMany 관계에서는 @JoinTable() 이 필요하다. 

** 새로운 테이블을 생성하여 중간 테이블을 만듦으로써 일대다 / 일대다 관계로 관리할 수 있음

실습에서 product 와 productAllergy 를 다대다로 연결한 모습

 

MySQL 내에서 확인할 수 있는 엔티티 관계도

'개발 > nest.js' 카테고리의 다른 글

NestJs - Join API 구현  (0) 2023.02.09
NestJS - CRUD / TypeORM  (0) 2023.02.07
집계 & 정렬 & 서브 쿼리  (0) 2023.02.04
nestJS - MySQL과의 연동  (0) 2023.02.01
typeScript Generic / Utility  (1) 2023.01.31
Comments