본문으로 건너뛰기

Cursor 데이터베이스 개발: SQL, ORM 및 Prisma 통합

Cursor Database Development

데이터베이스 개발은 현대 소프트웨어 엔지니어링의 핵심 부분이며, Cursor의 AI 기능을 통해 스키마 설계, 쿼리 작성, ORM 통합을 획기적으로 가속화할 수 있습니다. 이 가이드에서는 SQL 편집, ORM 설정, 마이그레이션, AI 기반 데이터베이스 최적화를 위한 실무 워크플로우를 다룹니다.

사전 요구 사항​

시작하기 전에 다음이 필요합니다:

  • Cursor 설치 (최신 버전 권장)
  • 로컬 또는 원격에서 실행 중인 데이터베이스 서버 (PostgreSQL, MySQL 또는 SQLite)
  • Node.js 설치 (ORM 도구용)
  • SQL 및 데이터베이스 개념에 대한 기본 이해

Cursor에서 데이터베이스 프로젝트 설정하기​

프로젝트 구조​

AI 컨텍스트를 최적화하기 위해 데이터베이스 관련 파일을 체계적으로 정리하세요:

project/
prisma/
schema.prisma # Prisma 스키마
migrations/ # 마이그레이션 파일
src/
db/
connection.ts # 데이터베이스 연결
queries/ # 원시 SQL 쿼리
repositories/ # 데이터 접근 계층
scripts/
seed.ts # 데이터베이스 시딩
docker-compose.yml # 로컬 데이터베이스 설정

Cursor에서 프로젝트 열기​

cd ~/my-database-project
cursor .

Cursor를 활용한 SQL 편집​

복잡한 쿼리 작성​

Cursor는 SQL 생성 및 최적화에 탁월합니다. 자연어 프롬프트를 사용하세요:

지난 30일간 총 주문 금액 기준 상위 5명의 고객을 찾는 PostgreSQL 쿼리를 작성해주세요.
이름, 이메일, 총 지출액을 포함해야 합니다.

Cursor가 생성한 결과:

SELECT
c.id,
c.name,
c.email,
SUM(o.total_amount) AS total_spent
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.created_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY c.id, c.name, c.email
ORDER BY total_spent DESC
LIMIT 5;

쿼리 최적화​

느린 쿼리를 붙여넣고 Cursor에게 최적화를 요청하세요:

이 쿼리가 100만 행 테이블에서 3초 이상 걸립니다. 최적화해주세요:
[쿼리 붙여넣기]

Cursor는 인덱스 제안, 쿼리 재작성, 성능 개선 사항을 설명해 드립니다.

SQL 파일 지원​

Cursor는 .sql 파일에 대해 구문 강조 및 IntelliSense를 제공합니다:

  1. .sql 파일 생성
  2. Cursor가 자동으로 SQL 언어 모드를 활성화
  3. Ctrl+Space로 테이블 및 열 이름 자동 완성 사용
전문가 팁

재사용 가능한 쿼리 패턴을 .sql 파일에 저장하세요. Cursor는 이를 인덱싱하고 새 쿼리 생성 시 참조할 수 있습니다.

Prisma 통합​

Prisma 설정​

프로젝트에서 Prisma 초기화:

npm install prisma @prisma/client
npx prisma init

AI를 활용한 스키마 설계​

자연어로 데이터 모델을 설명하세요:

다음을 포함하는 전자상거래 애플리케이션을 위한 Prisma 스키마를 설계해주세요:
- 사용자 (역할: 관리자, 고객, 판매자)
- 상품 (카테고리, 재고 추척)
- 주문 (상태, 배송 세부정보)
- 리뷰 (상품 및 사용자와 연결)

Cursor가 생성한 결과:

model User {
id Int @id @default(autoincrement())
email String @unique
name String
role Role @default(CUSTOMER)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt

orders Order[]
reviews Review[]
}

enum Role {
ADMIN
CUSTOMER
SELLER
}

model Product {
id Int @id @default(autoincrement())
name String
description String?
price Decimal @db.Decimal(10, 2)
inventory Int @default(0)
categoryId Int

category Category @relation(fields: [categoryId], references: [id])
reviews Review[]
orderItems OrderItem[]
}

model Category {
id Int @id @default(autoincrement())
name String @unique
products Product[]
}

model Order {
id Int @id @default(autoincrement())
status OrderStatus @default(PENDING)
total Decimal @db.Decimal(10, 2)
createdAt DateTime @default(now())
userId Int

user User @relation(fields: [userId], references: [id])
orderItems OrderItem[]
}

enum OrderStatus {
PENDING
PROCESSING
SHIPPED
DELIVERED
CANCELLED
}

model OrderItem {
id Int @id @default(autoincrement())
quantity Int
unitPrice Decimal @db.Decimal(10, 2)
orderId Int
productId Int

order Order @relation(fields: [orderId], references: [id])
product Product @relation(fields: [productId], references: [id])
}

model Review {
id Int @id @default(autoincrement())
rating Int
comment String?
createdAt DateTime @default(now())
userId Int
productId Int

user User @relation(fields: [userId], references: [id])
product Product @relation(fields: [productId], references: [id])

@@unique([userId, productId])
}

마이그레이션 생성​

스키마 변경 후 마이그레이션을 생성하고 적용하세요:

npx prisma migrate dev --name add_user_roles

Cursor를 사용하여 마이그레이션 파일을 적용 전에 검토하세요:

이 마이그레이션 파일에서 잠재적인 데이터 손실이나 문제를 검토해주세요:
[migration.sql 내용 붙여넣기]

Prisma 클라이언트 쿼리​

AI 도움을 받아 타입 안전한 쿼리를 생성하세요:

사용자의 모든 주문을 상품 세부정보와 함께 가져오는 Prisma 쿼리를 작성해주세요
const userOrders = await prisma.order.findMany({
where: { userId: 1 },
include: {
orderItems: {
include: {
product: {
select: {
name: true,
price: true,
},
},
},
},
},
orderBy: {
createdAt: 'desc',
},
});

TypeORM 및 Sequelize 워크플로우​

TypeORM 설정​

// src/db/data-source.ts
import { DataSource } from 'typeorm';
import { User } from './entities/User';
import { Order } from './entities/Order';

export const AppDataSource = new DataSource({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'user',
password: 'password',
database: 'myapp',
synchronize: false,
logging: true,
entities: [User, Order],
migrations: ['src/migrations/*.ts'],
});

Sequelize 모델​

// src/models/User.js
const { DataTypes } = require('sequelize');

module.exports = (sequelize) => {
const User = sequelize.define('User', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
validate: {
isEmail: true,
},
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
}, {
tableName: 'users',
timestamps: true,
});

return User;
};

데이터베이스 스키마 시각화​

Prisma ERD 사용​

엔티티 관계 다이어그램 생성:

npx prisma generate --generator erd

또는 Cursor에게 시각적 스키마 생성을 요청하세요:

이 프로젝트의 Prisma 스키마에 대한 Mermaid ERD 다이어그램을 생성해주세요

AI 기반 쿼리 최적화​

쿼리 성능 분석​

쿼리와 실행 계획을 공유하세요:

이 쿼리가 순차 스캔을 사용합니다. 어떻게 인덱스를 추가하여 최적화할 수 있나요?

EXPLAIN ANALYZE SELECT * FROM orders WHERE status = 'pending' AND created_at > '2024-01-01';

Cursor가 제안합니다:

CREATE INDEX idx_orders_status_created_at ON orders(status, created_at);

데이터베이스 설계 검토​

Cursor에게 스키마의 모범 사례 검토를 요청하세요:

이 데이터베이스 스키마를 다음 관점에서 검토해주세요:
1. 정규화 문제
2. 외래 키의 누락된 인덱스
3. 데이터 타입 최적화
4. 잠재적인 동시성 문제

로컬 개발용 Docker Compose​

version: '3.8'
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: dev
POSTGRES_PASSWORD: devpass
POSTGRES_DB: myapp
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data

mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: myapp
MYSQL_USER: dev
MYSQL_PASSWORD: devpass
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql

volumes:
postgres_data:
mysql_data:

일반적인 데이터베이스 작업​

작업Cursor 프롬프트 예시
마이그레이션 생성"users 테이블에 소프트 삭제 열을 추가하는 마이그레이션을 생성해주세요"
시드 데이터"100명의 테스트 사용자로 데이터베이스를 채우는 시드 스크립트를 작성해주세요"
백업 쿼리"users 및 orders 테이블만 백업하는 pg_dump 명령어를 작성해주세요"
연결 풀링"동시 사용자 100명의 Node.js 앱에 대한 연결 풀링을 구성해주세요"
감사 로깅"orders 테이블의 모든 변경 사항을 추적하는 감사 로그 테이블을 추가해주세요"

데이터베이스 문제 디버깅​

연결 문제​

Prisma 클라이언트가 PostgreSQL에 연결할 수 없습니다. 연결 문자열과 오류는 다음과 같습니다:
[오류 붙여넣기]

마이그레이션 실패​

마이그레이션이 실패할 때:

  1. 마이그레이션 상태 확인:
npx prisma migrate status
  1. Cursor에게 실패 분석 및 수정 제안을 요청하세요

  2. 충돌을 해결하고 필요한 경우 적용으로 표시하세요:

npx prisma migrate resolve --applied migration_name

모범 사례​

보안​

  • 데이터베이스 자격 증명을 버전 관리에 커밋하지 마세요
  • 연결 문자열에는 환경 변수를 사용하세요
  • 프로덕션 연결에 SSL을 활성화하세요
  • SQL 인젝션 방지를 위해 매개변수화된 쿼리를 사용하세요

성능​

  • 자주 조회되는 열에 인덱스를 추가하세요
  • 프로덕션에서 연결 풀링을 사용하세요
  • 읽기 집약적인 워크로드에 쿼리 결과 캐싱을 구현하세요
  • 느린 쿼리 로그를 모니터링하세요

버전 관리​

# Database
*.db
*.sqlite
*.sqlite3
.env
.env.local
prisma/migrations/migration_lock.toml

빠른 참고​

작업명령어
Prisma 클라이언트 생성npx prisma generate
마이그레이션 실행npx prisma migrate dev
데이터베이스 재설정npx prisma migrate reset
Prisma Studio 열기npx prisma studio
데이터베이스 시딩npx prisma db seed
스키마 포맷npx prisma format

관련 리소스​

마지막 업데이트: 2025년 7월