raw sql을 ORM으로 변경

moontag·2023년 8월 28일
0

Node.js

목록 보기
4/4
post-thumbnail

성경 웹 사이트를 만들기 위해서 방법을 찾던 중
성경 SQL을 발견하여 이를 성경 테이블에 추가하고자 했다.

대한성서공회 저작권 FAQ에 보면 개역한글판은 저작권이 만료되어 성명표시권, 동일성유지권을 준수하면 되는 것으로 보여진다.
성경을 변경/수정하지 말고 저작권 소유자 표시를 잘해주면 되는 것으로 이해했다.
아쉽게도 개역개정이 아니라 개역한글 "~가라사대" 이지만 쓸 수 있다는 것만드로도 감사하다...


파일을 열어보면 위처럼 raw sql query문들이 작성되어있다.

  • 먼저 테이블을 생성하고
  • book, chapter, verse, content (예. 창세기 01, 1장, 1절, '태초에~') 컬럼 생성 후
  • INSERT문으로 row 데이터를 추가하고 있다.

이 SQL 쿼리문을 돌려서 내 프로젝트 DB에 추가하고자 한다.






1. sequelize에 맞는 컬럼 데이터 타입으로 수정하기

수정하기 전에는 sequelize에 NUMERIC 타입이 없기 때문에
DECIMAL로 자동 변환되어 들어가졌다.
하지만 book, chapter, verse 컬럼 모두 양수면 되기 때문에 INT UNSIGNED로 수정하게 됐다. DB에 맞는 타입으로 수정해주면 된다.

  • sql 파일에서 데이터 타입을 NUMERIC -> INT UNSIGNED로 수정
DROP TABLE IF EXISTS bible_korHRV;
CREATE TABLE bible_korHRV (book INT UNSIGNED, chapter INT UNSIGNED, verse INT UNSIGNED, content TEXT, PRIMARY KEY(book, chapter, verse));






2. 내 DB에 성경 테이블 추가하기

sql 파일 안의 raw sql query문을 sequelize.query로 실행하여 내 DB에 위에 전체 데이터들을 추가한다.
sequelize.query의 단일 쿼리 실행하는 방법을 사용했다.
초기에 1번만 해당 파일을 실행해줘서 데이터를 추가한다.
sequelize 공식문서 - Raw Queries 실행

// executeQueries.js
const fs = require("fs");
const { sequelize } = require("./models");

const sqlFile = fs.readFileSync(`개역한글판_korHRV.sql`, "utf-8");
const dropTableQuery = "DROP TABLE IF EXISTS bible_korHRV;";
const createTableQuery =
  "CREATE TABLE bible_korHRV (book INT UNSIGNED, chapter INT UNSIGNED, verse INT UNSIGNED, content TEXT, PRIMARY KEY(book, chapter, verse));";
const insertQueries = sqlFile.match(
  /INSERT INTO bible_korHRV VALUES\([^)]+\);/g
);

const executeQueries = async () => {
  try {
    await sequelize.query(dropTableQuery);
    await sequelize.query(createTableQuery);
    for (const query of insertQueries) {
      await sequelize.query(query);
    }
  } catch (err) {
    console.error(err);
  }
};
executeQueries();
  • 위 파일 실행
    내 프로젝트 db에 bible_korHRV 테이블에 row 데이터 채워짐
    #내 프로젝트 root에서 실행
    node executeQueries.js
    파일을 실행하고나서 디비버(DBeaver)를 확인해보면 테이블 생성되고 row 데이터가 잘 들어간 것을 볼 수 있다.






3. ORM 이용하기 위해 sequelize Model 설정하기

sequelize ORM을 사용하고 있었기 때문에 모델 설정을 해줬다.
각 컬럼의 type, allowNull, primaryKey를 넣어주고 Bible 모델 옵션을 설정해준다

// models/bible.js
const Sequelize = require("sequelize");

class Bible extends Sequelize.Model {
  static initiate(sequelize) {
    Bible.init(
      {
        book: {
          type: Sequelize.INTEGER.UNSIGNED,
          allowNull: false,
          primaryKey: true,
        },
        chapter: {
          type: Sequelize.INTEGER.UNSIGNED,
          allowNull: false,
          primaryKey: true,
        },
        verse: {
          type: Sequelize.INTEGER.UNSIGNED,
          allowNull: false,
          primaryKey: true,
        },
        content: {
          type: Sequelize.TEXT,
          allowNull: true,
        },
      },
      {
        sequelize,
        timestamps: false,
        underscored: false,
        modelName: "Bible_korHRV",
        tableName: "bible_korHRV",
        charset: "utf8",
        collate: "utf8_general_ci",
      }
    );
  }
  static associate(db) {}
}

module.exports = Bible;

결과물은 아래와 같이 잘 나타나고 있다!

추가로 살펴볼 점

  • 조회만 이뤄지는 데이터기 때문에 CQRS 패턴으로(CUD는 RDBMS로 R는 NoSQL) 분리할 수도 있다고 한다.
  • 하지만 내 프로젝트에서는 통계라는 기능을 추가하여 추후 다른 테이블과 관계를 맺을 수도 있어서 현재는 유지하고, 나중에 필요해지면 생각해보기로 했다.

참고

profile
터벅터벅 나의 개발 일상

0개의 댓글