Wii Pointer #1 Tilt Normal
본문 바로가기
📘 𝐭𝐢𝐥/일간 회고

[23.03.03]

by 개발자_후니 2023. 3. 3.
728x90
반응형

2.2 / 2.3 Movies Service part

서비스를 만든다? → nest g s 하면 되겠네

 

 

먼저 movie에서 사용되어질 entity 들을 넣어주기 위한 파일을 생성해서

movie.entity.ts 라는 파일을 만들어주고

export class Movie {
  id: number;
  title: string;
  year: number;
  genres: string[];
}

속성값들을 기입해주자

자세히 살펴보니 express에서 쓰던 Schemas 와 비슷한 느낌을 받았다.

작성이 완료되었다면

service를 하나하나 만들어 나가보자.

import { Injectable } from '@nestjs/common';
import { NotFoundException } from '@nestjs/common/exceptions';
import { Movie } from './entities/movie.entity';

@Injectable()
export class MoviesService {
  private movies: Movie[] = [];

  getAll(): Movie[] {
    return this.movies;
  }

  getOne(id: string): Movie {
    const movie = this.movies.find((movie) => movie.id === +id);
    if (!movie) {
      throw new NotFoundException(`Movie with ID: ${id} not found.`);
    }
    return movie;
  }

  deleteOne(id: string) {
    this.getOne(id);
    this.movies = this.movies.filter((movie) => movie.id !== +id);
  }

  create(movieData) {
    this.movies.push({
      id: this.movies.length + 1,
      ...movieData,
    });
  }

  update(id: string, updateData) {
    const movie = this.getOne(id);
    this.deleteOne(id);
    this.movies.push({ ...movie, ...updateData });
  }
}
import {
  Controller,
  Delete,
  Get,
  Param,
  Body,
  Patch,
  Post,
} from '@nestjs/common';
import { MoviesService } from './movies.service';
import { Movie } from './entities/movie.entity';

@Controller('movies')
export class MoviesController {
  constructor(readonly moviesService: MoviesService) {}

  @Get()
  getAll(): Movie[] {
    return this.moviesService.getAll();
  }

  @Get('/:id')
  getOne(@Param('id') movieId: string): Movie {
    return this.moviesService.getOne(movieId);
  }

  @Post()
  create(@Body() movieData) {
    return this.moviesService.create(movieData);
  }

  @Delete('/:id')
  remove(@Param('id') movieId: string) {
    return this.moviesService.deleteOne(movieId);
  }

  @Patch('/:id')
  patch(@Param('id') movieId: string, @Body() updateData) {
    return this.moviesService.update(movieId, updateData);
  }
}

 

 

updateData의 유효성 검사를 하지 않아서 생기는 문제다.

다행히도 NestJS 에서는 편리하게 검사를 할 수 있다.

—> DTSs and Validation 에서 확인해보자

2.4 / 2.5 DTOs and Validation part

 

여기서 DTO란? → Data Transfer Object 를 의미

파이프는 미들웨어 같은 것.

  • class-validator & class-transformernpm i --save class-validator class-transformer웹 애플리케이션으로 전송되는 데이터의 검증을 도와줍니다.ValidationPipe는 강력한 클래스 유효성 검사기 패키지와 선언적 유효성 검사 데코레이터를 사용합니다. ValidationPipe는 들어오는 모든 클라이언트 페이로드에 대해 유효성 검사 규칙을 적용하는 편리한 접근 방식을 제공합니다.자동 검증따라서 모든 엔드포인트가 잘못된 데이터를 수신하지 못하도록 보호됩니다.whitelistforbidNonWhitelistedtransform (자동 형변환)
    app.useGlobalPipes(
    
    new ValidationPipe({
    
    transform: true,
    
    }),
    
    );
    
    
    https://docs.nestjs.com/techniques/validation#transform-payload-objects
  • 네트워크를 통해 들어오는 payload는 일반 JavaScript 객체입니다. ValidationPipe는 payload를 DTO 클래스에 따라 유형이 지정된 객체로 자동 변환할 수 있습니다. 자동 변환을 활성화하려면 transform을 true로 설정하십시오. 이 동작을 전역적으로 활성화하려면 전역 파이프에서 옵션을 설정합니다.
  • true로 설정하면 화이트리스트에 없는 속성을 제거하는 대신 유효성 검사기가 예외를 throw합니다.
  • true로 설정하면 유효성 검사기는 class-validator의 유효성 검사 데코레이터를 적어도 하나라도 사용하지 않은 모든 속성 객체를 제거합니다.
  • https://docs.nestjs.com/techniques/validation
  • 애플리케이션 수준에서 ValidationPipe를 바인딩하는 것으로 시작하겠습니다.
  • https://docs.nestjs.com/techniques/validation
  • 들어오는 요청을 자동으로 검증하기 위해 Nest는 즉시 사용할 수 있는 여러 파이프를 제공합니다.
  • Validation
  • 내장 ValidationPipe사용을 위한 class-validator, class-transformer설치

npm i @nestjs/mapped-types

 

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

 

 

npm i @nestjs/mapped-types

2.6 Modules and Dependency Injection

 

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { MoviesModule } from './movies/movies.module';

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

2,7 Express on NestJS

@Get()
  getAll(@Req() req, @Res() res): Movie[] {
		res.json()
    return this.moviesService.getAll();
}

위와 같이 쓰는 건 추천하지 않는다.

Fastify !

728x90
반응형

'📘 𝐭𝐢𝐥 > 일간 회고' 카테고리의 다른 글

[23.03.28]  (0) 2023.03.28
[23.03.09]  (0) 2023.03.09
[23.02.28]  (0) 2023.02.28
[23.02.25]  (0) 2023.02.25
[23.02.24]  (0) 2023.02.24