Skip to content
Snippets Groups Projects
Commit d8244142 authored by tpgus2603's avatar tpgus2603
Browse files

feat 엔티티모델 정의 및 DB연결 테스트완료 (#3)

parent b5a119e7
No related branches found
No related tags found
2 merge requests!5[#1#2#3] DB모델 객체 및 로그인 ,회원가입 구현,!2Feature/#3
This commit is part of merge request !2. Comments created here will be created in the context of that merge request.
.env 0 → 100644
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=0000
DB_NAME=meeting
MONGO_URI=mongodb://localhost:27017/your_mongo_db
PORT=3306
\ No newline at end of file
node_modules/ node_modules/
.env/
config.json/
// app.js
require('dotenv').config(); // 환경 변수 로드
const express = require('express'); const express = require('express');
const app = express(); const app = express();
const PORT = process.env.PORT || 3000; const sequelize = require('./config/sequelize');
//const mongoose = require('./config/mongoose');
//const userRoutes = require('./routes/userRoutes');
//const passport = require('./passport');
app.get('/', (req, res) => { // 미들웨어 설정
res.send('Hello, World!'); app.use(express.json());
//app.use(passport.initialize());
// 라우팅
//app.use('/users', userRoutes);
// Sequelize 데이터베이스 연결 및 동기화
sequelize.sync()
.then(() => {
console.log('Sequelize synchronized.');
})
.catch(err => {
console.error('Sequelize synchronization error:', err);
}); });
// 서버 시작
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => { app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`); console.log(`Server running on port ${PORT}`);
}); });
{
"development": {
"username": "root",
"password": null,
"database": "database_development",
"host": "127.0.0.1",
"dialect": "mysql"
},
"test": {
"username": "root",
"password": null,
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
// config/mongoose.js
const mongoose = require('mongoose');
mongoose.connect(process.env.MONGO_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
mongoose.connection.on('connected', () => {
console.log('Mongoose connected.');
});
mongoose.connection.on('error', (err) => {
console.error('Mongoose connection error:', err);
});
module.exports = mongoose;
// config/sequelize.js
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, {
host: process.env.DB_HOST,
dialect: 'mysql', // 사용하려는 DBMS에 맞게 변경
logging: false,
define: {
//timestamps: true, // createdAt, updatedAt 자동 생성
underscored: true, // created_at 형식의 필드명 사용
},
});
module.exports = sequelize;
\ No newline at end of file
// models/Friend.js
const { DataTypes } = require('sequelize');
const sequelize = require('../config/sequelize');
const User = require('./User');
const Friend = sequelize.define('Friend', {
type: {
type: DataTypes.ENUM('NORMAL', 'SPECIAL'),
allowNull: false,
},
}, {
tableName: 'Friends',
timestamps: false,
});
Friend.belongsTo(User, { foreignKey: 'user_id', as: 'user' });
Friend.belongsTo(User, { foreignKey: 'friend_id', as: 'friend' });
User.hasMany(Friend, { foreignKey: 'user_id', as: 'friends' });
User.hasMany(Friend, { foreignKey: 'friend_id', as: 'friendOf' });
module.exports = Friend;
// models/Friend.js
module.exports = (sequelize, DataTypes) => {
const Friend = sequelize.define('Friend', {
id: {
type: DataTypes.BIGINT,
primaryKey: true,
autoIncrement: true,
},
user_id: {
type: DataTypes.BIGINT,
allowNull: false,
references: {
model: 'Users',
key: 'id',
},
onDelete: 'CASCADE',
},
friend_id: {
type: DataTypes.BIGINT,
allowNull: false,
references: {
model: 'Users',
key: 'id',
},
onDelete: 'CASCADE',
},
type: {
type: DataTypes.ENUM('NORMAL', 'SPECIAL'),
allowNull: false,
},
created_at: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
},
}, {
tableName: 'Friends',
timestamps: false,
indexes: [
{
unique: true,
fields: ['user_id', 'friend_id'],
},
],
});
return Friend;
};
// models/User.js // models/index.js
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', {
id: {
type: DataTypes.BIGINT,
primaryKey: true,
autoIncrement: true,
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
validate: {
isEmail: true, // 이메일 형식 검증
},
},
invite_code: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4, // 자동으로 UUID 생성
allowNull: false,
unique: true,
},
created_at: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
},
// updated_at 추가 (필요 시)
updated_at: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
},
}, {
tableName: 'Users',
timestamps: false, // created_at과 updated_at을 수동으로 관리
});
return User; const sequelize = require('../config/sequelize');
const User = require('./User');
const Schedule = require('./Schedule');
const Meeting = require('./Meeting');
const MeetingParticipant = require('./MeetingParticipant');
const Friend = require('./Friend');
module.exports = {
sequelize,
User,
Schedule,
Meeting,
MeetingParticipant,
Friend,
}; };
// models/Meeting.js // models/Meeting.js
module.exports = (sequelize, DataTypes) => {
const { DataTypes } = require('sequelize');
const sequelize = require('../config/sequelize');
const User = require('./User');
const Meeting = sequelize.define('Meeting', { const Meeting = sequelize.define('Meeting', {
id: {
type: DataTypes.BIGINT,
primaryKey: true,
autoIncrement: true,
},
title: { title: {
type: DataTypes.STRING, type: DataTypes.STRING,
allowNull: false, allowNull: false,
}, },
description: { description: {
type: DataTypes.TEXT, type: DataTypes.TEXT,
allowNull: true,
}, },
start_time: { start_time: {
type: DataTypes.DATE, type: DataTypes.DATE,
...@@ -21,44 +19,23 @@ module.exports = (sequelize, DataTypes) => { ...@@ -21,44 +19,23 @@ module.exports = (sequelize, DataTypes) => {
end_time: { end_time: {
type: DataTypes.DATE, type: DataTypes.DATE,
allowNull: false, allowNull: false,
validate: {
isAfterStart(value) {
if (value <= this.start_time) {
throw new Error('end_time은 start_time 이후여야 합니다.');
}
},
},
}, },
location: { location: {
type: DataTypes.STRING, type: DataTypes.STRING,
allowNull: true,
}, },
deadline: { deadline: {
type: DataTypes.DATE, type: DataTypes.DATE,
allowNull: true,
}, },
type: { type: {
type: DataTypes.ENUM('OPEN', 'CLOSE'), type: DataTypes.ENUM('OPEN', 'CLOSE'),
allowNull: false, allowNull: false,
}, },
created_by: {
type: DataTypes.BIGINT,
allowNull: false,
references: {
model: 'Users',
key: 'id',
},
onDelete: 'CASCADE',
},
}, { }, {
tableName: 'Meetings', tableName: 'Meetings',
timestamps: false, timestamps: false,
indexes: [
{
fields: ['created_by'],
},
],
}); });
return Meeting; Meeting.belongsTo(User, { foreignKey: 'created_by', as: 'creator' });
}; User.hasMany(Meeting, { foreignKey: 'created_by', as: 'meetings' });
module.exports = Meeting;
// models/MeetingParticipant.js // models/MeetingParticipant.js
module.exports = (sequelize, DataTypes) => {
const MeetingParticipant = sequelize.define('MeetingParticipant', { const { DataTypes } = require('sequelize');
id: { const sequelize = require('../config/sequelize');
type: DataTypes.BIGINT, const Meeting = require('./Meeting');
primaryKey: true, const User = require('./User');
autoIncrement: true,
}, const MeetingParticipant = sequelize.define('MeetingParticipant', {}, {
meeting_id: {
type: DataTypes.BIGINT,
allowNull: false,
references: {
model: 'Meetings',
key: 'id',
},
onDelete: 'CASCADE',
},
user_id: {
type: DataTypes.BIGINT,
allowNull: false,
references: {
model: 'Users',
key: 'id',
},
onDelete: 'CASCADE',
},
}, {
tableName: 'MeetingParticipants', tableName: 'MeetingParticipants',
timestamps: false, timestamps: true,
indexes: [
{
unique: true,
fields: ['meeting_id', 'user_id'],
},
],
}); });
return MeetingParticipant; MeetingParticipant.belongsTo(Meeting, { foreignKey: 'meeting_id', as: 'meeting' });
}; Meeting.hasMany(MeetingParticipant, { foreignKey: 'meeting_id', as: 'participants' });
MeetingParticipant.belongsTo(User, { foreignKey: 'user_id', as: 'user' });
User.hasMany(MeetingParticipant, { foreignKey: 'user_id', as: 'meetingParticipations' });
module.exports = MeetingParticipant;
// models/Schedule.js // models/Schedule.js
module.exports = (sequelize, DataTypes) => {
const { DataTypes } = require('sequelize');
const sequelize = require('../config/sequelize');
const User = require('./User');
const Schedule = sequelize.define('Schedule', { const Schedule = sequelize.define('Schedule', {
id: {
type: DataTypes.BIGINT,
primaryKey: true,
autoIncrement: true,
},
user_id: {
type: DataTypes.BIGINT,
allowNull: false,
references: {
model: 'Users',
key: 'id',
},
onDelete: 'CASCADE',
},
title: { title: {
type: DataTypes.STRING, type: DataTypes.STRING,
allowNull: false, allowNull: false,
...@@ -26,23 +16,13 @@ module.exports = (sequelize, DataTypes) => { ...@@ -26,23 +16,13 @@ module.exports = (sequelize, DataTypes) => {
end_time: { end_time: {
type: DataTypes.DATE, type: DataTypes.DATE,
allowNull: false, allowNull: false,
validate: {
isAfterStart(value) {
if (value <= this.start_time) {
throw new Error('end_time은 start_time 이후여야 합니다.');
}
},
},
}, },
}, { }, {
tableName: 'Schedules', tableName: 'Schedules',
timestamps: false, timestamps: true,
indexes: [
{
fields: ['user_id'],
},
],
}); });
return Schedule; Schedule.belongsTo(User, { foreignKey: 'user_id', as: 'user' });
}; User.hasMany(Schedule, { foreignKey: 'user_id', as: 'schedules' });
module.exports = Schedule;
// models/User.js // models/User.js
module.exports = (sequelize, DataTypes) => {
const { DataTypes } = require('sequelize');
const sequelize = require('../config/sequelize'); // sequelize 인스턴스 경로에 맞게 수정하세요.
const User = sequelize.define('User', { const User = sequelize.define('User', {
id: {
type: DataTypes.BIGINT,
primaryKey: true,
autoIncrement: true,
},
name: { name: {
type: DataTypes.STRING, type: DataTypes.STRING, // VARCHAR
allowNull: false, allowNull: false,
}, },
email: { email: {
type: DataTypes.STRING, type: DataTypes.STRING, // VARCHAR
allowNull: false, allowNull: false,
unique: true, unique: true,
validate: { validate: {
isEmail: true, // 이메일 형식 검증 isEmail: true,
},
},
invite_code: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4, // 자동으로 UUID 생성
allowNull: false,
unique: true,
},
created_at: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
}, },
// updated_at 추가 (필요 시)
updated_at: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
}, },
}, { }, {
tableName: 'Users', tableName: 'Users',
timestamps: false, // created_at과 updated_at을 수동으로 관리 timestamps: true, // createdAt과 updatedAt 자동 관리
}); });
return User; module.exports = User;
};
{ {
"name": "webback", "name": "webback",
"version": "1.0.0", "version": "1.0.0",
"main": "index.js", "main": "app.js",
"scripts": { "scripts": {
"start": "nodemon app",
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"repository": { "repository": {
......
const ChatRoomParticipantSchema = new Schema({ // schemas/ChatRoomParticipant.js
const mongoose = require('mongoose');
const ChatRoomParticipantSchema = new mongoose.Schema({
chat_room_id: { chat_room_id: {
type: mongoose.Schema.Types.BigInt, type: mongoose.Schema.Types.ObjectId,
ref: 'ChatRoom', ref: 'ChatRoom',
required: true, required: true,
}, },
user_id: { user_id: {
type: mongoose.Schema.Types.BigInt, type: Number, // SQL의 Users 테이블 ID 참조
ref: 'User',
required: true, required: true,
}, },
joined_at: {
type: Date,
default: Date.now,
},
left_at: { left_at: {
type: Date, type: Date,
default: null, default: null,
}, },
}, {
timestamps: { createdAt: 'joined_at', updatedAt: false },
}); });
// 복합 인덱스 생성하여 중복 참여 방지
ChatRoomParticipantSchema.index({ chat_room_id: 1, user_id: 1 }, { unique: true });
module.exports = mongoose.model('ChatRoomParticipant', ChatRoomParticipantSchema); module.exports = mongoose.model('ChatRoomParticipant', ChatRoomParticipantSchema);
// schemas/ChatRoom.js
const mongoose = require('mongoose'); const mongoose = require('mongoose');
const { Schema } = mongoose;
const ChatRoomSchema = new Schema({ const ChatRoomSchema = new mongoose.Schema({
name: { name: {
type: String, type: String,
required: true, required: true,
}, },
meeting_id: { meeting_id: {
type: mongoose.Schema.Types.BigInt, // 관계형 DB의 Meetings.id와 연동 type: Number, // SQL의 Meetings 테이블 ID 참조
ref: 'Meeting',
default: null, default: null,
}, },
type: { type: {
...@@ -17,18 +17,11 @@ const ChatRoomSchema = new Schema({ ...@@ -17,18 +17,11 @@ const ChatRoomSchema = new Schema({
required: true, required: true,
}, },
created_by: { created_by: {
type: mongoose.Schema.Types.BigInt, // 관계형 DB의 Users.id와 연동 type: Number, // SQL의 Users 테이블 ID 참조
ref: 'User',
required: true, required: true,
}, },
created_at: { }, {
type: Date, timestamps: true, // createdAt, updatedAt 자동 관리
default: Date.now,
},
updated_at: {
type: Date,
default: Date.now,
},
}); });
module.exports = mongoose.model('ChatRoom', ChatRoomSchema); module.exports = mongoose.model('ChatRoom', ChatRoomSchema);
const MessageSchema = new Schema({ // schemas/Message.js
const mongoose = require('mongoose');
const MessageSchema = new mongoose.Schema({
chat_room_id: { chat_room_id: {
type: mongoose.Schema.Types.BigInt, type: mongoose.Schema.Types.ObjectId,
ref: 'ChatRoom', ref: 'ChatRoom',
required: true, required: true,
}, },
sender_id: { sender_id: {
type: mongoose.Schema.Types.BigInt, type: Number, // SQL의 Users 테이블 ID 참조
ref: 'User',
required: true, required: true,
}, },
message: { message: {
type: String, type: String,
required: true, required: true,
}, },
sent_at: { }, {
type: Date, timestamps: { createdAt: 'sent_at', updatedAt: false },
default: Date.now,
},
}); });
// 인덱스 추가하여 조회 성능 향상
MessageSchema.index({ chat_room_id: 1, sent_at: -1 });
module.exports = mongoose.model('Message', MessageSchema); module.exports = mongoose.model('Message', MessageSchema);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment