Devhyun

메뉴

현재 화면 위치

데브현 메인 블로그 포스트

타이틀

VScode Sequelize Autocomplete 설정하기

2020.01.11
핫한

Node로 Backend를 구축하다 보면 ORM으로 많이 선택되는 Sequelize 라이브러리가 있습니다.
Typescript를 사용하지 않는 경우 Sequelize로 정의한 Model 객체의 메서드가 VSCode에서 자동완성 되지 않아 불편한데요.

이슈를 해결하기 위해 여러 가지 찾아보고 적용한 내용을 정리해 보겠습니다.

샘플 코드

https://github.com/sequelize/express-example
상단의 링크는 Sequelize에서 제공하는 샘플 코드입니다.

models 디렉터리에 index.js를 만들고 모델을 정의하는 형태를 취하고 있습니다.

📃 index.js

'use strict';

var fs        = require('fs');
var path      = require('path');
var Sequelize = require('sequelize');
var basename  = path.basename(__filename);
var env       = process.env.NODE_ENV || 'development';
var config    = require(__dirname + '/../config/config.js')[env];
var db        = {};

if (config.use_env_variable) {
  var sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  var sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    var model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

📃 User.js

'use strict';
module.exports = (sequelize, DataTypes) => {
  var User = sequelize.define('User', {
    username: DataTypes.STRING
  });

  User.associate = function(models) {
    models.User.hasMany(models.Task);
  };

  return User;
};

Sequelize에서는 모델에서 hasMany, hasOne과 같은 메서드를 호출하여 모델과의 관계를 정의합니다.
index.js에서 models폴더에 있는 모든 파일을 불러와 associate 함수를 호출하는 형태입니다.

하지만 상단의 코드로는 제가 원하는 자동완성 기능을 사용할 수 없습니다.

Sequelize.Model

image.png

findAll, findByPk, create와 같은 메서드는 Model 객체에 구현되어 있습니다.
Model을 상속받을 수 있다면 해당 메서드가 VSCode에서 자동완성 되겠죠?

📃 User.js

import Sequelize from 'sequelize';

export default class User extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {
        username: Sequelize.STRING
      },
      { sequelize },
    );
  }

  static associate(models) {
    models.User.hasMany(...);
  }
}

※ 상단 샘플 코드와는 달리 ES6의 import를 사용하고 있습니다.

이제 VSCode에서 Sequelize Model의 메서드들이 자동완성되어 표시됩니다!

image.png

index.js

User.js만 수정한다면 해당 코드는 작동하지 않아요 😰
sequelize['import']가 function을 리턴해야 하는데 Class를 리턴해서 에러가 발생하는 데요.
아래와 같이 수정해주면 깔끔하게 해결됩니다.

📃 index.js

const models = Object.assign(
    {},
    ...fs
      .readdirSync(__dirname)
      .filter(
        file =>
          file.indexOf('.') !== 0 &&
          file !== 'index.js',
      )
      .map(file => {
        const model = require(path.join(__dirname, file)).default;

        return {
          [model.name]: model.init(db),
        };
      }),
  );

for (const model of Object.keys(models)) {
typeof models[model].associate === 'function' &&
  models[model].associate(models);
}

마치며

Sequelize를 사용하면서 API 문서를 보면서 코딩을 하는 번거로움과 오타로 발생하는 에러를 줄이기 위해 VSCode에서 Autocomplete가 되도록 간단한 설정을 해보았습니다.

VSCode extension으로 제공해준다면 정말 좋을 텐데 마땅히 없었어요 😭
만약에, Typescript를 사용하신다면 Sequelize가 Typescript를 지원하지만, TypeORM을 추천드립니다!

0개의 댓글

로그인을 하시면 댓글을 작성할 수 있어요 !
목록으로 가기