Prisma 시작을: 노드 JS의 최고의 ORM
Emily Parker
Product Engineer · Leapcell

Prisma 튜토리얼: Koa 및 PG 기반 실습
머리말
Prisma는 강력한 타입 안전성을 제공하는 TypeScript를 기반으로 개발된 차세대 ORM(객체 관계 매핑) 도구로 간주됩니다. 이 기사에서는 Koa.js를 사용하여 간단한 웹 서비스를 구축하고 MySQL 데이터베이스와 결합하여 Prisma를 통해 데이터 생성, 읽기, 업데이트 및 삭제(CRUD) 작업을 구현하는 방법을 보여줍니다.
Prisma 개요
Prisma는 차세대 ORM 도구라고 주장합니다. Prisma는 오픈 소스 데이터베이스 툴체인 프로젝트이며 그 기능은 단순한 ORM보다 훨씬 많습니다. PostgreSQL, MySQL, MongoDB, SQL Server 및 SQLite와 같은 여러 데이터베이스를 지원합니다. 이 기사에서는 MySQL을 예로 들어 설명합니다.
Prisma를 처음 사용하는 경우 프로세스가 비교적 번거롭고 대략적으로 다음 단계로 나눌 수 있습니다.
- 종속성 설치
- Prisma 프로젝트 초기화
- Prisma 스키마 설계 (데이터베이스 정보 및 모델 정의)
- 데이터베이스와 동기화
- Prisma 클라이언트 생성
- Prisma 클라이언트를 사용하여 CRUD 작업 완료
다음으로 개발 환경을 먼저 설정한 다음 Prisma를 심층적으로 소개합니다.
환경 초기화
Koa 웹 서비스 구축
먼저 프로젝트 디렉토리를 만들고 종속성을 설치합니다.
mkdir koa-prisma cd koa-prisma pnpm init # Koa 종속성 설치 pnpm add koa @koa/router koa-bodyparser
그 중 @koa/router
는 라우팅 기능을 통합하는 데 편리한 라우팅 미들웨어입니다. koa-bodyparser
는 요청 본문 데이터를 파싱하여 ctx.request.body
객체에 저장하는 데 사용됩니다.
그런 다음 새 index.js
파일을 만들고 간단한 웹 서비스를 구축합니다.
const Koa = require('koa') const Router = require('@koa/router') const bodyParser = require('koa-bodyparser') const app = new Koa() // 라우터를 인스턴스화하고 공통 라우트 접두사를 /users로 설정합니다. const router = new Router({ prefix: '/users' }) app.use(bodyParser()) // 사용자 목록 쿼리 router.get('/', async ctx => { }) // 단일 사용자 쿼리 router.get('/:id', async ctx => { }) // 사용자 생성 router.post('/', async ctx => { }) // 사용자 업데이트 router.patch('/:id', async ctx => { }) // 사용자 삭제 router.delete('/:id', async ctx => { }) // 라우팅 미들웨어 등록 app.use(router.routes()).use(router.allowedMethods()) app.listen(3000, () => { console.log('서버가 포트 3000에서 실행 중입니다.') })
위의 코드는 쿼리, 삽입, 업데이트 및 삭제의 데이터베이스 작업에 해당하는 5가지 라우팅 방법을 정의합니다. Prisma 초기화를 완료하고 나중에 Prisma 클라이언트를 도입한 후 이러한 인터페이스를 구현할 수 있습니다.
nodemon
명령을 사용하여 서비스를 시작합니다. 이 모듈을 전역적으로 설치하는 것이 좋습니다.
nodemon src/index.js
Prisma CLI
Prisma 종속성 설치
먼저 Prisma의 두 가지 종속성 모듈을 설치합니다.
pnpm add -D prisma pnpm add @prisma/client
그 중 prisma
는 데이터베이스 마이그레이션, Prisma 클라이언트 생성 등과 같은 Prisma의 다양한 기능을 호출하는 데 사용되는 CLI 명령입니다. 다음 명령을 실행하여 prisma
의 사용법 지침을 확인합니다.
npx prisma --help
prisma
는 7가지 명령을 제공합니다.
명령 | 설명 |
---|---|
init | 애플리케이션에서 Prisma 초기화 |
generate | 주로 Prisma 클라이언트 생성에 사용됨 |
db | 데이터베이스의 스키마 및 수명 주기 관리 |
migrate | 데이터베이스 마이그레이션 |
studio | 웹 기반 작업대를 시작하여 데이터 관리 |
validate | Prisma 스키마 파일의 구문이 올바른지 확인 |
format | Prisma 스키마 파일을 포맷합니다. 기본적으로 prisma/schema.prisma 입니다. |
이 기사에서는 이러한 명령 중 세 가지만 주로 사용하며 나머지 명령은 직접 탐색할 수 있습니다.
Prisma 초기화
다음 명령을 실행하여 초기화를 완료합니다.
npx prisma init
이 명령은 현재 디렉터리에 .env
파일과 prisma
디렉터리를 만들고 prisma
디렉터리에 schema.prisma
파일을 만듭니다.
.env
파일은 환경 변수를 저장하는 데 사용되며 일반적으로 일부 구성 정보가 포함되어 있습니다. prisma
디렉터리는 Prisma와 관련된 파일을 저장하는 데 사용됩니다. 현재는 schema.prisma
파일만 있습니다. 이 파일은 데이터베이스 연결 정보 및 모델을 정의하는 데 사용되는 Prisma 스키마 파일입니다.
Prisma 스키마 설계
VSC 플러그인 설치
스키마 파일을 편집하기 전에 VS Code에 Prisma 플러그인을 설치하는 것이 좋습니다. 이 플러그인은 코드 강조 표시, 포맷, 자동 완성, 정의로 이동 및 .prisma
파일 확인과 같은 기능을 제공하여 개발 경험을 크게 향상시킵니다.
생성기 설정
generate
를 사용하여 생성기를 정의하고 provider
속성을 통해 prisma-client-js
로 선언합니다(현재는 이것만 지원됨). prisma generate
명령이 실행되면 데이터의 CRUD 작업을 완료하는 데 사용되는 Prisma 클라이언트가 생성됩니다.
generator client { provider = "prisma-client-js" }
데이터 소스 설정
datasource
를 사용하여 데이터 소스를 정의하고 Prisma가 데이터베이스에 연결하는 데 필요한 정보를 설정합니다. provider
는 연결된 데이터베이스의 유형을 지정합니다. 기본적으로 postgresql
입니다. 이를 mysql
로 변경합니다. url
은 데이터베이스 URL을 지정합니다. 구성을 분리하기 위해 일반적으로 .env
파일에 정의하고 env()
함수를 통해 읽습니다.
datasource db { provider = "mysql" url = env("DATABASE_URL") }
기본 .env
파일의 데이터베이스 연결은 Postgresql용입니다.
DATABASE_URL=postgresql://johndoe:mypassword@localhost:5432/mydb?schema=public
MySQL 데이터베이스 연결 URL은 다음 필수 항목으로 구성됩니다.
이름 | 자리 표시자 | 설명 |
---|---|---|
호스트 | HOST | 데이터베이스의 IP 또는 도메인 이름(예: localhost) |
포트 | PORT | 데이터베이스 포트(예: 3306) |
사용자 | USER | 데이터베이스 사용자 이름(예: root) |
암호 | PASSWORD | 데이터베이스 암호 |
데이터베이스 | DATABASE | 데이터베이스 이름(예: mydb) |
위의 규칙에 따라 MySQL URL을 정의합니다.
DATABASE_URL="postgresql://leapcell:leapcell123@localhost:9006/prisma"
사용자 모델 정의
ORM 도구로서 Prisma의 모델은 다음과 같은 기능을 수행합니다.
- 애플리케이션 도메인의 엔터티 형성
- 데이터베이스 테이블(PostgreSQL과 같은 관계형 데이터베이스) 또는 컬렉션(MongoDB)에 매핑
- Prisma 클라이언트 API에서 쿼리의 기반 형성
- TypeScript에서 Prisma 클라이언트는 모델 및 해당 변형에 대한 유형 정의를 제공하여 데이터베이스 액세스의 유형 안전성 보장
모델을 정의할 때 Prisma의 내장 유틸리티 함수 (예: @id()
및 @default()
)가 사용됩니다. 예를 들어 @id()
는 기본 키를 선언하는 데 사용되고 @default()
는 기본값을 설정하는 데 사용됩니다. 다음은 사용자 모델의 정의입니다.
model User { id Int @id @default(autoincrement()) name String email String @unique password String createdTime DateTime @default(now()) @map("created_time") updatedTime DateTime @updatedAt @map("updated_time") @@map("user") }
다음 사항에 유의해야 합니다.
- 모델 이름은 기본적으로 생성된 데이터 테이블의 이름입니다. 여기서 모델 이름은
User
이고@@map("user")
를 통해 테이블 이름을 소문자user
로 설정할 수 있습니다. - 각 모델에는 기본 키가 있어야 하며
@id
를 사용하여 선언됩니다. - Prisma는 필드 유형(
Int
,String
등)을 데이터베이스의 해당 유형(int
및varchar
등)으로 변환합니다. @unique
는 고유 값 제약 조건을 나타내며user
테이블의email
필드 값은 반복될 수 없습니다.- JS, TS 및 데이터베이스의 명명 규칙을 준수하려면
@map()
을 사용하여 생성 시간 및 업데이트 시간의 명명법을 매핑합니다.
데이터베이스 동기화
새 프로젝트의 경우 다음 명령을 사용하여 Prisma 모델을 데이터베이스와 동기화할 수 있습니다.
npx prisma db push
프로젝트에 이미 데이터가 있는 경우 마이그레이션에 prisma migrate
를 사용해야 합니다. 이 기사에서는 다루지 않습니다.
prisma db push
명령은 데이터베이스의 스키마를 만들고 Prisma 스키마를 사용하여 데이터베이스를 동기화하고 prisma generate
명령을 자동으로 실행하여 Prisma 클라이언트를 생성합니다.
Prisma 클라이언트 생성
데이터베이스를 동기화할 때 prisma generate
명령이 실행되었습니다. 나중에 모델 수정과 같이 Prisma 스키마 파일이 변경되면 Prisma 클라이언트를 다시 생성하기 위해 이 명령을 다시 실행해야 합니다.
CRUD 작업
Prisma 클라이언트 초기화
Prisma 클라이언트를 사용하면 CRUD 작업을 실행할 수 있습니다. 초기화 코드는 다음과 같습니다.
const { PrismaClient } = require('@prisma/client') const prisma = new PrismaClient()
Prisma 클라이언트 인스턴스 prisma
는 풍부한 유형을 가지고 있으며 사용법은 prisma.model.CRUD method
입니다. 일반적으로 사용되는 API는 다음과 같습니다.
findMany
: 여러 레코드 쿼리findUnique
: 단일 레코드 쿼리create
: 레코드 생성update
: 레코드 업데이트delete
: 레코드 삭제
API를 사용하여 인터페이스 개발 완료
사용자 목록 쿼리
findMany
에 매개변수가 전달되지 않으면 전체 user
테이블의 모든 레코드를 쿼리하고 User 모델 인스턴스 배열을 반환합니다.
router.get('/', async ctx => { const users = await prisma.user.findMany() ctx.body = users })
단일 사용자 쿼리
findUnique
메서드의 where
를 통해 쿼리 조건을 설정하고 지정된 ID에 따라 사용자 레코드를 쿼리하여 User 모델 인스턴스를 반환합니다.
// 단일 사용자 쿼리 router.get('/:id', async ctx => { const id = parseInt(ctx.params.id) const user = await prisma.user.findUnique({ where: { id } }) ctx.body = user })
ctx.params.id
에서 얻은 ID는 문자열 유형이며 쿼리하기 전에 정수 유형으로 변환해야 합니다.
사용자 생성
create
메서드를 사용하여 데이터를 삽입하고 요청 본문에서 구문 분석된 데이터(User 모델을 설명하는 객체)를 data
속성에 할당합니다.
router.post('/', async ctx => { const user = ctx.request.body const newUser = await prisma.user.create({ data: user }) ctx.body = newUser })
사용자 업데이트
update
메서드를 사용하고 where
를 통해 쿼리 조건을 설정하고 대상 사용자를 쿼리한 후 업데이트할 데이터를 data
에 할당합니다.
router.patch('/:id', async ctx => { const id = parseInt(ctx.params.id) const updateUser = ctx.request.body const user = await prisma.user.update({ where: { id }, data: updateUser }) ctx.body = user })
사용자 삭제
delete
메서드를 사용하고 where
를 통해 삭제할 레코드에 대한 쿼리 조건을 설정합니다.
router.delete('/:id', async ctx => { const id = parseInt(ctx.params.id) const user = await prisma.user.delete({ where: { id } }) ctx.body = user })
update
및 delete
메서드를 사용할 때는 반드시 where
조건을 설정해야 합니다. 그렇지 않으면 데이터 테이블의 모든 레코드가 업데이트되거나 삭제되어 위험합니다.
결론
이 기사에서는 사용자 생성, 읽기, 업데이트 및 삭제의 예를 통해 Koa 프로젝트에서 Prisma의 기본 사용법을 보여줍니다. 전체 프로세스는 다음과 같이 요약할 수 있습니다.
- 종속성 설치
- Prisma 초기화
- Prisma 스키마 설정
- 데이터베이스 동기화
- Prisma 클라이언트 생성
- Prisma 클라이언트를 사용하여 CRUD 구현
Leapcell: 최고의 서버리스 웹 호스팅
마지막으로 nodejs 서비스를 배포하는 데 가장 적합한 플랫폼인 **Leapcell**을 추천합니다.
🚀 즐겨 사용하는 언어로 빌드
JavaScript, Python, Go 또는 Rust로 간편하게 개발하십시오.
🌍 무료로 무제한 프로젝트 배포
사용한 만큼만 지불하세요. 요청이나 요금이 없습니다.
⚡ 사용량에 따라 지불, 숨겨진 비용 없음
유휴 요금이 없으며 원활한 확장성만 제공됩니다.
🔹 Twitter에서 팔로우하세요: @LeapcellHQ