본문 바로가기
Dev-Code(Back-End)/NestJS

[NestJS] Entity 작성하기 (feat.TypeORM)

by 김밥맨이야 2023. 3. 15.
반응형

NestJS와 TypeORM을 사용하면서 가장 맘에 들었던 것은 '테이블을 따로 만들어가면서 개발을 하지 않아도된다는 것!' 이었다.

또한 TypeORM모듈에서 옵션값을 주면 Entity에서 정의한 내용을 바탕으로 DB에 테이블들을 생성해준다!

즉, 엔티티만 잘 작성하게되면 Table을 직접 컨트롤 할 일이 엄청나게 많이 줄어든다.

 

우선 Entity를 작성하기 위한 파일을 생성해 준다.

src 아래의 User모듈의 각 파일들을 모아둘 수 있는 폴더(User)를 만들고 그 안에 '모듈명.entity.ts' 이런식으로 파일을 생성한다. 추후 다른 모듈의 Entity를 작성 할 시 위의 규칙을 따라야 TypeORM에서 Entity파일들의 형식을 지정 해 줄 수 있다.

 

그리고 그 안에는 아래와 같은 내용을 우선 기입해준다.

import { BaseEntity, Entity} from 'typeorm';

@Entity('Users') // 생성할 테이블 명을 기입한다.
export class UsersEntity extends BaseEntity { // BaseEntity를 기반으로 Entity클래스를 작성
  
}

@Entity('테이블 명')에는 생성하고자하는 테이블명을 입력하면된다. 실제로 테이블의 이름으로 생성된다. 

 

테이블까지 정의 하였으니 이후로는 테이블안에 구성될 컬럼들을 정의한다.

 

우선 PK가 될 PrimaryColumn을 지정해보자

import { BaseEntity, Entity, PrimaryGeneratedColumn} from 'typeorm';

@Entity('Users')
export class UsersEntity extends BaseEntity {

    @PrimaryGeneratedColumn('uuid', { comment: '유저 UUID' })
    UserUUID:string;
    
}

위와같이 PK가 될 컬럼을 지정 할 수 있다. 어노테이션 다음의 단어들만 조금의 차이가 있고 @PrimaryGeneratedColumn컬럼 뒤의 컬럼 옵션은 대부분 동일한 위치에 쓸 수 있다. 

 

// 타입을 선언하는 방법을 다르게 가져갈 수 있다.
// 두개의 기능은 동일하다.
@PrimaryGeneratedColumn('uuid', { comment: '유저 UUID' })
UserUUID:string;
@PrimaryGeneratedColumn({ type: 'uuid', comment: '유저 UUID' })
UserUUID:string; 

// 일반적일 컬럼의 선언방법
@Column({ type: 'nvarchar', length: 100, comment: '주소' })

// 생성시간 등록방법
@CreateDateColumn({ type: 'datetime', comment: '등록시간' })

// 수정시간 등록방법
@UpdateDateColumn({ type: 'datetime', comment: '수정시간' })

// 삭제시간 등록방법
@DeleteDateColumn({ type: 'datetime', comment: '삭제시간', nullable: true })

 

각각의 상황별 컬럼 선언 방법을 적어보았다. 많이 쓰게되는 내용들로만 우선 적어보았으며 각각 컬럼의 Type과 Option들은 필요한대로 공식문서를 찾아보는 것을 추천한다.

 

위에 쓰여있는 컬럼 중 특이한 컬럼들은 CreateDateColumn, UpdateDateColumn, DeleteDateColumn이다.

 

먼저 CreateDateColumn을 선언하게되면 DTO를 이용하거나 다른 방법들을 이용하여 컬럼에 값을 집어넣어주지 않아도 데이터가 생성된 시점을 자동으로 기록해준다. 이로인해 굳이 시간을 가져오는 함수등을 쓰는 수고를 덜 수 있다.

 

다음으로 UpdateDateColumn은 데이터를 Update할때마다 시간을 기록해준다. 

 

DeleteDateColumn은 softDelete시 삭제된 시간을 기록한다. 이는 삭제방법이 삭제된 시간을 기록하여 삭제처리 하는 방법과 Row자체를 삭제하는 방법으로 나뉘기 때문에 존재하는 컬럼이라고 보면 된다.

 

TypeORM의 내장객체를 이용하여 데이터를 컨트롤 했을 때는 잘 작동했으나 쿼리빌더를 사용하면 잘 작동하는지는 사실 아직 잘 모르겠다. 나중에 한번 테스트를 해봐야겠다.

 

컬럼이 적으면 그래도 할만하지만  컬럼이 많으면 사실 이거 작성하는 것도 일이다.....

 

그래도 한번 적어놓으면 설계가 변경되거나 테이블 구조를 바꾸지 않는 이상 손댈일이 거의 없기도 하다.

 

 

Entity를 작성 하였으니 이와 관련하여 Entity의 형식을 빌려와 DTO를 만드는 방법도 있다. 

2023.02.02 - [Dev-Code(Back-End)/NestJS] - [NestJS] DTO 설정

 

 

 

반응형

댓글