[Clone Coding] What I Learn 3 : TypeScript - Enum and TypeORM

먹보·2023년 1월 29일
0

MUK_BO's Clone Coding

목록 보기
3/7

오늘은 USER CRUD를 생성하는 와중 배운 새로운 지식에 대해서 공유해보려고 한다.

✍ <기술 스택>

  • Programming Language
    TypeScript
  • Framework
    NestJS
  • API 설계
    GraphQL and Apollo
  • Database & Relevant
    PostgresQL & TypeORM

✍ TypeScript Enum

📝 Enum이란..

자바스크립트 이외에 자바와 C 그리고 python등을 사용해봤던 프로그래머들이라면 enum에 대해서 꽤 익숙하게 들어봤을 것이다만 자바스크립트를 사용했었던 사람이라면 다음과 같이 Object.freeze(obj)를 써봤을 것이다.

let obj = { name: "John", age: 30 };

// Freeze the object
Object.freeze(obj);

// Try to modify the object
obj.name = "Jane"; // This will have no effect
obj.newProp = "new value"; // This will have no effect

// Output the object
console.log(obj); // { name: "John", age: 30 }

사실 위 처럼 사용해도 크게 상관은 없지만 타입스크립트는 다른 언어를 공부했던 사람들에게 조금 더 친근감을 주고자 enum을 도입한 것 같다.

여기서 enum이란

여러 값들에 미리 이름을 정의하여 열거해 두고 사용하는 타입이다.

!! 미리 정의를 해두었기 떄문에 추후에 수정이 불가능하다.

enum사용법은 타입스크립트의 가이드를 참고하자!

📝 Enum의 장점

  1. 분야별로 사용되는 상수 값들을 명확하게 사용하기 위해서
  2. 휴먼 에러를 줄이기 위해서
    사실 enum은 함수를 설계할 때 쓰이는 로직같은 것이 아닌 설계 방식 이기 때문에 가독성 면 이외에는 큰 영향이 없고 개발자마다의 성향에 따라 쓰이기도 하고 안쓰이기도 한다.

📝 Enum의 단점

크게 단점은 없어보이나 검색을 해본 결과, TypeScript => JavsScript로 Compile 되면서 Tree Shaking 관련 문제가 발생한다고 하지만 아직 거기까지의 응용력이 부족하기에 우선 참고만 해보고 나중에 직접적으로 문제가 생기면 지켜보려고 한다.

Enum의 문제

✍ Commom Module on NestJS

NestJS에서의 Common Module이란 글로벌적으로 사용될 Service, Entity, 그리고 Dto를 의미한다.

✍ Simple TypeORM Usage

  • find() : get과 의미가 비슷하다고 보면 된다.
  • findOne({where : {condition}}) : condition과 일치하는 데이터만 반환
  • @CreateDateColumn() : 연결된 데이터 값이 입력되자마자 자동으로 현 시간이 입력됨
  • @UpdateDateColumn() : 연결된 데이터 값이 수정되자마자 자동으로 현 시간이 입력됨
  • @DeleteDateColumn() : 연결된 데이터 값이 삭제되자마자 자동으로 현 시간이 입력됨
import { Entity, PrimaryColumn, Column } from "typeorm"

@Entity()
export class Thing {
    @PrimaryColumn()
    id: number

    @Column("point")
    point: string

    @Column("linestring")
    linestring: string
}

...
  • @BeforeInsert() / @AfterInsert() : BeforeInsertAfterInsert는 상황에 따라 실행될 함수에 적는 decorator로써 Insert의 앞 수식어에 맞게 entity가 입력됨에 따라 작동 된다.
    예제를 통해 알아보자
import { Entity, Column, BeforeInsert } from "typeorm";
@Entity()
class User {
  
  @Column()
    email: string;
  
  @Column()
    password: string;

    @BeforeInsert()
    hashPassword() {
        this.password = bcrypt.hashSync(this.password, 10);
    }

=> 위 상황에서는 패스워드가 데이터 베이스에 입력이 되기 전에 해시 될 수 있도록 설정 되는 함수가 실행될 것이다.

import { Entity, Column, AfterInsert } from "typeorm";

@Entity()
class User {
  
  @Column()
    email: string;

  @AfterInsert()
    sendWelcomeEmail() {
        sendEmail(this.email, "Welcome to our app!");
    }
}

=> 위 상황에서는 데이터 베이스에 이메일이 입력된 후에 입력된 이메일로 환영 이메일이 보내 질 것이다.

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글