본문 바로가기

카테고리 없음

Nest.js Swagger UI , Prisma 사용하기 Prisma를 이용한 Mysql 연결 및 REST API 작성 방법

반응형

npm install --save @nestjs/swagger

https://docs.nestjs.com/openapi/introduction#installation

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

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

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea

docs.nestjs.com

Prisma는 Node.js와 TypeScript를 위한 오픈 소스 ORM(Object-Relational Mapping) 도구입니다. ORM은 객체와 관계형 데이터베이스 간의 매핑을 자동화하여 개발자가 SQL 쿼리를 직접 작성하지 않고도 데이터베이스와 상호 작용할 수 있도록 도와주는 기술입니다.

Prisma는 다음과 같은 특징을 가지고 있습니다:

  1. 데이터베이스 스키마를 기반으로 자동 생성되는 타입-세이프한 Query Builder
  2. 직관적이고 사용하기 쉬운 API
  3. 데이터베이스 마이그레이션 관리
  4. 실시간 Subscriptions 기능 제공
  5. 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

잘 들어간걸 확인할 수 있다. 

반응형