-
[Nest.js]Module, Table, Entity Setting사부작사부작/Nest&Backend 2022. 1. 18. 23:50
이 글을 읽기 전에 앞 글에 나와있는 노마드코더의 강의(무료)를 듣고 오셨길 바라며....(내용을 한땀한땀 작성하지 않습니다)
일반적으로 백엔드 URL이 "https://www.backend.com" 이라고 할때, api콜을 바로 "https://www.backend.com/Items"로 하지 않는다. "https://www.backend.com/user/items" 이런식으로 기능에 따라 경로를 한번더 나누는데, 이걸 module기준으로 나눈다고 생각하면 된다. 만약에 userModule이라고 한다면, 앞으로 유저와 관련된 api와 entity, dto들을 모두 해당 모듈에서 관리한다.
위와 같이 src에 User폴더를 만들고 위와 같이 파일들을 만든다.
//user.service.ts import { Injectable } from '@nestjs/common'; @Injectable() export class UserService {}
//user.controller.ts import { Controller } from '@nestjs/common'; import { UserService } from './user.service'; @Controller() export class UserController { constructor(private readonly userService: UserService) {} }
//user.module.ts import { Module } from '@nestjs/common'; import { UserController } from './user.controller'; import { UserService } from './user.service'; @Module({ imports: [], controllers: [UserController], providers: [UserService], }) export class UserModule {}
Entity를 세팅해보자. entity는 쉽게 말해(본인이 이해한 바로는....) 데이터 테이블을 요소들을 작성하는 것이다. 한번 세팅한 데이터베이스 구조를 변경하기는 어렵기 때문에 entity도 신중하게 작성해야 한다.
먼저 User와 관련하여 만들 DB에 대한 entity들을 작성하기 위해 User폴더 안에 Entities폴더를 만든다.
entity파일을 작성하기 이전에, class-validator와 class-transformer를 설치하자.
간단히 말해서 class-transformer는 API를 통해서 들어온 JSON 리터럴객체를 DB에 저장하려면 추가 가공하는 작업이 필요한데 class-transformer를 이용하면 클래스 인스턴스로 변환해주는 작업을 대신 해준다.
class-validator는 API를 통해서 넘어온 데이터가 클래스에 맞춰 올바른 포맷을 가지고 있는지 유효성을 검사해주는 것으로, API를 통해서 올바르지 않은 형식의 데이터가 들어왔을때 다른 처리를 하지 않아도 bad request를 뱉어준다(nest.js에서 validation pipe와 함께 써야한다. 노마드코더 동영상 참고)
$ npm i class-validator class-transformer
이제 entities폴더 안에 user.entity.ts 파일을 만들고 아래와 같이 작성한다.
//user.entity.ts import { Entity } from 'typeorm'; @Entity() export class User { }
기본 구조는 위와 같고 user DB와 관련된 컬럼을 위한 코드를 작성한다.
import { IsString, MaxLength } from 'class-validator'; import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm'; @Entity() export class User { @IsString() //해당 id의 타입은 string @PrimaryGeneratedColumn('uuid', { comment: 'uuid' }) // primarykey이고 해당 유저를 만들때 생성 @Column 데코레이터를 포함 id: string; @UpdateDateColumn({ comment: 'last update datetime' })// 마지막으로 업데이트될 때의 시간이 값이 됨 @Column 데코레이터를 포함 updatedAt: Date; @CreateDateColumn({ comment: 'insert datetime' }) // 해당 유저가 처음 생성될 때의 시간이 값이 됨 @Column 데코레이터를 포함 createdAt: Date; @Column({ length: 20 }) // 테이블에서의 컬럼임을 나타내는 데코레이터, 최대 길이 20 @IsString() @MaxLength(20) // 최대 길이가 20이 넘으면 error name: string; }
해당 user 테이블에 id, updatedAt, createAt, name만 있다는 가정하에 위와 같이 코드를 작성해준다.
@PrimaryGeneratedColumn, @UpdateDateColumn, @CreateDateColumn 를 사용한 컬럼 값은 나중에 새로운 user 데이터를 추가할 때, 값을 넣어주지 않아도 자동적으로 생성된다. @IsString과 @MaxLength는 데이터의 값이 컬럼 조건에 올바른지 validate하기 위한 데코레이터라는 것을 기억하자. 이것말고도 많은 데코레이터가 있지만 차근차근 코드를 작성해가며 알아보도록 한다.
만약 얼른(?) 알고 싶다면, Nest.js 문서와 typeorm 문서를 참고하세요!
https://docs.nestjs.com/recipes/sql-typeorm
Documentation | NestJS - A progressive Node.js framework
Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac
docs.nestjs.com
TypeORM - Amazing ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server,
typeorm.io
'사부작사부작 > Nest&Backend' 카테고리의 다른 글
[Nest.js]초기 세팅하기(feat.typeORM) (0) 2022.01.10 [ Clean Code] 깨끗한 코드, 의미 있는 이름, 함수 (0) 2022.01.09