
// 전역 nest 프레임워크 설치
npm i -g @nestjs/cli
// nest 프로젝트 시작
nest new
기존 Next 환경과 동일한 패키지 매니저를 사용하기 위해 pnpm으로 세팅함
const app = await NestFactory.create(AppModule); // 모듈 연결
await app.listen(3000); // 포트연결
@Module({
imports: [],
controllers: [MoviesController], // 컨트롤러
providers: [MoviesService], // 컨트롤러 모델 형상화 공간
})
nest에서 제공하는 간단 명령어를 활용한다
// nest generate
nest g <option>
option :
controller -> @ co
service -> @ s
// 컨트롤러 생성하기
nest g co
이후 컨트롤러 폴더 이름을 입력하면 폴더가 생성된다.
Nest는 어떤 식으로 Rest API를 만드는지에 대한 설명
@Controller 함수 안에 String으로 입력하면 첫 Path 값이다@Get()
getAll() {
return '모든 영화 데이터 가져오기';
}
// localhost:3000/
@Get(':id')
// Param으로 dynamic path를 가져올 수 있다
getOne(@Param('id') movieId: string) {
return `${movieId} 의 영화 데이터 가져오기`;
}
// localhost:3000/65
@Post()
// Body로 front json data를 가져올 수 있다
create(@Body() movieData) {
return movieData;
}
// localhost:3000/
// body data
{
"name" : "charley",
"age" : "6",
}
@Delete(':id')
remove(@Param('id') movieId: string) {
return `${movieId} 의 영화 데이터 삭제하기`;
}
// localhost:3000/65
@Patch(':id') // or @Put(':id)
// Param, Body를 동시에 가져올 수도 있다. 어떤 메소드도 해당되는 내용
patch(@Param('id') movieId: string, @Body() updateData) {
// 하나의 json으로 만들기 위해 ES6 Spread Operator 활용
return {
updateMovie: movieId,
...updateData,
};
}
// localhost:3000/65
// body data
{
"name" : "charley",
"age" : "6",
}
@Search('search')
// Query로 path argument 구현
search(@Query('year') movieYear) {
return `${movieYear}년도 영화를 찾았습니다`;
}
// localhost:3000/search?year=2000
// 서비스 생성하기
nest g s
이후 서비스 폴더 이름을 입력하면 폴더가 생성된다.
이전 컨트롤러와 같은 이름으로 입력하면 같은 root로 이동한다
@Injectable()를 사용해 service 의존성을 주입한다.// project.service.ts
@Injectable()
export class MoviesService {
private movies: Movie[] = []; // private = const처럼 불변
create(movieData: Movie) {
return this.movies.push({
id: this.movies.length + 1,
...movieData,
});
}
remove(id: string) {
return this.movies.filter((movie) => movie.id !== +id);
}
}
// project.controller.ts
@Controller('movies')
export class MoviesController {
// service 로직 불변의 읽기전용으로 가져와서 사용하기 class import
constructor(private readonly moviesService: MoviesService) {}
@Post()
create(@Body() movieData: Movie) {
// service 바인딩
return this.moviesService.create(movieData);
}
@Delete(':id')
remove(@Param('id') movieId: string) {
return this.moviesService.remove(movieId);
}
}