반응형

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
반응형

NestJS 생성하는 방법입니다.

 

nestjs 글로벌 설치

$ npm install -g @nestjs/cli

 

 

프로젝트 생성하기

$ nest new project-name

 

package manager를 선택해줍니다. ( Ex: npm )

 

 

프로젝트 구동하기

$ npm run start
$ npm run start:dev

 

npm run start:dev로 실행할 경우 --watch로 src폴더가 변경되면 자동으로 컴파일을 해줍니다.

 

반응형

'NodeJS > NestJS' 카테고리의 다른 글

[ NestJS ] NestJS Prisma, MySQL 사용하기  (2) 2023.12.21

+ Recent posts