0269

BE

[Node.js] Prisma 기본 사용법과 주요 API 소개

시작하며

Prisma는 직관적이고 강력한 ORM(Object Relational Mapping) 도구로, 데이터베이스를 코드로 쉽게 다룰 수 있게 해주는 도구이다.

SQL 쿼리를 직접 작성하지 않아도, 타입 안전성과 자동 완성 기능을 활용하여 데이터를 손쉽게 다룰 수 있다는 장점이 있다.

이번 글에서는 Prisma의 대표적인 CRUD API와 간단한 사용 예시를 살펴보도록 하겠다.

아래 예시만 이해해도, 웬만한 데이터베이스 작업은 코드 몇 줄로 끝낼 수 있다.

데이터 조회 (Read)

데이터를 조회하는 것은 모든 애플리케이션에서 가장 많이 하는 작업 중 하나이다.

Prisma에서는 findMany()findUnique() 메서드가 가장 기본적인 조회 방법이다.

1) findMany()

: 여러 개의 레코드를 조회할 때 사용한다. 조건을 주지 않으면 모든 데이터를 불러온다.

JavaScript
const users = await prisma.user.findMany();
console.log(users);

위 코드를 실행하면 User 테이블에 저장된 모든 행이 배열 형태로 반환된다.

조건, 정렬, 페이징 등 다양한 옵션도 함께 사용할 수 있다.

JavaScript
const activeUsers = await prisma.user.findMany({
  where: { isActive: true },
  orderBy: { createdAt: 'desc' },
});

예를 들어, 위 코드는 활성 상태인 유저를 생성일 기준 내림차순으로 조회한다.

실무에서는 검색 조건과 정렬 조건을 조합해 원하는 데이터를 효율적으로 가져올 수 있다.

2) findUnique()

: 특정 조건(주로 PK 또는 Unique 컬럼)으로 단일 레코드를 조회한다.

code
const user = await prisma.user.findUnique({
  where: { id: 'ckq1abc123' },
});

findUnique는 반드시 고유한 값(Primary Key, Unique 제약이 걸린 값)으로만 조회할 수 있다.

예전 Prisma 1/2 버전에서는 findOne이라는 이름이었으나, 현재는 findUnique로 변경되었다.

데이터 생성 (Create)

데이터를 추가하는 작업은 create() 메서드로 할 수 있다.

1) create()

: 새로운 레코드를 삽입한다.

JavaScript
const newUser = await prisma.user.create({
  data: {
    email: 'test@example.com',
    name: '홍길동',
  },
});

data 객체 안에 삽입할 값을 지정하면 된다.

관계가 있는 경우에는 connectcreate를 사용해 중첩 생성도 가능하다.

JavaScript
await prisma.post.create({
  data: {
    title: '첫 글',
    author: { connect: { id: 'ckq1abc123' } }, // 기존 유저 연결
  },
});

위 예시는 이미 존재하는 유저(id = 'ckq1abc123')를 작성자로 연결하여 새로운 게시글을 만드는 경우이다.

데이터 수정 (Update)

데이터를 변경할 때는 update() 메서드를 사용한다.

1) update()

: 특정 조건에 맞는 레코드를 수정한다.

JavaScript
const updatedUser = await prisma.user.update({
  where: { id: 'ckq1abc123' },
  data: { name: '김철수' },
});

where로 수정할 대상을 지정하고, data로 수정할 값을 넣으면 된다.

PK나 Unique 키로만 where 조건을 줄 수 있다는 점을 기억해야 한다.

데이터 삭제 (Delete)

데이터를 삭제할 때는 delete()를 사용한다.

1) delete()

: 특정 조건의 레코드를 삭제한다.

JavaScript
await prisma.user.delete({
  where: { id: 'ckq1abc123' },
});

이 역시 where 조건에 PK나 Unique 컬럼을 넣어야 한다.

조건 없이 전체를 삭제하려면 deleteMany()를 사용해야 한다.

그 외 유용한 메서드

Prisma는 CRUD 외에도 편리한 메서드를 많이 제공한다.

1) upsert()

: 존재하면 업데이트, 없으면 생성한다.

JavaScript
await prisma.user.upsert({
  where: { email: 'test@example.com' },
  create: { email: 'test@example.com', name: '홍길동' },
  update: { name: '홍길동(수정됨)' },
});

이 메서드는 회원 가입 또는 정보 갱신을 동시에 처리할 때 유용하다.

2) count()

: 조건에 맞는 레코드 개수를 조회한다.

JavaScript
const total = await prisma.user.count({
  where: { isActive: true },
});

예를 들어, 위 코드는 활성 상태인 유저가 몇 명인지 계산한다.

3) deleteMany() / updateMany()

: 여러 레코드를 한 번에 삭제하거나 수정할 때 사용한다.

JavaScript
await prisma.user.deleteMany({ where: { isActive: false } });

여러 건을 동시에 처리해야 할 때 효율적이다.

다만 updateMany는 수정 후 변경된 개수만 반환하고, 변경된 데이터 내용은 반환하지 않는다.

마무리

Prisma는 단순 CRUD부터 복잡한 관계 조인, 트랜잭션 처리까지 지원하는 강력한 ORM이었다.

오늘 살펴본 API만 알아도 대부분의 데이터 작업을 간단하게 처리할 수 있으며, 추가로 include, select, transaction 같은 기능까지 익히면 훨씬 더 강력한 쿼리를 작성할 수 있다.

Prisma의 장점은 타입 안전성, 직관적인 문법, 그리고 자동 완성 지원이었다.

한 번 구조를 익혀두면, SQL을 직접 작성할 때보다 훨씬 빠르고 안정적으로 데이터베이스 작업을 수행할 수 있을 것이다.