framework/Prisma
✅ Prisma 1:N 관계 완전 가이드 – One-to-Many 관계 정석 모델링
octo54
2025. 6. 9. 10:23
반응형
✅ Prisma 1:N 관계 완전 가이드 – One-to-Many 관계 정석 모델링
"하나의 User가 여러 개의 Post를 가질 수 있다."
이런 구조를 Prisma에서 어떻게 안전하고 효율적으로 정의할 수 있을까요?
🔎 1:N 관계란?
- 한 개의 레코드가 여러 개의 레코드와 연결되는 관계
- 대표 예:
- User 1명 ↔ Post 여러 개
- Category 1개 ↔ Product 여러 개
🧱 기본 예제
model User {
id Int @id @default(autoincrement())
name String
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
authorId Int
author User @relation(fields: [authorId], references: [id])
}
핵심 요소 ✅
필드 설명
User.posts | 배열로 다수의 Post 참조 |
Post.authorId | 외래 키 필드 |
Post.author | @relation()으로 관계 정의 |
⚖️ 관계 방향 이해
방향 설명
User → Post | posts: Post[]로 다수 참조 |
Post → User | authorId, author로 외래키 참조 |
🧪 Prisma Client 사용 예시
반응형
// User → Post
const userWithPosts = await prisma.user.findUnique({
where: { id: 1 },
include: { posts: true },
})
// Post → User
const postWithAuthor = await prisma.post.findUnique({
where: { id: 10 },
include: { author: true },
})
✨ 관계 이름 명시 (선택적)
같은 모델 간 여러 관계가 있을 경우, @relation(name: "...")을 명시합니다.
model User {
id Int @id @default(autoincrement())
createdPosts Post[] @relation("CreatedPosts")
likedPosts Post[] @relation("LikedPosts")
}
model Post {
id Int @id @default(autoincrement())
creatorId Int
likerId Int
creator User @relation("CreatedPosts", fields: [creatorId], references: [id])
liker User @relation("LikedPosts", fields: [likerId], references: [id])
}
✅ @relation("관계이름")으로 중복 방지 및 관계 명확화
🧠 실전 모델 예시 – 블로그 시스템
model Category {
id Int @id @default(autoincrement())
name String
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
categoryId Int
category Category @relation(fields: [categoryId], references: [id])
}
- 카테고리 1개가 포스트 여러 개를 가짐
- Post 모델에서 외래 키 categoryId 설정
⚠️ 자주 하는 실수
실수 증상
@relation() 빠짐 | Prisma CLI 에러 발생 |
배열 쪽에 @relation 작성 | 반대편(외래 키가 있는 곳)에서만 설정해야 함 |
외래 키 필드 누락 | 관계 정의 실패 |
잘못된 references 값 | 존재하지 않는 필드를 참조하게 됨 |
🔄 Prisma 마이그레이션 흐름
- 모델에 1:N 구조 정의
- prisma migrate dev 또는 prisma db push 실행
- DB에 테이블과 외래 키 생성
- Prisma Client로 안전하게 조회 및 연결 가능
🏁 요약
항목 내용
관계 구조 | A (배열) → B (단일 필드 + 외래키) |
외래 키 정의 | @relation(fields: [...], references: [...]) |
Client 접근 | include, select로 양방향 탐색 |
관계 이름 | 필요한 경우 명시적 @relation("...") 사용 |
Prisma 1대다 관계,Prisma One-to-Many 모델링,Prisma 관계 설정,Prisma 외래키 예제,Prisma post user 관계,Prisma 관계형 데이터베이스,Prisma 배열 관계,타입 안전 ORM,Prisma client join,Prisma relation 설명