Nest JS #3 Rest API(2)
Single-responsibility principle
: 하나의 module, class 혹은 function이 하나의 기능을 꼭 책임져야함
Service 만들기
-
서비스-> 로직을 관리
-
컨트롤러: url 매핑, 리퀘스트 받기, Query 넘기기, Body나 그 외 넘기기
-
terminal에 nest g s // 이름: movies
=> movies.service.ts 생김
=> app.module에 자동으로 providers에 moviesservice 추가됨
-
movies.service에 데이터베이스 만들기
(1) movies에 entities 폴더 생성 -> movie.entity.ts 파일 생성
=> entities에 데이터베이스 모델 만들기
-
movie.entity.ts
export class Movie{ id: number; title: string; year: number; genres: string[]; }
-
app.service.ts
import { Injectable } from '@nestjs/common'; import { Movie } from './entities/movie.entity'; @Injectable() export class MoviesService { private movies: Movie[]= []; getAll(): Movie[]{ return this.movies; } getOne(id:string):Movie{ return this.movies.find(movie => movie.id === +id); //string을 number로 변환 가능 } deleteOne(id:string):boolean{ this.movies.filter(movie => movie.id !== +id); return true; } create(movieData){ this.movies.push({ id: this.movies.length +1, ...movieData }) } }
-> 위는 가짜 데이터베이스
-> 진짜 데이터베이스는 데이터베이스에 대한 Query가 옴
** function은 똑같은 이름해도 상관 없음**
-
movies.controller.ts
import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query } from '@nestjs/common'; import { Movie } from './entities/movie.entity'; import { MoviesService } from './movies.service'; @Controller('movies') export class MoviesController { constructor(private readonly moviesService: MoviesService){}//읽기 전용 movieService 클래스를 가짐 @Get() getAll(): Movie[]{ //Movie array 리턴 return this.moviesService.getAll(); //consturctor 덕분에 쓸 수 있음 } @Get("/:id") getOne(@Param("id") movieId: string): Movie{ //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 { updatedMovie:movieId, ...updateData, }; } }
-
실행
-
getAll
-> 빈 array 실행
-
post
-
getOne
-
-
service
-> 파일을 저장하면 데이터베이스 전부가 날라감
(메모리 데이터 베이스이기 때문에 서버를 켜놓는 동안만 데이터베이스가 기억)
-
없는 id 경우 에러화면 내보내기
-
movies.controllers.ts
@Patch('/:id') patch(@Param('id') movieId: string, @Body() updateData){ return this.moviesService.update(movieId, updateData); }
-
movies.servies.ts
getOne(id:string):Movie{ const movie = this.movies.find(movie => movie.id === +id); //string을 number로 변환 가능 if(!movie){ throw new NotFoundException(`Movie with ID ${id} not found.`) // 없는 경우 에러 메세지 } return movie; } deleteOne(id:string){ this.getOne(id); //id가 있는 경우 remove this.movies = this.movies.filter(movie => movie.id !== +id); } update(id:string, updateData){ const movie = this.getOne(id); this.deleteOne(id); //원래 id 지우기 this.movies.push({...movie, ...updateData }); }
- getOne
- delete
- patch
-