프로그래밍/소프트웨어 개발: Prisma에서 페이징 기능 구현의 복잡성
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- 프론트엔드/백엔드 개발자 (ORM 사용자, 페이징 기능 구현 필요자)
- 난이도: 중간 (ORM의 한계와 대안을 이해하려면 기본적인 Prisma 및 SQL 지식 필요)
핵심 요약
- Prisma는
findMany()
와count()
분리된 쿼리로 페이징 구현 필요 (예:prisma.model.findMany()
및prisma.model.count()
) - 대안으로
Promise.all()
또는$transaction
사용 가능 (성능 고려 시Promise.all()
권장) - 데이터 일관성 문제 발생 가능성 (
INSERT
/DELETE
시 결과 불일치 가능성)
섹션별 세부 요약
1. 페이징 기능 구현의 복잡성
- Prisma는 페이징 시 데이터와 전체 카운트를 동시에 반환하는 기능(
findManyAndCount
)이 없음 - 기본적으로
findMany()
와count()
두 개의 별도 쿼리 필요 findMany()
는 데이터,count()
는 전체 항목 수를 반환
2. 대안 방법과 한계
$transaction
으로 쿼리 실행: 순차적 처리로 성능 저하 가능Promise.all()
로 병렬 처리: 성능 개선 가능하지만, 데이터 일관성 위험 존재- 예시 코드:
```typescript
const [data, count] = await Promise.all([
prisma.model.findMany(),
prisma.model.count(),
]);
```
3. 데이터 일관성 문제
INSERT
/DELETE
가 두 쿼리 사이에 발생할 경우,
- count
값과 data
항목 수 불일치 가능성
- 예: count = 5
, data = 4
4. ORM의 한계와 고찰
- ORM은 복잡한 쿼리 최적화 시 RAW SQL보다 유연성 부족
- Prisma와 같은 툴은 기본 기능의 한계를 인지해야 함
- 다른 도구(예: Cypress)의 한계 사례와 유사한 패턴 관찰
결론
- Prisma 페이징 구현 시
Promise.all()
사용 권장 (성능 개선) - 데이터 일관성 문제 해결을 위해 RAW SQL 고려 필요 (복잡한 시나리오)
- 도구의 한계를 사전에 확인하고, 팀/프로젝트 요구사항에 맞는 기술 스택 선택이 중요