Next.js/당근마켓(Next.js)

Prisma // ORM(Object Relational Mapping)

hihijh826 2024. 2. 16. 15:15
728x90
반응형
SMALL

☑️ 객체지향 프로그래밍 

- 클래스 사용

 

☑️sql (관계형 데이터베이스)

- 테이블 단위로 관리

 

==> 둘 간의 불일치가 존재

 

📍ORM

- ORM을 통해 객체 간의 관계를 바탕으로 sql 자동으로 생성하여 불일치 해결

- 객체를 통해 간접적으로 데베의 데이터를 다룸

- 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑

- 각 테이블 또는 구분하고자 하는 데이터 단위를 객체로 구현하고 데이터 간의 관계를 형성

 

📍prisma

- node.js 쪽의 백앤드에서의 데이터베이스 orm

 

1)세팅 

 

☑️설치방법

 

npm install -D prisma

☑️초기화

 npx prisma init

 

위를 실행하면 기본적인 설정이 만들어짐

 

2) shcema.prisma 파일 생성

1) prisma 의 shcema.prisma 파일 생성

--> 이것이 sql, postgresql 등에서 테이블로 전환 

 

2) .env 파일 생성 

  • .env 파일의 역할: 프로젝트의 환경 변수를 저장하는 파일입니다. 데이터베이스 연결 정보, API 키 등 중요한 정보를 안전하게 관리할 수 있게 해 줍니다.
  • 파일 생성 방법: 프로젝트 루트 경로(최상위 폴더)에 .env 파일을 생성합니다. 윈도우에서 파일명을 .env.로 입력하면 .env 파일이 생성될 수 있습니다. 이 파일에 필요한 환경 변수 값을 정의합니다 

☑️shcema.prisma

generator client {
  provider = "prisma-client-js"
}  //prisma는 백엔드이기에 nexjs와 같은 client 쪽에스 prisma db를 연결하려면 prisma-client 필요

datasource db {
  provider = "postgresql"     //어떤 종류의 db를 쓰는지
  url      = env("DATABASE_URL")    //해당 파일의 url
}

 

//모델 작성 - prisma 사이트

- prisma에서는 테이블을 모델로 작성

https://authjs.dev/reference/adapter/prisma

model User {
  id       Int     @id @default(autoincrement())    //id를 자동을 하나씩 증가
  email    String  @unique
  name     String?
  password String
  posts    Post[]
}

model Post {
  id        Int     @id @default(autoincrement())
  title     String
  content   String?
  published Boolean @default(false)
  author    User    @relation(fields: [authorId], references: [id])
  authorId  Int
}

 

3)코드와 연결

- npx prisma migrate dev --name init

:데이터베이스 스키마 변경 사항을 추적하고 버전 관리하기 위한 마이그레이션 파일을 생성

- npx prisma dp push

:개발 중인 스키마의 최신 상태를 바탕으로 데이터베이스 스키마를 직접 변경하거나 업데이트합니다. 마이그레이션 파일을 생성하지 않으며, 스키마 파일(schema.prisma)에 정의된 상태로 데이터베이스를 동기화

 

4) prisma client 설치

- Next.js에서 prisma 사용 할 수 있도록 

npm install next-auth @prisma/client

 

☑️ lib/prismadb.ts

- prisma client 생성

import { PrismaClient } from "@prisma/client";

declare global {
    var prisma: PrismaClient | undefined;
} //client가 prisma에 할당하기 전

const client = globalThis.prisma || new PrismaClient(); 
//

if(process.env.NODE_ENV !== 'production') globalThis.prisma = client;

export default client;

 

참고 사이트 ) 

https://velog.io/@taemin4u/Next-Auth%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EC%86%8C%EC%85%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0v4

728x90
반응형
LIST