NestJS Prisma, MySQL 사용하는 방법입니다.
Prisma는 NodeJS및 Typescript용 오픈소스 ORM입니다. 이는 일반 SQL문을 작성하거나 SQL 쿼리 빌드 또는 ORM과 같은 다른 데이터베이스 액세스 도구를 사용하는 대안으로 사용됩니다. Prisma는 현재 PostgreSQL, MySQL, SQL Server, SQLite, MongoDB 및 WrocachDB( 미리 보기 )를 지원합니다.
구성
- Prisma Client: NodeJS와 Typescript 전용 Type Safe 및 자동 생성 쿼리빌더
- Prisma Migrate: Migration System, 데이터 모델링
- Prisma Studio: GUI를 통해 DB를 수정할 수 있는 기능
prisma client는 모든 nodeJS or typescript backend 어플리케이션에서 사용이 가능하다고 합니다.
NestJS를 생성한 폴더에서 prisma를 설치해줍니다.
$ npm install prisma --save-dev
$ npx prisma init
prisma init을 하면 schema.prisma가 생성됩니다.
schema.prisma 파일에 provider를 사용할 데이터 베이스로 연결해줍니다.
.env 파일에 DATABASE_URL을 변경해줍니다.
mysql: DB종류, root: 유저이름, 빨간부분: 비밀번호, 127~.1: 호스트주소 ( localhost ), 3306: PORT번호, karaoke: DB이름, 스키마=퍼블릭
테이블을 작성합니다.
@default(autoincrement()): 자동 번호추가
@default(false): 기본 boolean설정 false
migration을 해줍니다.
$ npx prisma migrate dev
migrate해주고 이름을 정해줍니다.
migrations폴더에 지정해준 이름으로 폴더가 생성되고, 안에 migration.sql이 생성됩니다.
Prisma Client를 설치합니다.
$ npm install @prisma/client
src/prisma.service.ts 파일을 생성합니다.
데이터 베이스 연결 내용입니다.
import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
async onModuleInit() {
await this.$connect();
}
}
:: Module과 Service 생성하는 방법
--flat을 설정하면 폴더를 생성하지 않고 바로 만들어줍니다.
g: generate 줄임말
co: controller 줄임말
s: service 줄임말
$ nest g module name
$ nest g controller todo/controller/todo --flat
$ nest g service todo/service/todo --flat
app.module.ts
app module에 imports를 추가해줍니다.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
// 모듈 추가
import { TodoModule } from './todo/todo.module';
@Module({
imports: [
TodoModule
],
controllers: [
AppController
],
providers: [
AppService
],
})
export class AppModule {}
todo.module.ts
컨트롤러와 서비스를 추가해줍니다.
import { Module } from '@nestjs/common';
// 컨트롤러
import { TodoController } from './controller/todo.controller';
// 서비스
import { TodoService } from './service/todo.service';
import { PrismaService } from 'src/prisma.service';
@Module({
// 추가내용
controllers: [TodoController],
providers: [TodoService, PrismaService]
})
export class TodoModule {}
todo.service.ts
import { Injectable } from '@nestjs/common';
// 프리즈마 서비스를 찾아옵니다.
import { PrismaService } from 'src/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 fetchTodoItem(id: Number): Promise<Todo | null> {
return this.prismaService.todo.findUnique({
where: { id: Number(id) }
});
}
// 삭제하기
async deleteTodoItem(id: Number): Promise<Todo | null> {
return this.prismaService.todo.delete({
where: { id: Number(id) }
});
}
// 추가하기
async createTodoItem(data: Todo): Promise<Todo> {
return this.prismaService.todo.create({ data: data });
}
// 수정하기
async updateTodoItem(id: Number, title: string, content: string, isDeleted: boolean): Promise<Todo | null> {
return this.prismaService.todo.update({
where: { id: Number(id) },
data: {
title: title,
content: content,
isDeleted: isDeleted
}
});
}
}
todo.controller.ts
import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common';
import { TodoService } from '../service/todo.service';
import { Todo } from '@prisma/client';
// 호출 주소
@Controller('api/todo')
export class TodoController {
constructor(private readonly todoService: TodoService) {
}
@Get()
async fetchAllTodos(): Promise<Todo[]> {
return this.todoService.fetchAllTodos();
}
@Get(":id")
async fetchTodoItem(@Param("id") id: Number): Promise<Todo | null> {
return this.todoService.fetchTodoItem(id);
}
@Delete(":id")
async deleteTodoItem(@Param("id") id: Number): Promise<Todo | null> {
return this.todoService.fetchTodoItem(id);
}
@Post()
async createTodoItem(@Body() data: Todo): Promise<Todo> {
return this.todoService.createTodoItem(data);
}
@Put(":id")
async updateTodoItem(@Param("id") id: Number, @Body() data: Todo): Promise<Todo | null> {
return this.todoService.updateTodoItem(id, data.title, data.content, data.isDeleted);
}
}
공식 홈페이지
'NodeJS > NestJS' 카테고리의 다른 글
[ NestJS ] NestJS 시작하기 (3) | 2023.12.21 |
---|