아폴로 서버는 GraphQL API를 구축하는 데 사용되는 강력한 도구입니다. 데이터베이스 트랜잭션을 처리하는 방법에 대해 알아보겠습니다. 이를 통해 한 번에 여러 개의 데이터베이스 작업을 수행하고 실패 시 롤백하는 등의 기능을 구현할 수 있습니다.
1. Prisma Client 사용하기
Prisma는 데이터베이스 작업을 수행하는 데 도움이 되는 ORM(Object-Relational Mapping) 도구입니다. Prisma를 사용하여 아폴로 서버에서 데이터베이스 트랜잭션을 처리할 수 있습니다. 다음은 Prisma Client를 사용하여 트랜잭션을 실행하는 예제입니다.
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function performDatabaseTransaction() {
const transaction = await prisma.$transaction([
prisma.user.create({
data: {
name: "John",
email: "john@example.com",
},
}),
prisma.post.create({
data: {
title: "Hello World",
content: "This is my first post.",
},
}),
]);
console.log(transaction); // 트랜잭션 결과 출력
}
performDatabaseTransaction()
.catch((error) => {
console.error(error); // 에러 핸들링
})
.finally(async () => {
await prisma.$disconnect(); // Prisma Client 연결 종료
});
위 코드는 Prisma Client를 사용하여 user
와 post
라는 두 개의 데이터베이스 작업을 트랜잭션으로 실행하는 예제입니다. $transaction
함수는 주어진 배열의 작업들을 한꺼번에 실행하며, 만약 작업 중 어느 하나라도 실패할 경우 모든 작업을 롤백합니다.
2. 데이터베이스 트랜잭션 예외 처리
트랜잭션 작업 중 예외가 발생할 수 있습니다. 이러한 예외를 처리하기 위해 try-catch
구문을 사용하여 예외를 잡아낼 수 있습니다. 예를 들어, 위의 코드에서 performDatabaseTransaction
함수를 다음과 같이 수정하여 예외 처리를 추가할 수 있습니다.
async function performDatabaseTransaction() {
try {
const transaction = await prisma.$transaction([
// 작업들
]);
console.log(transaction); // 트랜잭션 결과 출력
} catch (error) {
console.error("트랜잭션 실패:", error); // 에러 핸들링
} finally {
await prisma.$disconnect(); // Prisma Client 연결 종료
}
}
위 코드에서 try
블록은 트랜잭션 작업을 실행하고, catch
블록은 예외가 발생한 경우 에러를 처리합니다. finally
블록은 항상 실행되며 Prisma Client와의 연결을 종료합니다.
3. 참고 자료
위의 참고 자료는 Prisma, 아폴로 서버 및 GraphQL에 대한 상세한 정보와 문서를 제공합니다.