User
const UserSchema = new mongoose.Schema({
email: { type: String, required: true, unique: true },
nickname: { type: String },
googleId: { type: String },
profileImage: { type: String },
favoriteGenres: [{ type: String }], // 예: ["Action", "Drama"]
likedMovies: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Movie' }],
isAdmin: { type: Boolean, default: false },
language: { type: String, default: 'ko' }
}, { timestamps: true });
const MovieSchema = new mongoose.Schema({
tmdbId: { type: Number, required: true, unique: true }, // TMDB 고유 ID
title: { type: String, required: true },
overview: { type: String },
posterPath: { type: String },
releaseDate: { type: String },
genres: [{ type: String }], // TMDB 장르 이름 배열
language: { type: String, default: 'ko' },
}, { timestamps: true });
Comic
const ComicSchema = new mongoose.Schema({
movie: { type: mongoose.Schema.Types.ObjectId, ref: 'Movie', required: true },
type: { type: String, enum: ['summary', 'parody'], required: true }, // 예: 'summary' or 'parody'
title: { type: String }, // 만화 제목 (선택)
description: { type: String }, // 간략 설명
language: { type: String, default: 'ko' },
createdBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, // 만든 유저 (선택)
}, { timestamps: true });
ComicStep
const ComicStepSchema = new mongoose.Schema({
comic: { type: mongoose.Schema.Types.ObjectId, ref: 'Comic', required: true },
stepNumber: { type: Number, required: true },
imageUrl: { type: String }, // 각 컷의 이미지
text: { type: String }, // 대사나 설명
audioUrl: { type: String }, // TTS 음성 경로 (선택)
}, { timestamps: true });
Comment
const CommentSchema = new mongoose.Schema({
comic: { type: mongoose.Schema.Types.ObjectId, ref: 'Comic', required: true },
author: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
content: { type: String, required: true },
likes: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
createdAt: { type: Date, default: Date.now },
updatedAt: { type: Date, default: Date.now }
});
ERD 요약
User
├─ _id (ObjectId, PK)
├─ email (String, required, unique)
├─ nickname (String)
├─ googleId (String)
├─ profileImage (String)
├─ favoriteGenres [String]
├─ likedMovies [ObjectId] → Movie._id
├─ isAdmin (Boolean)
└─ language (String)
▲
│ 1:N (optional)
│
▼
Comic
├─ _id (ObjectId, PK)
├─ movie (ObjectId, FK → Movie._id)
├─ type ('summary' | 'parody')
├─ title (String)
├─ description (String)
├─ createdBy (ObjectId, FK → User._id)
└─ language (String)
▲
│ 1:N
│
▼
ComicStep
├─ _id (ObjectId, PK)
├─ comic (ObjectId, FK → Comic._id)
├─ stepNumber (Number)
├─ imageUrl (String)
├─ text (String)
└─ audioUrl (String, optional)
Movie
├─ _id (ObjectId, PK)
├─ tmdbId (Number, unique)
├─ title (String)
├─ overview (String)
├─ posterPath (String)
├─ releaseDate (String)
├─ genres [String]
└─ language (String)
주요 관계 설명
관계 |
설명 |
User → Comic |
User._id가 Comic.createdBy에 연결 (유저가 만든 만화) |
User → Movie |
User.likedMovies는 여러 개의 Movie._id를 참조 (1:N) |
Movie → Comic |
하나의 영화는 여러 개의 만화를 가질 수 있음 (1:N) |
Comic → ComicStep |
하나의 만화는 여러 컷으로 이루어짐 (1:N) |