본문 바로가기
Dev/Backend

[TypeScript/TypeORM] Entity.ts 작성하기

by haerr 2024. 7. 24.

TypeScript란?

JavaScript에 'Type'을 추가한 언어이다.

JavaScript는 동적 타입 언어로, 변수에 어떤 데이터 타입이 할당되는지 런타임 시에야 알 수 있다. 반면에 TypeScript는 컴파일 타임에 데이터 타입을 미리 정의할 수 있어, 코드의 가독성과 유지보수성을 높일 수 있고 typeError를 방지할 수 있다.

 

TypeORM이란?

JavaScript, TypeScript 환경에서 사용할 수 있는 ORM(Object-Realtional Mapping,관계형 데이터베이스와 프로그래밍 언어 사이의 데이터 변환을 다루는 프로그래밍 기법) 라이브러리이다. 

다양한 데이터베이스 엔진(MySQL, PostgreSQL, Oracle, SQL Server 등)을 지원한다.

쿼리를 작성하는 다양한 방법을 제공하며 일대일, 다대다와 같은 관계 관리도 쉽다. 쿼리를 직접 작성하지 않아도 되기 때문에 편하다는 것이 가장 큰 장점이다.


Entity.ts에 대해 말하기에 앞서 프로젝트 구조에 대해 설명해보겠다. (3 Layer Architecture에 대해서도 나중에 포스팅해야겠당)

 

oodd-server-nodejs
- dist
- node_modules
- src
  - entities
    - ootdLikeEntity.ts
    - userEntity.ts
    -postEntity.ts
    ...
  - ootdLike
    - dto
      - request.ts
      - response.ts
    - ootdLikeController.ts
    - ootdLikeService.ts
  - repositories
    - ootdLikeRepository.ts
    - userRepository.ts
  - user
  - app.module.ts
  - app.ts
  - data-source.ts
.gitignore
.prettierignore
.prettierrc
database.sqlite
package-lock.json
yarn.lock
tsconfig.json

 

조금 복잡해보일 수 있는데, src 디렉토리에만 집중을 해보면

entities, (여러 도메인들), repositores, app.module.ts, app.ts, data-source.ts

이러한 구조라는 것을 알 수 있고, 하나의 도메인은 dto, controller, service로 구성되어 있다.

 

데이터베이스의 테이블이 바로 엔티티이다. 따라서 entity.ts에서는 데이터베이스 테이블을 정의하는 엔티티 클래스를 작성한다.

 

//ootdLikeEntity.ts

import {Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn, CreateDateColumn, UpdateDateColumn, DeleteDateColumn} from 'typeorm';
import {User} from './userEntity';
import {Post} from './postEntity';

우선 가장 위에 필요한 것들을 import 한다.

 

@Entity('Likes')
export class Like {
  @PrimaryGeneratedColumn()
  id!: number;

  @ManyToOne(() => User, user => user.likes)
  @JoinColumn({name: 'userId'})
  user!: User;

  @ManyToOne(() => Post, post => post.likes)
  @JoinColumn({name: 'postId'})
  post!: Post;

  @Column()
  userId: number;

  @Column()
  postId: number;

  @CreateDateColumn()
  createdAt: Date;
}

 

@Entity

@Entity() 데코레이터는 이 클래스가 데이터베이스 테이블을 나타냄을 의미한다.

@Entity('Likes')는 이 엔티티의 데이터베이스 테이블 이름이 Likes임을 나타낸다.

 

@PrimaryGeneratedColumn

id 속성은 기본 키이며, 자동으로 생성된다.

id!처럼 뒤에 붙은 느낌표는 null이나 undefined가 아니라는 것을 의미한다. 아래 코드로 대체 가능하다.

@PrimaryGeneratedColumn('uuid')
  id: string;

 

@ManyToOne

다대일 관계를 나타낸다. 사용자 한 명이 여러 좋아요를 가질 수 있고, 게시물 하나에 여러 좋아요가 가능하므로 N:1 관계이다.

 

@Column

데이터베이스에서의 Attribute를 모두 작성한다. (위에서 작성한 것 제외)

 

@CreateDateColumn, UpdateDateColumn, DeleteDateColumn

테이블에서의 createdAt, UpdatedAt, DeletedAt을 구현할 때 사용하는 데코레이터이다.