Prisma 와 Supabase 사용해보기
블로그글들을 찾아보다 Supbase를 사용할 때 Prisma와 사용한다는 글을
많이 보게 되어서 이번에 Prisma와 같이 Supbase를 사용해보려고 한다.
https://zoon-bloom.tistory.com/114
Prisma 랑 친해지기
Next 강의를 들으면서 Prisma를 사용하게 되었다 백엔드 쪽까지 손을 보기로 작정을 하고! 이 Prisma는 무엇인지 알아보기로 했다. Prisma 공식문서 : https://www.prisma.io/docs/concepts/overview/what-is-prisma What is
zoon-bloom.tistory.com
해당 블로그에서 prisma 사용법이 자세히 나와있어 따라 해보았다.
참고블로그 : https://www.heropy.dev/p/bCffI2
Supabase Database, Prisma로 빠르게 시작하기 w. Next.js
오픈소스 백엔드 서비스인 Supabase의 PostgreSQL 데이터베이스와 Prisma를 사용해 Next.js 프로젝트를 빠르고 쉽게 구성하고 다루는 방법을 알아봅니다.
www.heropy.dev
prisma와 prisma client 설치
- @prisma/client는 Prisma의 자동 생성된 데이터베이스 클라이언트 라이브러리
- Prisma 스키마 파일(. prisma)에 정의된 모델을 기반으로,
타입 안전한 쿼리 메서드를 제공하며
데이터베이스에서 데이터를 조회하거나 삽입하는 등의 작업을 쉽게 할 수 있음
npm i -D prisma
npm i @prisma/client
Prisma 초기화 설정
프로젝트에 /rpisma/schema 파일과 /. env 파일을 자동을 생성해 준다
npx prisma init
Supbase 프로젝트 생성
데이터베이스 비밀번호는 클라이언트에서 연결 문제가 발생할 수 있어
특수문자를 제외하고 영어 대소문자로만 작성하는 것을 추천한다고 함!
. env 파일 설정
env 파일에 DATABASE_URL 변수와 DIRECT_URL 변수를 생성 후
Database Settings 페이지에서 Connection String을 복사해 env 파일에
DATABASE_URL와 DIRECT_URL 변수에 값을 설정한다.
이때 [YOUR-PASSWORD] 부분에 프로젝트 생성 시
설정했던 비밀번호를 입력한다. [ ]는 제외해야 함!
DATABASE_URL에 포트번호를 6543 변경 후?
pgbouncer=true 쿼리스트링을 추가한다.
pgbouncer 옵션은 자동으로 커넥션 풀링을 활성화하고, 호환성을 보장하며
클라이언트 연결 처리 시간 단축 및 리소스 최적화 등의 기능을 제공한다고 함
커넥션 풀링이란?
- 커넥션 풀링은 데이터베이스와의 연결을 재사용하여, 새로운 연결을 맺는 데 드는 오버헤드를 줄이는 기술
- 많은 동시 연결이 필요한 상황에서 서버의 성능을 최적화하는데 중요한 역할.
- 데이터베이스에 대한 연결을 반복적으로 여닫는 대신,
이미 열려있는 연결을 풀(pool)에서 가져와 재사용하는 방식으로 작동한다.
PgBouncer란?
- PostgreSQL 데이터베이스에 특화된 경량의 커넥션 풀러(connection pooler)
- PostgreSQL은 커넥션을 여는 비용이 높은 편이므로, PgBouncer를 사용해
커넥션 풀링을 설정하면 성능이 크게 향상될 수 있음 - PgBouncer는 서버와 데이터베이스 간에 프록시 역할을 하며,
클라이언트의 연결 요청을 받아 내부적으로 관리하는
연결 풀에서 적절한 연결을 제공
추가로 prisma/schema.prisma 아 datasource db 부분에 객체를 수정
Supabase 테이블 생성
DB 스키마 가져오기
npx prisma db pull
이 명령어를 실행하게되면 prisma/schema.prisma에
추가한 테이블의 정보가 자동으로 추가된다.
Prisma Client 생성
npx prisma generate
이 명령어로 Prisma client를 생성해야 데이터베이스에 대한 타입
세이프한 쿼리를 작성할 수 있다고 한다.
프로젝트를 배포할 때나 서버 빌드 시에도 Prisma Client를 생성하도록
package.json 파일도 다음과 같이 변경!
{
"scripts": {
"postinstall": "prisma generate"
}
}
데이터 생성
supabase에서 content 라는 text행을 추가한 후
GET route api 작성하여 테스트
이미지와 같이 테스트용으로 route api 생성 후
await.prisma.post.create 라는 메소드를 사용하게 되면
http://localhost:3000/api/post/ 접속하면
Supabase테이블에 새로운 행이 추가된다.
만약 Supabase에서 존재하지 않는 행을 추가하려고 시도하면 타입 에러가 발생한다.
로컬에서 스키마 수정하기
npx prisma db push
해당 명령어를 통해서 Supbase에서 직접 테이블을 변경하지 않고도
로컬에서 prisma/schema.prisma를 변경하여 테이블 변경이 가능하다.
updated_at을 추가하여 npx prisma db push 명령어를 로컬에서 실행하면
Supbase 테이블에 updated_at 컬럼이 추가되는 것을 볼 수 있다.
Prisma Studio
로컬에서 데이터베이스를 시각적으로 확인 및 수정이 가능하게 도와주는 GUI 도구
npx prisma studio
이미지와 같이 localhost:5555 에서 현재 연결된 테이블들을
수정 및 확인이 가능하다.
Prisma Migrate 테이블 적용하고 기록하기
schema.prisma 파일에서 정의한 데이터베이스 모델들을 개발환경에서
마이그레이션 파일을 생성하여 데이터베이스로 적용이 가능하며
버젼 기록도 가능!
npx prisma migrate dev --name init
먼저 이 명령어로 정의한 prisma 모델들의 마이그레이션 파일들을 생성한다.
그럼 이미지와 같이 migrations 폴더가 생기고 그 안에
날짜와 함께 적용시킨 모델파일이 생성된다.
Migrate 롤백(되돌리기)
모든 마이그레이션을 롤백하고 데이터베이스를 초기 상태로 되돌린다.
npx prisma migrate reset
Migrate 상태 확인
데이터베이스에 적용된 마이그레이션 목록과 현재 상태를 보여준다.
npx prisma migrate status
Prisma docs 문서 : https://www.prisma.io/docs/orm/reference/prisma-client-reference
Prisma Client API | Prisma Documentation
API reference documentation for Prisma Client.
www.prisma.io