BE
[Node.js] Prisma 기본 사용법과 주요 API 소개
시작하며
Prisma는 직관적이고 강력한 ORM(Object Relational Mapping) 도구로, 데이터베이스를 코드로 쉽게 다룰 수 있게 해주는 도구이다.
SQL 쿼리를 직접 작성하지 않아도, 타입 안전성과 자동 완성 기능을 활용하여 데이터를 손쉽게 다룰 수 있다는 장점이 있다.
이번 글에서는 Prisma의 대표적인 CRUD API와 간단한 사용 예시를 살펴보도록 하겠다.
아래 예시만 이해해도, 웬만한 데이터베이스 작업은 코드 몇 줄로 끝낼 수 있다.
데이터 조회 (Read)
데이터를 조회하는 것은 모든 애플리케이션에서 가장 많이 하는 작업 중 하나이다.
Prisma에서는 findMany()와 findUnique() 메서드가 가장 기본적인 조회 방법이다.
1) findMany()
: 여러 개의 레코드를 조회할 때 사용한다. 조건을 주지 않으면 모든 데이터를 불러온다.
const users = await prisma.user.findMany();
console.log(users);위 코드를 실행하면 User 테이블에 저장된 모든 행이 배열 형태로 반환된다.
조건, 정렬, 페이징 등 다양한 옵션도 함께 사용할 수 있다.
const activeUsers = await prisma.user.findMany({
where: { isActive: true },
orderBy: { createdAt: 'desc' },
});예를 들어, 위 코드는 활성 상태인 유저를 생성일 기준 내림차순으로 조회한다.
실무에서는 검색 조건과 정렬 조건을 조합해 원하는 데이터를 효율적으로 가져올 수 있다.
2) findUnique()
: 특정 조건(주로 PK 또는 Unique 컬럼)으로 단일 레코드를 조회한다.
const user = await prisma.user.findUnique({
where: { id: 'ckq1abc123' },
});findUnique는 반드시 고유한 값(Primary Key, Unique 제약이 걸린 값)으로만 조회할 수 있다.
예전 Prisma 1/2 버전에서는 findOne이라는 이름이었으나, 현재는 findUnique로 변경되었다.
데이터 생성 (Create)
데이터를 추가하는 작업은 create() 메서드로 할 수 있다.
1) create()
: 새로운 레코드를 삽입한다.
const newUser = await prisma.user.create({
data: {
email: 'test@example.com',
name: '홍길동',
},
});data 객체 안에 삽입할 값을 지정하면 된다.
관계가 있는 경우에는 connect나 create를 사용해 중첩 생성도 가능하다.
await prisma.post.create({
data: {
title: '첫 글',
author: { connect: { id: 'ckq1abc123' } }, // 기존 유저 연결
},
});위 예시는 이미 존재하는 유저(id = 'ckq1abc123')를 작성자로 연결하여 새로운 게시글을 만드는 경우이다.
데이터 수정 (Update)
데이터를 변경할 때는 update() 메서드를 사용한다.
1) update()
: 특정 조건에 맞는 레코드를 수정한다.
const updatedUser = await prisma.user.update({
where: { id: 'ckq1abc123' },
data: { name: '김철수' },
});where로 수정할 대상을 지정하고, data로 수정할 값을 넣으면 된다.
PK나 Unique 키로만 where 조건을 줄 수 있다는 점을 기억해야 한다.
데이터 삭제 (Delete)
데이터를 삭제할 때는 delete()를 사용한다.
1) delete()
: 특정 조건의 레코드를 삭제한다.
await prisma.user.delete({
where: { id: 'ckq1abc123' },
});이 역시 where 조건에 PK나 Unique 컬럼을 넣어야 한다.
조건 없이 전체를 삭제하려면 deleteMany()를 사용해야 한다.
그 외 유용한 메서드
Prisma는 CRUD 외에도 편리한 메서드를 많이 제공한다.
1) upsert()
: 존재하면 업데이트, 없으면 생성한다.
await prisma.user.upsert({
where: { email: 'test@example.com' },
create: { email: 'test@example.com', name: '홍길동' },
update: { name: '홍길동(수정됨)' },
});이 메서드는 회원 가입 또는 정보 갱신을 동시에 처리할 때 유용하다.
2) count()
: 조건에 맞는 레코드 개수를 조회한다.
const total = await prisma.user.count({
where: { isActive: true },
});예를 들어, 위 코드는 활성 상태인 유저가 몇 명인지 계산한다.
3) deleteMany() / updateMany()
: 여러 레코드를 한 번에 삭제하거나 수정할 때 사용한다.
await prisma.user.deleteMany({ where: { isActive: false } });여러 건을 동시에 처리해야 할 때 효율적이다.
다만 updateMany는 수정 후 변경된 개수만 반환하고, 변경된 데이터 내용은 반환하지 않는다.
마무리
Prisma는 단순 CRUD부터 복잡한 관계 조인, 트랜잭션 처리까지 지원하는 강력한 ORM이었다.
오늘 살펴본 API만 알아도 대부분의 데이터 작업을 간단하게 처리할 수 있으며, 추가로 include, select, transaction 같은 기능까지 익히면 훨씬 더 강력한 쿼리를 작성할 수 있다.
Prisma의 장점은 타입 안전성, 직관적인 문법, 그리고 자동 완성 지원이었다.
한 번 구조를 익혀두면, SQL을 직접 작성할 때보다 훨씬 빠르고 안정적으로 데이터베이스 작업을 수행할 수 있을 것이다.