끄적이는 개발노트

NestJS와 MongoDB 연결하기(2) - Module, Service, Controller 본문

JavaScript/NestJS

NestJS와 MongoDB 연결하기(2) - Module, Service, Controller

크런키스틱 2021. 10. 8. 12:04
728x90

이번 포스트에서는 이어서 cats 스키마에 대한 Module, Service, Controller를 생성하고 알아본다.

 

1. Module, Service, Controller 생성

우선 기본적인 내용을 담은 Module, Service, Controller를 생성하기 위해 nest generator를 실행한다.

$> nest g mo cats
$> nest g co cats
$> nest g s cats

이전 포스트에서 생성한 cats schemas폴더를 자동생성된 cats 폴더에 옮겨준다.

스키마 파일은 원하는 곳에 저장할 수 있지만, 적절한(관련된) 객체 근처에 저장하는 것을 추천한다.

 

2. Module 수정

// cats.module.ts

import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
import { Cat, CatSchema } from './schemas/cat.schema';

@Module({
  imports: [MongooseModule.forFeature([{ name: Cat.name, schema: CatSchema }])],
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}

MongooseModule은 모듈을 구성하기 위한 forFeature() 메소드를 제공하는데, 이는 현재 범위에 등록해야하는 모델을 정의한다.

스키마를 등록한 후, @InjectModel() 데코레이터를 사용하여 Cat 모델을 CatsService에 삽입한다.

 

3. Service 수정

// cats.service.ts

import { Model } from 'mongoose';
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Cat, CatDocument } from './schemas/cat.schema';
import { CreateCatDto } from './dto/create-cat.dto';

@Injectable()
export class CatsService {
    constructor(@InjectModel(Cat.name) private catModel: Model<CatDocument>) {}

    async create(createCatDto: CreateCatDto): Promise<Cat> {
        const createdCat = new this.catModel(createCatDto);
        return createdCat.save();
    }

    async findAll(): Promise<Cat[]> {
        return this.catModel.find().exec();
    }
}

 

4. DTO 파일 생성

우선, DTO에 필요한 npm을 설치한다.

$> npm i class-validator class-transformer @nestjs/mapped-types

 

그 후, cats 폴더 안에 dto 폴더를 생성해주고, 그 안에 create와 update에 해당하는 dto 파일을 생성한다.

// create-cat.dto.ts

import {IsString, IsNumber} from 'class-validator'

export class CreateCatDto {
    @IsString()
    readonly name: string;

    @IsNumber()
    readonly age: number;
    
    @IsString({ each: true })
    readonly sounds: string[];
}
// update-cat.dto.ts

import { PartialType } from '@nestjs/mapped-types';
import { CreateCatDto } from './create-cat.dto';

export class UpdateCatDto extends PartialType(CreateCatDto) {}

 

유효성검사를 진행하기 위해서 main.ts 파일에 파이프를 추가한다.

// main.ts

import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true
    })
  )
  await app.listen(3000);
}
bootstrap();

 

5. Controller 수정

// cats.controller.ts

import { Controller } from '@nestjs/common';
import { CatsService } from './cats.service';
import { Cat } from './schemas/cat.schema';

@Controller('cats')
export class CatsController {
    constructor(private readonly catsService: CatsService) {}
}

 

이것으로 NestJS에 cats 스키마 연결을 위한 Module, Service, DTO, Controller를 생성했다.

다음 포스트에서는 controller와 service에 각각 CRUD를 추가해 테스트해본다.

728x90