백엔드 17일차

이동현·2023년 4월 5일
0

코드캠프 백엔드

목록 보기
15/29

1. TypeORM & Entity

1) 1 : 1 테이블 생성

// product.entity.ts
import { ProductSaleslocation } from 'src/apis/productsSaleslocations/entities/productSaleslocation.entity';
import { Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Product {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  name: string;

  @Column()
  description: string;

  @Column()
  price: number;

  @Column()
  isSoldout: boolean;

  @JoinColumn()
  @OneToOne(() => ProductSaleslocation)
  productSaleslocation: ProductSaleslocation;

}
  • @OneToOne() : 두 테이블의 관계를 나타내는 것으로 @OneToOne( ) 은 한쪽에만 쓰거나, 양쪽에 모두 써줄 수 있습니다. 여기서는 Product에만 써주겠습니다.
  • @JoinColumn() : 두 테이블을 하나로 합쳐서 데이터를 가져와야하기에 사용하였으며, 한쪽 테이블에만 적어줘야 합니다.

2) N : 1 테이블 생성

// product.entity.ts
import { ProductSaleslocation } from 'src/apis/productsSaleslocations/entities/productSaleslocation.entity';
import { Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Product {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  name: string;

  @Column()
  description: string;

  @Column()
  price: number;

  @Column()
  isSoldout: boolean;

  @JoinColumn()
  @OneToOne(() => ProductSaleslocation)
  productSaleslocation: ProductSaleslocation;

  @ManyToOne(() => ProductCategory)
  productCategory: ProductCategory;
}
  • @JoinColumn() : Many 부분에 해당하는 테이블(product)에서는 JoinColumn( ) 이 생략 가능합니다.
    • @ManyToOne( ) : @JoinColumn( ) 생략가능
    • @OneToOne( ) : @JoinColumn( ) 반드시 필요

3) N : M

// prodcutTag.entity.ts

import { Product } from 'src/apis/products/entities/product.entity';
import { Column, Entity, ManyToMany, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class ProductTag {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  name: string;

  @ManyToMany(() => Product, (products) => products.productTags)
  products: Product[];
}
  • @ManyToMany() : N :M의 관계를 가질 때는 두 테이블 모두 컬럼을 추가하여 연결해 주어야 합니다.
  • (products) => products.productTags : products 입장에서의 productTags 와의 관계를 명시해 준 것으로, N : M 관계에서는 두 테이블 모두 관계를 나타내 주어야합니다.
  • Product[] : 하나의 태그에 상품이 여러개 해당될 수 있기에 배열로 나타내는 것 입니다.
// product.entity.ts
import { ProductSaleslocation } from 'src/apis/productsSaleslocations/entities/productSaleslocation.entity';
import { Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Product {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  name: string;

  @Column()
  description: string;

  @Column()
  price: number;

  @Column()
  isSoldout: boolean;

  @JoinColumn()
  @OneToOne(() => ProductSaleslocation)
  productSaleslocation: ProductSaleslocation;

  @ManyToOne(() => ProductCategory)
  productCategory: ProductCategory;

  @JoinTable()
  @ManyToMany(() => ProductTag, (productTags) => productTags.products)
  productTags: ProductTag[];
}

@JoinTable() : N : M 관계에서 생성되는 중간 테이블을 자동으로 만들어 주는 것으로 기준이 되는 테이블 한 쪽에만 작성해주면 됩니다.

4) N:M 테이블을 직접 만드는 경우

JoinTable과 ManyToMany를 사용하여 자동으로 중간테이블이 생기게끔 할 수 있지만,
N : M 테이블에 추가적인 데이터 컬럼들이 필요할 때는 직접 만들어줘야 합니다.
단, 직접 만들때는 N:1 + N:1 로 각각 연결을 해주셔야 합니다!!

2. Dbeaver를 사용한 테이블 확인

  • 데이터 베이스 조회하기
    => show databases;

  • 원하는 데이터베이스 사용하기
    => use myproject;

  • 해당 데이터베이스의 테이블 조회하기
    => show tables;

  • 해당 테이블 조회하기
    => desc product;

  • 데이터 조회하기
    => select * from product;

  • 데이터 생성하기
    => insert into product(id, name, description, price, isSoldout) values(uuid(), '마우스', '좋은 마우스', 1000, false);

  • 데이터 수정하기
    => update product
    set name = '마우스'
    where description = '정말 좋은 마우스입니다!!!';
    // where : 조건 지정 할 때 사용됩니다.

  • 데이터 연결하기
    => update product
    set productSaleslocationId = 'b676a1ae-cb8c-11ec-95e6-6f6cd1d3adeb'
    where id = '93e8dbda-cb8b-11ec-95e6-6f6cd1d3adeb'
    ;

  • 오름차순
    => select name, price, isSoldout
    from product
    order by price asc;

  • 내림차순
    => select name, price, isSoldout
    from product
    order by price desc;

0개의 댓글