본문 바로가기
Back-End/🐱NestJS (TypeScript) log

[NestJS 일기] 영화 api 만들기(1) - 설치 , 컨트롤러 , 서비스 ts파일 만들기

by 코딩하는 동현😎 2022. 6. 3.

nodejs 환경에서 nest 설치

폴더에서 아래와 같이 터미널에 입력하면 nest를 설치하고 프로젝트를 생성할수 있습니다.

$ npm i -g @nestjs/cli

$ nest new project-name

movie들을 등록하고 정보를 조회하는 백엔드 api를 만들기로 시작했습니다.

$ nest g co ==> 컨트롤러 생성

$ nest g s ==> 서비스 생성

movie폴더 안에 movies.controller , movies.service를 생성했습니다.

entities(객체) 폴더 안에는 Movie 객체를 생성했습니다.


Movie 객체

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

movies 컨트롤러

url주소/movies 를 검색하면 라우팅 되는 부분의 코드입니다.

주로 get이나 post 요청을 받을때 받는 인자에 따라 기능을 분류하는것을 controller에서 합니다.

 

기능은 Get 요청을 받을때 영화 목록 나열(getAll),

Get요청으로 id 값을 받으면 해당 id에 해당하는 영화 정보 출력(getOne),

Post로 영화정보를 json파일로 입력을 받으면 영화 목록에 추가(create),

갱신할 영화의 id를 입력받으면 입력한 정보로 갱신(patch) 이 있습니다.

 

요청을 받을땐 '@요청유형' 이라는 decorator를 작성해야되고, 함수 바로 위에 있어야합니다.

파라미터나 질의 , json 바디 객체를 받으려면 꼭 @Param, @Body등등의 decorator를 인자에 넣어줘야합니다.

import { Body, Controller, Delete, Get, Param, Patch, Post, Query } from '@nestjs/common';
import { rename } from 'fs';
import { CreateMovieDto } from './dto/create-movie.dto';
import { Movie } from './entities/movie.entities';
import { MoviesService } from './movies.service';

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

    @Get()
    getAll() : Movie[]{
        return this.moviesService.getAll()
    }
    
    @Get('search')
    search(@Query('year') searchingYear: string){
        return `we are going to search for a movie after ${searchingYear}`
    }

    @Get('/:id')
    getOne(@Param('id') movieId:string) : Movie{
        return this.moviesService.getOne(movieId);
    }
    @Post()
    create(@Body() movieData : CreateMovieDto){
        return this.moviesService.create(movieData);
    }
    @Delete('/:id')
    delete(@Param('id') movieId:string){
        return this.moviesService.deleteOne(movieId);
    }

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

}

Movies 서비스 파일

컨트롤러에서 사용자의 요청에 따라 분류하면 서비스에는 실질적인 기능들을 정의합니다.

데이터베이스를 쓰진 않고 모의식으로 구현했습니다.

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

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

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

    create(movieData){
        this.movies.push({
            id: this.movies.length + 1,
            ...movieData
        })
    }
    
    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.movies = this.movies.filter(movie => movie.id !== +id)
        return;
    }

    update(id:string, updateData ){
        const movie = this.getOne(id)
        this.deleteOne(id)
        this.movies.push({...movie , ...updateData})

    }
}

$ npm run start:dev ==> 서버 실행
반응형

댓글