TypeScript Prisma CRUD

Prisma ORM을 사용하여 데이터베이스 CRUD(Create, Read, Update, Delete) 작업을 수행하는 TypeScript 유틸리티 패턴입니다.

Gist
import { PrismaClient, User, Prisma } from '@prisma/client';

const prisma = new PrismaClient();

/**
 * 사용자 생성
 */
export async function createUser(data: Prisma.UserCreateInput): Promise<User> {
  return await prisma.user.create({
    data,
  });
}

/**
 * ID로 사용자 조회
 */
export async function getUserById(id: number): Promise<User | null> {
  return await prisma.user.findUnique({
    where: { id },
    include: {
      posts: true, // 관계된 데이터 포함 예시
    },
  });
}

/**
 * 필터링 및 페이징을 포함한 사용자 목록 조회
 */
export async function getUsers(params: {
  skip?: number;
  take?: number;
  cursor?: Prisma.UserWhereUniqueInput;
  where?: Prisma.UserWhereInput;
  orderBy?: Prisma.UserOrderByWithRelationInput;
}) {
  const { skip, take, cursor, where, orderBy } = params;
  return await prisma.user.findMany({
    skip,
    take,
    cursor,
    where,
    orderBy,
  });
}

/**
 * 사용자 정보 업데이트
 */
export async function updateUser(id: number, data: Prisma.UserUpdateInput): Promise<User> {
  return await prisma.user.update({
    where: { id },
    data,
  });
}

/**
 * 사용자 삭제
 */
export async function deleteUser(id: number): Promise<User> {
  return await prisma.user.delete({
    where: { id },
  });
}

/**
 * 트랜잭션 사용 예시
 */
export async function createUserWithProfile(
  userData: Prisma.UserCreateInput,
  profileData: Prisma.ProfileCreateInput
) {
  return await prisma.$transaction(async (tx) => {
    const user = await tx.user.create({ data: userData });
    const profile = await tx.profile.create({
      data: {
        ...profileData,
        userId: user.id,
      },
    });
    return { user, profile };
  });
}