Skip to main content

Command Palette

Search for a command to run...

prisma 설치 및 Next.js 프로젝트에 적용

Published
4 min read
prisma 설치 및 Next.js 프로젝트에 적용

prisma 설치

npm: prisma

npm i prisma

설치를 한 뒤에 사용할 수 있는 명령어는 아래와 같다.

Examples

  Set up a new Prisma project
  $ prisma init

  Generate artifacts (e.g. Prisma Client)
  $ prisma generate

  Browse your data
  $ prisma studio

  Create migrations from your Prisma schema, apply them to the database, generate artifacts (e.g. Prisma Client)
  $ prisma migrate dev

  Pull the schema from an existing database, updating the Prisma schema
  $ prisma db pull

  Push the Prisma schema state to the database
  $ prisma db push

  Validate your Prisma schema
  $ prisma validate

  Format your Prisma schema
  $ prisma format

  Display Prisma version info
  $ prisma version

  Display Prisma debug info
  $ prisma debug

설치가 완료되었다면 아래의 명령어로 prisma를 프로젝트에서 사용할 수 있도록 세팅한다.

npx prisma init

How to Build a Fullstack App with Next.js, Prisma, & PostgreSQL

step 1. .env 파일에 내 데이터베이스 설정하기

  • .env 파일을 생성한 후에 .gitignore파일에 작성해서 git에 올라가지 않도록 주의한다.
DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"

DATABASE_URL="postgresql://[사용자이름]:[사용자비밀번호]@localhost:5432/[데이터베이스 이름]?schema=public"

step 2. prisma 폴더 아래 schema.prisma 파일에서 연결

  • prisma를 설치한 뒤에 npx prisma init 을 하면 생기는 prisma 폴더 아래 파일이다.
// prisma 클라이언트 라이브러리
generator client {
  provider        = "prisma-client-js"
}

// .env 파일에서 저장해놓은 db url, prisma가 연결할 데이터베이스 정보
// 여기서 사용할 db는 postgreSQL
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

step 3. 데이터 모델 설정하기

  • 저는 여기서 사용자 기반 게시판을 만들어서 게시글을 저장할 Post 모델과 사용자를 저장할 User 모델을 작성했습니다.

  • 아래 게시해놓은 prisma models 페이지에 예시와 자세한 설명이 있으니 데이터 모델은 각각 자신의 프로젝트에 맞게 설정해 주세요.

Models

model Post {
  id         Int        @id @default(autoincrement())
  title      String
  content    String?
  createdAt  DateTime   @default(now())
  updatedAt  DateTime   @updatedAt
  author     User   @relation(fields: [authorId], references: [id])
  authorId   String  // 여기 필드가 관계에 사용되고 있기 때문에 옵션 맞춰줘야함.
}

model User {
  id            String     @id
  name          String
  email         String     @unique
  createdAt     DateTime   @default(now())
  posts         Post[]
}
  • id: @id로 기본 키를 나타내고, @default(autoincrement())는 ID 값이 자동으로 1씩 증가하는 값이다.

  • email: String 타입이며, @unique는 이 값이 고유해야 함을 의미한다. id와 마찬가지로 유일한 값이어야 한다.

  • name: String?는 이 필드가 null 값을 허용한다는 의미.

  • author: User 모델과의 관계를 나타낸다.

    • @relation(fields: [authorId], references: [id])는 이 게시글이 User 모델의 id 필드와 Post 모델의 authorId 필드와 연결된다. 게시글의 작성자를 의미한다.

    • User 모델에 있는 사용자만이 작성자가 될 수 있다.

  • createdAt: DateTime 타입이며, 기본 값은 now()로 현재 시간이 자동으로 저장된다.

name String?  // null 값을 가질 수 있음 (옵션 필드)
email String  // 반드시 값이 있어야 함 (필수 필드)

step 4. npx prisma db pushnpx prisma studio

npx prisma db push
  • 위의 명령을 사용해서 우리가 만든 테이블을 push 한다.

  • 에러가 났다면 에러코드를 살펴보고 완료가 되었다면 다음 명령을 사용하여 우리가 만든 테이블을 확인할 수 있다.

  • 또한 bash에서 \\dt 를 확인했을 때 docker에 띄운 postgres와 연결된 것도 확인할 수 있다.

  • push가 완료되었다면 npx prisma studio를 사용하여 웹에서 테이블을 확인할 수 있다.

db pushmigrate dev 의 차이

  • npx prisma db push는 빠르게 데이터베이스 스키마를 적용하고 싶을 때

  • npx prisma migrate dev는 마이그레이션을 통해 변경 사항을 기록, 관리하고 싶을 때(권장)

npx prisma migrate dev --name [migrate file name]

위의 명령어를 진행하며 변경 사항이 파일에 기록된다.

  • 모델을 적용한 뒤에 마이그레이션 진행 후 생성된 파일

  • post 테이블에 새로운 컬럼을 추가했을 때

step 5. prisma client 설치

npm install @prisma/client
  • 스키마가 변경될 때마다 아래의 명령어를 실행한다.
npx prisma generate
💡
prisma schema를 업데이트했을 때 prisma migrate dev  또는 prisma db push 를 사용하여 database schema를 업데이트해야 한다.

step 6. src/lib/db.ts 파일 생성해서 prisma client 사용하기

  • 아래 게시해 놓은 글은 prisma client를 인스턴스화하는 모범 사례를 소개하고 있다.

Best practice for instantiating Prisma Client with Next.js

  • db.ts 파일을 생성한 다음에 아래의 코드를 작성한다.
import { PrismaClient } from '@prisma/client'

const prismaClientSingleton = () => {
  return new PrismaClient()
}

declare const globalThis: {
  prismaGlobal: ReturnType<typeof prismaClientSingleton>;
} & typeof global;

const prisma = globalThis.prismaGlobal ?? prismaClientSingleton()

export default prisma

if (process.env.NODE_ENV !== 'production') globalThis.prismaGlobal = prisma
  • client 인스턴스를 계속 만들어서 사용하지 않고 src/lib/db.ts 경로에서 prisma를 사용한다.
// 이 경로로 import해서 사용한다.
import prisma from "@/lib/db";
  • 그다음에 src/actions/actions.ts 파일을 생성한 다음에 use server 을 작성하여 서버 컴포넌트로 만들고
'use server';

import prisma from "@/lib/db";
import { redirect } from 'next/navigation';

// 게시물 작성
export async function createPost(formData : FormData) {

    await prisma.post.create({
        data: {
          title: formData.get('title') as string,
          content: formData.get('content') as string,
          authorId: formData.get('authorId') as string,
        },
      });
      redirect('/board');
}
  • 위의 코드처럼 함수를 정의해서 prisma를 사용해 post에 데이터를 db에 저장한다.

참고자료

More from this blog

[혼공후기] 재밌으면서도 알찼던 6주! 14기 활동 회고

매번 혼공 학습단을 신청해 봐야겠다고 했지만 기간 놓쳐버리기…또는 너무 바쁜 나머지 완주 못할 것 같아서 포기하다가 때마침 공부가 필요한 시기에 시간이 나서 신청하게 되었다. 공부할 새 책도 배송이 오고 완주할 생각에 기대감 상승. (+중간에 간식 먹을 생각) 참고할 수 있는 강의 영상이 있기 때문에 영상강의 보면서 책 필기 및 정리 이해한 내용을 바탕으로 블로그 정리 이런 방식으로 공부를 했다. 사실 하루에 조금씩 공부했으면 적당한 ...

Aug 23, 20252 min read

[혼공컴운] 6주차_책 한 권을 끝내다니(Ch 14~ 15)

14-1) 연속 메모리 할당 연속 메모리 할당 : 프로세스에 연속적인 메모리 공간을 할당하는 방식 스와핑 : 메모리상의 빈 공간에 또 다른 프로세스를 적재하여 실행하는 방식 스왑 영역 : 프로세스들이 쫓겨나는 보조기억장치의 일부 영역 스왑 아웃 : 현재 실행되지 않는 프로세스가 메모리에서 스왑 영역으로 옮겨지는 것 스왑 인 : 스왑 영역에 있던 프로세스가 다시 메모리로 옮겨오는 것 → 스와핑을 이용하면 프로세스들이 요구하는 메모...

Aug 16, 20259 min read
[혼공컴운] 6주차_책 한 권을 끝내다니(Ch 14~ 15)

[혼공컴운] 5주차_끝이 보인다(Ch 12 ~ 13)

12-1) 동기화란 동시다발적으로 실행되는 많은 프로세스는 서로 데이터를 주고받으며 협력하며 실행된다. ⇒ 협력하여 실행되는 프로세스들은 실행 순서와 자원의 일관성을 보장해야 하기에 반드시 동기화가 필수 프로세스 동기화 : 프로세스들 사이의 수행 시기를 맞추는 것 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기 상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기 공유가 불가능한 자원의 동시 사용을 피하...

Aug 9, 20255 min read
[혼공컴운] 5주차_끝이 보인다(Ch 12 ~ 13)

[혼공컴운] 4주차_운영체제 시작(Ch 09 ~ 11)

09-1) 운영체제를 알아야 하는 이유 운영체제 : 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램 (시스템) 자원 : 프로그램 실행에 마땅히 필요한 요소 컴퓨터가 부팅될 때 메모리 내 커널 영역에 적재 사용자 영역 : 사용자가 이용하는 응용 프로그램이 적재되는 영역 ⇒ 메모리 공간에 주소가 겹치지 않게 프로그램 적재해 준 건? 운영체제 실행할 프로그램 메모리에 적재 실행되지 않...

Jul 26, 20257 min read
[혼공컴운] 4주차_운영체제 시작(Ch 09 ~ 11)

[혼공컴운] 3주차_컴퓨터 구조 끝(Ch 06 ~ 08)

06-1) RAM의 특징과 종류 RAM 휘발성 저장 장치 실행할 대상 저장 보조기억장치 비휘발성 저장 장치 보관할 대상 저장 CPU는 보조기억장치에 직접 접근하지 못하고 RAM으로 복사하여 저장한 뒤 실행. RAM 용량이 적으면 보조기억장치에서 실행할 프로그램을 가져오는 일이 잦아 실행 시간이 길어지기 때문에 RAM용량이 충분히 크면 많은 데이터를 가져와 미리 RAM에 저장하여 프로그램들을 동시에 빠르게 실행하는데 유리하다...

Jul 19, 20258 min read
[혼공컴운] 3주차_컴퓨터 구조 끝(Ch 06 ~ 08)
W

WOW's dev archive

42 posts

언젠가 나에게 힘이 될 차곡차곡 쌓은 기록🥰