npm install --save @nestjs/swagger
https://docs.nestjs.com/openapi/introduction#installation
main.ts
import { NestFactory } from '@nestjs/core';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const config = new DocumentBuilder()
.setTitle('Cats example')
.setDescription('The cats API description')
.setVersion('1.0')
.addTag('cats')
.build();
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, document);
await app.listen(3000);
}
bootstrap();
해당 코드를 추가해주면
http://localhost:3000/api/
해당 주소로 API 페이지를 확인할 수 있다.
https://docs.nestjs.com/recipes/prisma
Prisma는 Node.js와 TypeScript를 위한 오픈 소스 ORM(Object-Relational Mapping) 도구입니다. ORM은 객체와 관계형 데이터베이스 간의 매핑을 자동화하여 개발자가 SQL 쿼리를 직접 작성하지 않고도 데이터베이스와 상호 작용할 수 있도록 도와주는 기술입니다.
Prisma는 다음과 같은 특징을 가지고 있습니다:
- 데이터베이스 스키마를 기반으로 자동 생성되는 타입-세이프한 Query Builder
- 직관적이고 사용하기 쉬운 API
- 데이터베이스 마이그레이션 관리
- 실시간 Subscriptions 기능 제공
- PostgreSQL, MySQL, SQL Server, SQLite, MongoDB, CockroachDB 등 다양한 데이터베이스 지원
Prisma를 사용하면 개발자는 데이터베이스 스키마를 정의하고, 이를 기반으로 Prisma가 자동으로 타입-세이프한 Query Builder를 생성합니다. 이를 통해 개발자는 SQL 쿼리를 직접 작성하지 않고도 데이터베이스와 상호 작용할 수 있으며, 코드의 가독성과 유지보수성을 높일 수 있습니다.
또한, Prisma는 데이터베이스 마이그레이션 관리 기능을 제공하여 데이터베이스 스키마의 변경 사항을 추적하고 관리할 수 있습니다. 이를 통해 개발자는 데이터베이스 스키마를 쉽게 변경하고 버전 관리할 수 있습니다.
Prisma는 기존의 SQL 쿼리 작성 방식이나 다른 ORM 도구(예: TypeORM, Sequelize)의 대안으로 사용될 수 있습니다. Prisma의 직관적인 API와 타입-세이프한 Query Builder는 개발자의 생산성을 향상시키고, 코드의 품질을 높이는 데 도움을 줍니다.
npm install prisma --save-dev
$ npx prisma
$ npx prisma init
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
//만들려는 모델
model Todo {
id Int @default(autoincrement()) @id
title String
content String?
is_done Boolean? @default(false)
}
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
//만들려는 모델
model Todo {
id Int @default(autoincrement()) @id
title String
content String?
is_done Boolean? @default(false)
}
DATABASE_URL="mysql://사용자명:비밀번호@호스트:3306/데이터베이스이름?schema=스키마"
npx prisma migrate dev
파일이 생성 됩니다.
-- CreateTable
CREATE TABLE `Todo` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`title` VARCHAR(191) NOT NULL,
`content` VARCHAR(191) NULL,
`is_done` BOOLEAN NULL DEFAULT false,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
프리즈마를 사용하기위해서는 client 를 설치해야한다.
src 파일 아래에 prisma.service.ts 파일을 하나 만들고 해당 코드를 넣어주면 된다.
일단 이 프리즈마라는 걸 이용하면 DB 쿼리를 이용 안해도 이미 다 세팅 되어 있는 Prisma의 코드 만 이용해도
api 코드를 작성할 수 있다 는 점이 장점 이다.
해당 작성한 prisma.service.ts 파일을 import 해줘야 하는데
다른 service.ts 파일에 import 해주면 된다. 아 물론 그전에 Module 파일에 providers에 추가 해줘야 된다.
todo.module.ts
import { Module } from '@nestjs/common';
import { TodoController } from './controller/todo.controller';
import { TodoService } from './service/todo.service';
import { PrismaService } from '../prisma.service';
@Module({
controllers: [TodoController],
providers: [TodoService, PrismaService],
})
export class TodoModule {}
todo.service.ts
import { Injectable } from '@nestjs/common';
import { PrismaService } from './../../prisma.service';
import { Todo } from '@prisma/client';
@Injectable()
export class TodoService {
constructor(private prismaService: PrismaService) {}
// 전체 조회
async fetchAllTodos(): Promise<Todo[]> {
return this.prismaService.todo.findMany();
}
// 단일 조회
async fetchATodoItem(id: number): Promise<Todo | null> {
return this.prismaService.todo.findUnique({ where: { id: Number(id) } });
}
// 단일 삭제
async deleteATodoItem(id: number): Promise<Todo | null> {
return this.prismaService.todo.delete({ where: { id: Number(id) } });
}
}
contructor 생성자를 통해 불러와서 사용하면 된다.
프리즈만 규칙에 따라
service 에서 함수를 작성해준다.
import { Injectable } from '@nestjs/common';
import { PrismaService } from './../../prisma.service';
import { Todo } from '@prisma/client';
@Injectable()
export class TodoService {
constructor(private prismaService: PrismaService) {}
// 전체 조회
async fetchAllTodos(): Promise<Todo[]> {
return this.prismaService.todo.findMany();
}
// 단일 조회
async fetchATodoItem(id: number): Promise<Todo | null> {
return this.prismaService.todo.findUnique({ where: { id: Number(id) } });
}
// 단일 삭제
async deleteATodoItem(id: number): Promise<Todo | null> {
return this.prismaService.todo.delete({ where: { id: Number(id) } });
}
// 추가
async addTodoItem(data: Todo): Promise<Todo | null> {
return this.prismaService.todo.create({ data: data });
}
}
Todo 라는 형 타입은 -> Entity 는 프리즈마 Client를 통해 자동으로 생성되어 가져와 쓰기만하면 된다.
todo.controller.ts
import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common';
import { TodoService } from '../service/todo.service';
import { Todo } from '@prisma/client';
@Controller('api/v1/todo')
export class TodoController {
constructor(private readonly todoservice: TodoService) {}
@Get()
async fetchAllTodos(): Promise<Todo[]> {
return this.todoservice.fetchAllTodos();
}
@Get(':id')
async fetchATodoItem(@Param('id') id: number): Promise<Todo | null> {
return this.todoservice.fetchATodoItem(id);
}
@Delete(':id')
async deleteATodoItem(@Param('id') id: number): Promise<Todo | null> {
return this.todoservice.deleteATodoItem(id);
}
@Post()
async addTodoItem(@Body() data: Todo): Promise<Todo> {
return this.todoservice.addTodoItem(data);
}
}
Mysql
잘 들어간걸 확인할 수 있다.