끄적이는 개발노트
NestJS와 MongoDB 연결하기(2) - Module, Service, Controller 본문
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
'JavaScript > NestJS' 카테고리의 다른 글
NestJS - Middleware (0) | 2021.11.03 |
---|---|
NestJS와 MongoDB 연결하기(3) - CRUD (0) | 2021.10.08 |
NestJS와 MongoDB 연결하기(1) - 설치 및 스키마 정의 (0) | 2021.10.08 |
NestJS 연습 프로젝트(Movie) - 테스트 (0) | 2021.10.01 |
NestJS 연습 프로젝트(Movie) - DTO와 유효성검사 (0) | 2021.10.01 |