Nest에서 제공하는 CLI로 프로젝트를 생성하면 src 디렉토리 내부는 아래와 같이 구성되어 있다.
- Controller : 들어오는 요청을 처리하고 클라이언트에 응답을 반환하는 역할을 한다.
- Service(공급자) : 서비스, 리포지토리, 팩토리 등이 공급자로 취급되며 공급자는 종속성으로 주입할 수 있다.
- Module: Nest 애플리케이션 그래프를 구축하는 시작점이다. 다른 모듈과 공급자 관계 및 종속성 설정을 담당한다.
- main: 모듈을 인스턴스화하여 애플리케이션을 생성한다.
- spec: Test를 담당한다.
위의 패턴에 추가적으로 dto, repository, schema를 추가하였다.
1. 모듈
$ nest g mo cats
모듈을 먼저 생성한 후 Nest CLI 를 이용해 서비스, 컨트롤러를 생성하면 자동으로 Module이 업데이트 된다.
mo는 module의 약자이며 module로 작성해도 모듈이 생성된다.
cats가 디렉토리가 생성되며 그 내부에 cats.module.ts가 생성된다.
$ nest g co cats
$ nest g s cats
co는 controller, s는 service의 약자이다.
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { MongooseModule } from '@nestjs/mongoose';
import { Cats, CatsSchema } from './cats.schema';
import { CatsService } from './cats.service';
@Module({
imports: [
MongooseModule.forFeature([{ name: Cats.name, schema: CatsSchema }]),
],
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}
[NestJs] Mongoose - 스키마, Insert 편에서 몽구스를 활용해 몽고DB에 연결하여 import 되어 있다.
[https://my-dev-record.tistory.com/7
[NestJs] Mongoose - 스키마, Insert
npm 설치 npm i @nestjs/mongoose mongoose app.module.ts에 import imports: [ MongooseModule.forRoot(MONGODB_URI), ], Validation npm i --save class-validator class-transformer Cat 스키마 생성 몽구스에서는 모든 것이 스키마에서 파생된
my-dev-record.tistory.com
2. 컨트롤러
컨트롤러에서는 swagger를 통해 응답의 상태를 작성하였다.
또한 모듈에서 provider(공급자)로 입력받는 CatsService를 클래스 생성자를 통해 주입받고 있다.
컨트롤러는 요청을 받아 응답을 처리한다.
import { Body, Controller, Post } from '@nestjs/common';
import { CatsRequestDto } from './dto/cats.request.dto';
import { CatsService } from './cats.service';
import { ApiOperation, ApiResponse } from '@nestjs/swagger';
@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@Post()
@ApiResponse({
status: 200,
description: 'success',
})
@ApiResponse({
status: 500,
description: 'error...',
})
@ApiOperation({
summary: '회원가입',
})
async signUp(@Body() cat: CatsRequestDto) {
return await this.catsService.signUp(cat);
}
}
3. 서비스
서비스에는 클래스 생성자로 CatsRepository를 주입받아 사용한다.
또한 비니지스 로직만을 처리한다.
import { Injectable, UnauthorizedException } from '@nestjs/common';
import { CatsRepository } from './cats.repository';
import { CatsRequestDto } from './dto/cats.request.dto';
@Injectable()
export class CatsService {
constructor(private readonly catsRepository: CatsRepository) {}
async signUp(catsRequestDto: CatsRequestDto) {
const isExists = await this.catsRepository.existsByEmail(
catsRequestDto.email,
);
if (isExists) {
throw new UnauthorizedException('This cat is exists');
}
const cat = await this.catsRepository.create(catsRequestDto);
return cat.readOnlyData;
}
}
4. 리포지토리
몽구스 모델을 클래스 생성자로 주입받아 사용한다.
리포지토리는 데이터베이스의 처리를 담당한다.
import { Injectable } from '@nestjs/common';
import { Model } from 'mongoose';
import { Cats } from './cats.schema';
import { InjectModel } from '@nestjs/mongoose';
import { CatsRequestDto } from './dto/cats.request.dto';
@Injectable()
export class CatsRepository {
constructor(
@InjectModel(Cats.name) private readonly catsModel: Model<Cats>,
) {}
async existsByEmail(email: string) {
return this.catsModel.exists({ email });
}
async create(cat: CatsRequestDto): Promise<Cats> {
return await this.catsModel.create(cat);
}
}
5. dto
dto의 경우는 프로세스 사이에서 데이터를 전송하는 객체를 의미한다.
요청 또는 응답할 때 DTO를 사용하여 데이터를 주고 받는다.
CatsRequestDto
import { PickType } from '@nestjs/swagger';
import { Cats } from '../cats.schema';
export class CatsRequestDto extends PickType(Cats, ['email', 'name', 'age']) {}
CatsDto
import { ApiProperty, PickType } from '@nestjs/swagger';
import { Cats } from '../cats.schema';
export class CatsDto extends PickType(Cats, ['email', 'name', 'age']) {
@ApiProperty({
example: '13412321',
description: 'This is id',
})
id: string;
}
'framework > NestJs' 카테고리의 다른 글
[NestJs] JWT 사용 (0) | 2023.04.05 |
---|---|
[NestJs] swagger 예시 (0) | 2023.03.30 |
[NestJs] Mongoose - 스키마, Insert (0) | 2023.03.29 |
[NestJs] npm 명령어 (0) | 2023.03.29 |