프로그래밍 언어/NODE JS

실시간 경매 시스템 만들기 - 프로젝트 구조 갖추기(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 컬럼이 생성됩니다.