본문 바로가기

Backend/Nestjs

[Nestjs] Nestjs + GraphQL 적용한 TodoList 만들기 (2)

프로젝트 생성


TodoList 프로젝트를 만들기 위한 프로젝트 생성을 합니다.

nestjs의 기본 프로젝트 생성은 아래의 링크에서 확인하시면 자세한 설명을 확인하실 수 있습니다.

https://docs.nestjs.com/

 

1. 프로젝트 생성

npm i -g @nestjs/cli
nest new nest-graphql-todolist

프로젝트 생성 후 폴더

 

2. 프로젝트 실행

npm run start:dev

프로젝트 실행 후 터미널
Postman으로 프로젝트 [ GET / ] 테스트 화면

 

Typeorm + Mysql


TodoList 프로젝트의 Todo를 관리하기 위해서 Typeorm과 mysql을 사용하기로 했습니다.

프로젝트 생성을 했기 때문에 Typeorm과 mysql 연결을 위한 구성과 간단한 todo entity를 만들어보겠습니다.

 

1. Package 설치

npm install --save @nest/typeorm typeorm mysql2 @nestjs/config joi

 

2. Config 구성

 

config.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule } from '@nestjs/config';
import * as Joi from 'joi';

@Module({
    imports: [
        ConfigModule.forRoot({
            isGlobal: true,
            validationSchema: Joi.object({
                DB_HOST: Joi.string().required(),
                DB_PORT: Joi.string().required(),
                DB_USERNAME: Joi.string().required(),
                DB_PASSWORD: Joi.string().required(),
                DB_NAME: Joi.string().required(),
                DB_CHARSET: Joi.string().required(),
            }),
        }),
        TypeOrmModule.forRoot({
            type: 'mysql',
            host: process.env.DB_HOST,
            port: parseInt(process.env.DB_PORT),
            username: process.env.DB_USERNAME,
            password: process.env.DB_PASSWORD,
            database: process.env.DB_NAME,
            charset: process.env.DB_CHARSET,
            autoLoadEntities: true,
            synchronize: true,
            logging: true,
            entities: [__dirname + '/../**/*.entity{.ts,.js}'],
        }),
    ],
})
export class CommonConfigModule {}

config.module.ts는 common 아래 config에 생성했습니다.

 

CommonConfigModule을 app.module.ts 파일 imports에 추가합니다.

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CommonConfigModule } from './common/config/config.module';

@Module({
  imports: [CommonConfigModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

 

config 종속성이 없는 상태로 실행하면 에러가 발생하여 env 파일을 정상적으로 불러오기 위해 config 종속성과 스키마 유효성 검사를 위한 joi를 구성했습니다.

 

 

3. Todo Entity 만들기

이제 typeorm과 mysql을 연결했으니 이번 프로젝트에서 메인으로 사용할 todo entity를 만들어보겠습니다.

nest

nest command help

nest만 명령어 입력하게 되면 위 이미지 처럼 nest의 여러가지 command와 options가 나옵니다. 여기에서 사용하기 적합한걸 골라 사용하시면 됩니다.

 

저는 지금 기본적으로 todo module을 생성하려고하기 때문에 mo를 사용하겠습니다.

nest g mo todo

src 아래 todo가 자동으로 생성
app.module.ts 파일안에도 자동으로 import

 

 

todo 폴더 안에 entities라는 폴더를 만들고 그 안에 todo.entity.ts 를 만들어보겠습니다. 여기서 주의할건 typeorm module을 구성할 때 entities는 *.entity.ts or *.entity.js 으로 하기로 약속했기 때문에 형식을 유지하여 파일을 생성해야합니다.

.....

TypeOrmModule.forRoot({
            .....
            entities: [__dirname + '/../**/*.entity{.ts,.js}'],
        }),
        
.....

 

todo.entity.ts

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


@Entity()
export class Todo {
    @PrimaryGeneratedColumn()
    id: number; 				
    // PK
    
    @Column()
    title : string				
    // todo의 제목

    @Column()
    description : string		
    // todo의 자세한 설명

    @Column()
    deadline : Date				
    // todo의 마감기한
}

 

todo.module.ts
객체 매핑을 위한 TodoModule에 Typeorm과 entity를 연결합니다.

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Todo } from './entities/todo.entity';

@Module({
    imports : [TypeOrmModule.forFeature([Todo])]
})
export class TodoModule {}

실행 시 table 생성
DB에 만들어진 todo table

 

마무리


다음 글에서는 본격적으로 Graphql을 다뤄보겠습니다.

 

감사합니다.