본문 바로가기

framework/NestJs

[NestJs] 디자인 패턴 적용

Nest에서 제공하는 CLI로 프로젝트를 생성하면 src 디렉토리 내부는 아래와 같이 구성되어 있다.

https://docs.nestjs.com/first-steps

  • Controller : 들어오는 요청을 처리하고 클라이언트에 응답을 반환하는 역할을 한다.
  • Service(공급자) : 서비스, 리포지토리, 팩토리 등이 공급자로 취급되며 공급자는 종속성으로 주입할 수 있다.
  • Module: Nest 애플리케이션 그래프를 구축하는 시작점이다. 다른 모듈과 공급자 관계 및 종속성 설정을 담당한다.
  • main: 모듈을 인스턴스화하여 애플리케이션을 생성한다.
  • spec: Test를 담당한다.

main.ts에서 애플리케이션 생성

 

위의 패턴에 추가적으로 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