“@@”
- @ → 필드 단위 설정 (예: @id, @default(now()))
- @@ → 모델 단위 설정 (예: @@index, @@unique, @@id)
즉, @@something은 모델 전체에 영향을 주는 규칙입니다.
@@index — 검색 속도를 높인다
@@index([userId, postId])
의미
이 두 컬럼(userId, postId)을 자주 같이 검색하니, DB 빠르게 찾을 수 있도록 색인을 만들어둬
- 쿼리 속도 향상 (특히 WHERE 조건에 두 컬럼을 함께 쓸 때)
- 예를 들어, 다음 쿼리가 훨씬 빨라짐:
- SELECT * FROM Like WHERE userId = 'u1' AND postId = 'p1';
사용 예시
model Like {
id String @id @default(cuid())
userId String
postId String
@@index([userId, postId])
}
- 자주 조회되는 조합에 인덱스를 걸어두면 탐색 시간이 크게 줄어듭니다.
- 인덱스는 검색 최적화용이며, 중복을 막지는 않습니다.
@@unique — 중복 데이터를 막는다
@@unique([userId, postId])
의미
- 같은 유저(userId)가 같은 글(postId)에 대해 중복 데이터를 넣지 못하게 막자.
- 유니크 제약 조건(Unique Constraint) 생성 → 같은 조합으로는 데이터 추가 불가.
예시
| userId | postId |
| u1 | p1 |
| u1 | p2 |
| u2 | p1 |
- 가능 — 모두 다른 조합.
- 불가능 — u1, p1을 또 추가하려 하면 DB에서 오류 발생.
- @@unique([userId, postId])는 좋아요, 팔로우, 북마크 등 중복 액션 방지에 매우 유용.
- Unique 제약 조건은 내부적으로 인덱스도 자동 생성하므로 조회도 빠릅니다.
@@id — 복합 기본키 (Composite Primary Key)
@@id([followerId, followingId])
의미
이 두 컬럼을 합쳐서 하나의 고유 ID로 취급하겠다.
예시: Follows 테이블
model Follows {
followerId String
followingId String
createdAt DateTime @default(now())
@@id([followerId, followingId])
}
| followerId | followingId |
| u1 | u2 |
| u2 | u3 |
- 가능 — 조합이 다름.
- 불가능 — u1, u2가 이미 존재하면 다시 넣을 수 없음.
- 복합 기본키는 중복 팔로우 방지와 빠른 고유 식별에 쓰입니다.
비교 정리
| 구문 | 기능 | 중복 가능 | 검색 속도 | 특징 |
| @@index([a,b]) | 인덱스 생성 | 가능 | 빠름 | 조회 성능 개선용 |
| @@unique([a,b]) | 유니크 제약 | 불가능 | 빠름 | 중복 방지 + 자동 인덱스 생성 |
| @@id([a,b]) | 복합 기본키 | 불가능 | 빠름 | 모델의 식별자 역할 |
Prisma 모델 예시
Like 모델 — 좋아요 (중복 방지 + 빠른 조회)
model Like {
id String @id @default(cuid())
userId String
postId String
createdAt DateTime @default(now())
@@index([userId, postId])
@@unique([userId, postId])
}
- 같은 유저가 같은 글에 두 번 좋아요 누르는 걸 차단하면서, 조회도 빠르게.
Follows 모델 — 팔로우 관계 (복합키)
model Follows {
followerId String
followingId String
createdAt DateTime @default(now())
@@id([followerId, followingId])
@@index([followerId, followingId])
}
- 한 유저가 같은 사람을 중복 팔로우하지 못하게 하며, 조회 속도도 향상.
Notification 모델 — 알림 (조회 최적화)
model Notification {
id String @id @default(cuid())
userId String
createdAt DateTime @default(now())
@@index([userId, createdAt])
}
- 특정 유저의 알림을 최신순으로 빠르게 조회 가능.
'개발 공부' 카테고리의 다른 글
| Prisma DB 연결 (0) | 2025.11.09 |
|---|---|
| Prisma 관계(Relation) (0) | 2025.11.02 |
| Prisma 스키마 (1) (0) | 2025.10.31 |
| Prop Drilling (0) | 2025.10.24 |
| DFS, BFS (0) | 2025.10.08 |