Day3 - Entity

RINM·2022년 12월 29일
0

NextJS - Reddit Clone

목록 보기
3/9
post-thumbnail
  • Users: 사용자
  • Subs: 레딧의 서브커뮤니티
  • Posts: 게시물
  • Votes: 게시물과 댓글의 투표 기능
  • Comments: 게시물의 댓글

모듈

  • bcryptjs: 암호화 모듈. 패스워드 관리에 이용
  • classs-validator: 데코레이터 요청의 유효성 검사
  • class-transformer: plain 객체를 클래스의 인스턴스로 변환, 혹은 그 반대 변환
  • transliteration: Post 페이지 구성에 필요한 slug 생성하는 slugify 이용. 한글 지원.

Base Entity

id, createdAt, updatedAt 등 모든 엔티티에 공통된 속성을 따로 생성
다른 엔티티는 베이스 엔티티를 상속받아 사용

import { BaseEntity, CreateDateColumn, PrimaryGeneratedColumn, UpdateDateColumn } from "typeorm";

export default abstract class Entity extends BaseEntity{
    @PrimaryGeneratedColumn()
    id: number;

    @CreateDateColumn()
    createdAt: Date;

    @UpdateDateColumn()
    updatedAt: Date;
}

Relations

One To Many

Entity A가 Entity B의 인스턴스 여러개와 연관되는 경우 관계의 소유는 Entity B이며 Entity A의 Id를 저장한다.

@OneToMany(()=> Post, (post)=>post.user)
posts: Post[]

Many To One

Entity C가 오로지 하나의 Entity D 인스턴스와 연관되는 경우 관계의 소유는 Entity C이며 Entity D의 Id를 저장한다.

@JoinColumn()

관계에서 어느 쪽이 외래키(FK)를 가지고 있는지 표시
typeorm 데코레이터에서는 OneToOne일 때 필수

    @ManyToOne(()=>User)
    @JoinColumn({name: 'username',referencedColumnName:'username'})
    user: User;
  • name: 외래 키 이름, default: propertyName+referencedColumnName
  • referencedColumnName: 참조 엔티티의 참조 속성 이름, default: id
  • 둘 다 설정 안 하는 경우: FK속성명+id (ex: user_id)

Class-Transformer Decorator

엔티티 생성 시 상태와 행위를 정의하여 프론트엔드에서 사용할 수 있다.

@Expose

주로 getter와 다른 method를 노출

import {Expose} from 'class-transformer'

export class User{
  	id: number;
  	firstName: string;
  	lastName: string;
  	
	@Expose()
  	get name(){
    	return this.firstName+' '+this.lastName;
    }
}

@Exclude

property 변환시 건너뛰어 형 변환 결과에는 담기지 않는다. 즉, 프론트엔드에서 사용 불가능

import {Exclude} from 'class-transformer'

export class User{
	id: number;
  	email: string;
  
  	@Exclude()
  	password: string
}

0개의 댓글