실시간 경매 시스템 만들기 - 프로젝트 구조 갖추기(1)
프로젝트 이름은 NodeAuction입니다. 먼자 node-auction 폴더를 만든 후 그 안에 package.json 파일을 작성합니다.
{
"name": "node-auction",
"version": "0.0.1",
"description": "노드 경매 시스템",
"main": "app.js",
"scripts": {
"start": "nodemon app"
},
"author": "Sally",
"license": "ISC",
"dependencies": {
"bcrypt": "^3.0.7",
"cookie-parser": "^1.4.4",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"express-session": "^1.17.0",
"morgan": "^1.9.1",
"multer": "^1.4.2",
"mysql2": "^2.1.0",
"nunjucks": "^3.2.0",
"passport": "^0.4.1",
"passport-local": "^1.0.0",
"sequelize": "^5.21.3",
"sequelize-cli": "^5.5.1"
},
"devDependencies": {
"nodemon": "^2.0.2"
}
}
필요한 패카자를 설치합니다.
$ npm i
데이터베이스로는 MySQL을 사용합니다. 시퀄라이즈를 설치하고, 기본 디렉터리를 만듭니다.
$ npm i sequelize sequelize-cli mysql2
$ npx sequelize init
프로젝트 새 모델, 즉 사용자 모델, 제품 모델, 경매 모델로 구성됩니다. 다음과 같이 새 모델을 만듭니다.
models/user.js
const Sequelize = require("sequelize");
module.exports = class User extends Sequelize.Model {
static init(sequelize) {
return super.init(
{
email: {
type: Sequelize.STRING(40),
allowNull: false,
unique: true,
},
nick: {
type: Sequelize.STRING(15),
allowNull: false,
},
password: {
type: Sequelize.STRING(100),
allowNull: true,
},
money: {
type: Sequelize.INTEGER,
allowNull: false,
defaultValue: 0,
},
},
{
sequelize,
timestamps: true,
paranoid: true,
modelName: "User",
tableName: "users",
charset: "utf8",
collate: "utf8_general_ci",
},
);
}
static associate(db) {
db.User.hasMany(db.Auction);
}
};
시용자 모델은 이메일(email), 닉네임(nick), 비밀번호(password), 보유 자금(money)으로 구성됩니다.
사용자가 입찰을 여러 번 할 수 있으므로 사용자 모델과 경매 모델도 일대다 관계입니다.
models/good.js
const Sequelize = require("sequelize");
module.exports = class Good extends Sequelize.Model {
static init(sequelize) {
return super.init(
{
name: {
type: Sequelize.STRING(40),
allowNull: false,
},
img: {
type: Sequelize.STRING(200),
allowNull: true,
},
price: {
type: Sequelize.INTEGER,
allowNull: false,
defaultValue: 0,
},
},
{
sequelize,
timestamps: true,
paranoid: true,
modelName: "Good",
tableName: "goods",
charset: "utf8",
collate: "utf8_general_ci",
},
);
}
static associate(db) {
db.Good.belongsTo(db.User, { as: "Owner" });
db.Good.belongsTo(db.User, { as: "Sold" });
db.Good.hasMany(db.Auction);
}
};
상품 모델은 상풍명(name), 상품 사진(img), 시작 가격(price)으로 구성됩니다.
사용자 모델과 상품 모델 간에는 일대다 관계가 두 번 적용됩니다. 사용자가 여러 상픔을 등록할 수 있고, 사용자가 여러 상품을 낙찰 받을 수도 있기 때문입니다. 등록한 상품과 낙찰받은 상품, 두 관계를 구별하기 위해 as 속성에 각각 Owner, Sold도 관계명을 적었습니다. 각각 OwnerId, SoldId 컬럼으로 상품 모델에 추가됩니다. 한 상품에 여러 명이 입장했으므로 상품 모델과 경매 모댈도 일대다 관계입니다.
models/auction.js
const Sequelize = require("sequelize");
module.exports = class Good extends Sequelize.Model {
static init(sequelize) {
return super.init(
{
bid: {
type: Sequelize.INTEGER,
allowNull: false,
defaultValue: 0,
},
msg: {
type: Sequelize.STRING(100),
allowNull: true,
},
},
{
sequelize,
timestamps: true,
paranoid: true,
modelName: "Auction",
tableName: "auctions",
charset: "utf8",
collate: "utf8_general_ci",
},
);
}
static associate(db) {
db.Auction.belongsTo(db.User);
db.Auction.belongsTo(db.Good);
}
};
마지막으로 경매 모델은 입찰가(bid)와 입찰 시 메시지(msg)로 구성됩니다. 입찰 시 메시지는 null이어도 됩니다. 경매 모델은 사용자 모델 및 상품 모델과 일대다 관계에 있습니다. 경매 모델에는 UserId 컬럼과 GoodId 컬럼이 생성됩니다.
'프로그래밍 언어 > NODE JS' 카테고리의 다른 글
| 실시간 경매 시스템 만들기 - 프로젝트 구조 갖추기(3) (0) | 2026.02.20 |
|---|---|
| 실시간 경매 시스템 만들기 - 프로젝트 구조 갖추기(2) (0) | 2026.02.16 |
| 프로젝트 마무리하기 (0) | 2026.02.10 |
| 채팅 구현하기 (0) | 2026.02.07 |
| 미들웨어와 소켓 연결하기(2) (0) | 2026.02.04 |