Single Responsibility Principle 따르자
하나의 module, class 혹은 function이 하나의 기능은 꼭 책임져야 한다.
하나의 module, class 혹은 function이 하나의 기능은 꼭 책임져야 한다. 객체 지향 프로그래밍에서 단일 책임 원칙(single responsibility principle)이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다. 클래스가 제공하는 모든 기능은 이 책임과 주의 깊게 부합해야 한다. _출처: 위키백과
- decorator에서 뭔가를 원한다면 요청을 해야 한다.
- parameter 필요하면 직접 요청해야 한다.
- body 가 필요하면 직접 요청해야 한다.
- ExpressJs에서 body를 json으로 리턴하려면 설정을 해줘야 했다.
- NestJs에서는 json으로 바로 받을 수 있다.
컨트롤러 추가 "movies"
// src/movies/movies.controller.ts import { Body, Controller, Delete, Get, Param, Patch, Post, 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) {} @Get() getAll(): Movie[] { return this.moviesService.getAll(); } @Get('/:id') getOne(@Param('id') movieId: string) { 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); } }
@Controller('movies')
- Controller의 이름값으로 URL이 만들어진다.
- http://localhost:3000/movies
- Controller의 이름 부분은 URL의 Entry Point(엔트리 포인트)를 컨트롤한다.
- express.js 애플리케이션을 쓸 때의 라우터와 같다.
URL의 파라미터 값을 얻을 때
@Get('/:id') getOne(@Param('id') movieId: string) { return this.moviesService.getOne(movieId); }
- 예를 들어, getOne()에서 요청하는 방법은 파라미터를 요청하는 것이다.
- 파라미터의 decorator를 사용한다면 NestJS는 URL에 있는 id 파라미터를 원하는 것을 알 수 있게 된다.
- id라는 파라미터를 movieId라는 argument에 string 타입으로 저장한 것
- 라우터의 @Get('/:id')와 @Param('id') 이름이 같아야 한다.
- @Param('id')와 파라미터의 argument인 movieId: string는 이름이 달라도 된다.
Update 데코레이터 (Put, Patch)
@Patch('/:id') patch(@Param('id') movieId: string, @Body() updateData) { return this.moviesService.update(movieId, updateData); }
- 전체 movie를 업데이트할 때 = Put 사용
- movie의 일부분만 업데이트할 때는 patch 사용
@Post에서 request의 body 부분을 가져오고 싶을 때
@Post() create(@Body() movieData) { console.log(movieData) return this.moviesService.create(movieData); }
- Body 내용을 가져올 때 @Body 데코레이터를 사용하면 된다.
Query 데코레이터 사용하기
@Get('search') search(@Query('year') searchingYear: string){ return `We are searching for a movie made after: ${searchingYear}`; }
- 예를 들면 2000년 이후에 movie 만 가져오고 싶을 때 name 같은 query argument를 보내보기
- http://localhost:3000/movies/search?year=2000
[위치 주의] search 부분이 get(:id) 보다 밑에 있으면 NestJS는 search를 id로 판단한다.
// [잘못된 위치] (:id) 보다 아래 있으면 안된다. src/movies/movies.controller.ts import { Body, Controller, Delete, Get, Param, Patch, Post } from '@nestjs/common'; @Controller('movies') export class MoviesController { @Get() getAll(){ return 'This will return all movies'; } @Get('/:id') getOne(@Param('id') movieId: string){ return `This will return one movie with the id: ${movieId}`; } @Get('search') // 여기에 위치하면 안된다! search(){ return 'We are searching for a movie with a title: '; } }
// [정확한 위치] (:id) 보다 위에 있어야 한다. src/movies/movies.controller.ts import { Body, Controller, Delete, Get, Param, Patch, Post } from '@nestjs/common'; @Controller('movies') export class MoviesController { @Get() getAll(){ return 'This will return all movies'; } @Get('search') // 여기에 위치하면 된다! search(){ return 'We are searching for a movie with a title: '; } @Get('/:id') getOne(@Param('id') movieId: string){ return `This will return one movie with the id: ${movieId}`; } }
'Frontend > Nest.js' 카테고리의 다른 글
NestJS : 예외처리 (0) | 2023.01.10 |
---|---|
NestJS : 형변환 (0) | 2023.01.09 |
NestJS : 아키텍처 (0) | 2023.01.09 |
Nuxt, Next, Nest 차이점 (0) | 2022.12.30 |
Express가 좋을까 NestJS가 좋을까? (0) | 2022.12.30 |