Node.js

Nodejs 데이터 베이스 셋팅하기

쿠와와 2021. 1. 5. 15:11

models/user.js: 사용자 테이블과 연결됨

  • provider: 카카오 로그인인 경우 kakao, 로컬 로그인(이메일/비밀번호)인 경우 local
  • snsId: 카카오 로그인인 경우 주어지는 id

 

models/post.js: 게시글 내용과 이미지 경로를 저장(이미지는 파일로 저장)

models/hashtag.js: 해시태그 이름을 저장(나중에 태그로 검색하기 위해서)

 

 

시퀄라이즈가 자동으로 생성해주는 코드 대신 다음과 같이 변경

  • 모델들을 불러옴(require)
  • 모델 간 관계가 있는 경우 관계 설정
  • User(1):Post()
  • Post():Hashtag()
  • User():User()

 

모델간의 관계들 associate에 작성

 1대다: hasManybelongsTo

 다대다: belongsToMany

  • foreignKey: 외래키
  • as: 컬럼에 대한 별명
  • through: 중간 테이블명

 

User():User()

  • 다대다 관계이므로 중간 테이블(Follow) 생성됨
  • 모델 이름이 같으므로 구분 필요함(as구분자 역할, foreignKey는 반대 테이블 컬럼의 프라이머리 키 컬럼)
  • 시퀄라이즈는 as 이름을 바탕으로 자동으로 addFollower, getFollowers, addFollowing, getFollowings 메서드 생성

hashtag.js

const Sequelize = require('sequelize');

module.exports = class Hashtag extends Sequelize.Model {
  static init(sequelize) {
    return super.init({
      title: {
        type: Sequelize.STRING(15),
        allowNull: false,
        unique: true,
      },
    }, {
      sequelize,
      timestamps: true,
      underscored: false,
      modelName: 'Hashtag',
      tableName: 'hashtags',
      paranoid: false,
      charset: 'utf8mb4',
      collate: 'utf8mb4_general_ci',
    });
  }

  static associate(db) {
    db.Hashtag.belongsToMany(db.Post, { through: 'PostHashtag' });
  }
};

 

index.js

const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const User = require('./user');
const Post = require('./post');
const Hashtag = require('./hashtag');

const db = {};
const sequelize = new Sequelize(
  config.database, config.username, config.password, config,
);

db.sequelize = sequelize;
db.User = User;
db.Post = Post;
db.Hashtag = Hashtag;

User.init(sequelize);
Post.init(sequelize);
Hashtag.init(sequelize);

User.associate(db);
Post.associate(db);
Hashtag.associate(db);

module.exports = db;

 

post.js

const Sequelize = require('sequelize');

module.exports = class Post extends Sequelize.Model {
  static init(sequelize) {
    return super.init({
      content: {
        type: Sequelize.STRING(140),
        allowNull: false,
      },
      img: {
        type: Sequelize.STRING(200),
        allowNull: true,
      },
    }, {
      sequelize,
      timestamps: true,
      underscored: false,
      modelName: 'Post',
      tableName: 'posts',
      paranoid: false,
      charset: 'utf8mb4',
      collate: 'utf8mb4_general_ci',
    });
  }

  static associate(db) {
    db.Post.belongsTo(db.User);
    db.Post.belongsToMany(db.Hashtag, { through: 'PostHashtag' });
  }
};

 

uesr.js

const Sequelize = require('sequelize');

module.exports = class User extends Sequelize.Model {
  static init(sequelize) {
    return super.init({
      email: {
        type: Sequelize.STRING(40),
        allowNull: true,
        unique: true,
      },
      nick: {
        type: Sequelize.STRING(15),
        allowNull: false,
      },
      password: {
        type: Sequelize.STRING(100),
        allowNull: true,
      },
      provider: {
        type: Sequelize.STRING(10),
        allowNull: false,
        defaultValue: 'local',
      },
      snsId: {
        type: Sequelize.STRING(30),
        allowNull: true,
      },
    }, {
      sequelize,
      timestamps: true,
      underscored: false,
      modelName: 'User',
      tableName: 'users',
      paranoid: true,
      charset: 'utf8',
      collate: 'utf8_general_ci',
    });
  }

  static associate(db) {
    db.User.hasMany(db.Post);
    db.User.belongsToMany(db.User, {
      foreignKey: 'followingId',
      as: 'Followers',
      through: 'Follow',
    });
    db.User.belongsToMany(db.User, {
      foreignKey: 'followerId',
      as: 'Followings',
      through: 'Follow',
    });
  }
};

 

 

 

 

모델과 서버 연결하기

sequelize.sync()가 테이블 생성 // dotenv 아래에 위치하는 것이 좋음 

IF NOT EXIST(SQL)으로 테이블이 없을 때만 생성해줌

 

table 이 바꿨을 때 수정하는 방법

force : Table이 지워졌다가 다시 생성됨 ( 데이터가 날라감 ) 

alter : 컬럼이랑 기존 데이터랑 싱크가 되지 않아서 에러가 날 경우가 많음 

 

 

 

 

 

'Node.js' 카테고리의 다른 글

카카오 로그인 작업  (0) 2021.01.06
패스포트 사용하기 (로그인 과정 helper)  (0) 2021.01.05
프로젝트 구조 갖추기  (0) 2021.01.03
시퀄라이즈 쿼리  (0) 2020.12.30
시퀄라이저 모델 자료형  (0) 2020.12.29