ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2019.05.06] 코드에 DB 쿼리문은 그만! 유용한 Sequlize
    개발 블로깅/Server&DataBase 개념 2019. 5. 6. 10:37

    기존에 웹 API 개발에 DB를 연동하여 사용하려면, 쿼리 명령어를 문자열로 저장하고 사용을 했어야 했다.

    DB연결 부분 생략
    ....
    
    
    /* 쿼리 결과 값이 필요 없는 경우 */
    var query = `insert into users(name) values('name')`;
    connection.query(query);
    
    /* 쿼리 결과 값을 받아올 경우 */
    var query = `select * from users`;
    connection.query(query, function(error, rows, fields) {
      if(!error){
        console.log(rows);
        console.log(JSON.parse(JSON.stringify(rows))) // 이렇게 해야 제대로 object 방식으로 사용 가능
      }else{
        console.log('Error while performing Query.', error);
      }
    });
          
          
    connection.end();

     

    그러나 이런 쿼리문을 직접 넣지 않고 사용하는 방법이 Sequlize이다.

    우선 Sequilize는 ORM 기반의 모듈이다.

     


     

    # ORM(Object Relation Mapping)이란?

     

    하나의 데이터베이스 방식에 종속되지 않도록 데이터베이스 처리에 표준화를 두는 것

    ORM(Object Relation Mapping)은 이름 그대로 Object를 관계형 데이터베이스 형식에 맞게 매핑을 해 주는 기법이다.

    우리가 기존에 데이터베이스 테이블에 데이터를 추가를 하려면, 쿼리를 직접 작성하여 명령어 실행을 해줘야 했는데, ORM 방식은 Object를 테이블 형식에 맞춰서 사용하는 방식이다.

     

    하나의 데이터베이스 방식에 종속되지 않도록 데이터베이스 처리에 표준화를 두는 것

    뿐만 아니라, 여러 데이터베이스와 호환이 된다. 기존에 mysql을 사용한다고 하면, 코드와 쿼리를 모두 mysql 형식에 맞춰서 코드를 작성해야 한다. 만약 중간에 다른 데이터베이스로 변경해야 하는 상황이 온다면, mysql 방식으로 짰던 코드를 모두 변경했을 것이다. 

    그러나 ORM 기반이라면, 특정한 데이터베이스 코드에 종속되는 것이 아니므로, 설정만 바꿔준다면 똑같이 바로 사용할 수 있다.

     

    ORM은 위와 같은 개념이고, 실제로 이 방식을 사용하려면 ORM 기반의 모듈을 사용해야 한다. 

    Mybatis, Ibatis(스프링 개발할 때 쓰던 Ibatis가 이것일 줄이야..) 언어마다 종류가 여러 가지 있는데, node에서는 Sequelize를 쓴다.


    # Sequelize 사용법

     

    우선 Sequelize를 사용하기 위해서 관련 모듈을 설치한다.(mysql이 전적으로 설치가 되어 있어야 함.)

    npm i -D sequelize sequelize-cli mysql2

     

    Sequelize 모듈 설치 후, Sequelize를 초기화해준다.

    ./node_modules/.bin/sequelize init (해당 프로젝트 디렉토리에서 실행해야함)

     

    sequelize 디렉토리 생성

    초기화를 해주면, config, migations, seeders 디렉터리가 생성된다.

     

    config/config.json

     

    Sequelize-cli가 어떤 데이터베이스에 접근할지 정보를 입력해준다.

     

    # Sequelize 모델 정의 및 마이그레이션

    데이터베이스 내 테이블을 만들기 위해서는 터미널로 마이그레이션 작업을 해줘야 한다.

    node_modules/.bin/sequelize model:generate --name User2 --attributes userId:string,name:string,engName:string

    Sequelize로 마이그레이션 작업을 해 준 내용이다. 내용은 아래와 같다.

    User2라는 이름으로 userId(String), name(String), endName(String)의 칼럼을 가진 테이블을 생성.

    그러면 위 기본으로 기본키로 쓸 ID와 , createAt, updateAt을 포함시켜서 User 테이블을 만들 수 있는 마이그레이션 파일을 생성해준다.

    migrations 디렉토리와 같이, models 디렉토리도 생성되어 있는 것을 확인할 수 있다.

    migrations/create-user.js 파일에 들어가 보면 아래와 같다.

     

    up과 down으로 구분되어 각각 createTable과 dropTable을 해주는 코드를 볼 수 있다.

    이제 이 파일로 마이그레이션 작업을 하면, 실제 User2라는 테이블이 생성된다.

    ./node_modules/.bin/sequelize db:migrate // create Table이 실행됨.
    
    ./node_modules/.bin/sequelize db:migrate:undo // drop Table이 실행됨.

     

    mysql 콘솔로 접속해서, 실제로 테이블이 생성된 것을 확인할 수 있다.

     

    # Sequelize Cli Seed를 이용하여 데이터 추가하기

    마이그레이션은 테이블 관련 기능을 하는 녀석이라면, seed는 테이블 안의 '데이터' 관련 기능을 하는 녀석!

    ./node_modules/.bin/sequelize seed:generate --name userData

    위와 같이 터미널에 명령어를 실행하면, seeders 디렉토리에, userData.js 파일이 생성된다.

     

    마이그레이트의 파일과 같이, seeders 파일 내에서도 '추가', '삭제' 기능을 할 수 있도록 up, down으로 구분되는 것을 볼 수 있다.

    우리가 만든 테이블 형식에 맞게 object 형식을 바꾼 뒤, 터미널에 아래와 같이 명령어를 실행한다.

    ./node_modules/.bin/sequelize db:seed:all // seed파일에 정의한 데이터 추가
    ./node_modules/.bin/sequelize db:seed:undo:all //데이터 삭제

    그러면 object가 테이블 형태가 매핑되어 데이터 삽입이 된다.

     

    mysql 콘솔에서 정상적으로 테이블에 데이터가 삽입된 것을 확인할 수 있다.

     

    # 데이터 가져오기

    const models = require('./database/models'); // 경로 주의
    
    const getOneUser = async() => {
      const id = 1;
      const user = await models.Users.findOne({where: {id}});
      console.log(user);
    }
    
    const getUsers = async() => {
      const users = await models.Users.findAll();
    }
    

     

    마이그레이션 작업으로 생성된 models 디렉토리 경로를 가져온다. sequelize는 비동기 처리로 하기 때문에 async await를 사용하는게 편리하다.

    models.테이블명.findOne({where: {칼럼: 조건}}); 으로 해서 특정 값을 가져오고,

    model.s테이블명.findAll()로 전체 데이터를 가져올 수 있다.


    # sequelize 디렉토리 정리

     

     

    프로젝트 최산단 경로에 'database'폴더와 '.sequelizerc' 파일을 하나씩 생성해준다. 그리고 아래와 같이 내용을 입력한다.

    const paht = require('path);
    
    module.exports = {
      'config': path.resolve('config', 'config.json'),
      'models-path' : path.resolve('src/database', 'models'),
      'seeders-path': path.resolve('src/database', 'seeders'),
      'migrations-path':path.resolve('src/database', 'migrations')
    }
    
    // .sequelizerc 파일

     

    그리고 아까 마이그레이션과 seed작업으로 만들어진 models,migrations,seeders 디렉토리를 database 디렉토리로 이동한다.

    그리고 models/index.js 파일의 'config/config.json' 파일 디렉토리 경로를 다시 잡아준다

     

    그러면 기존과 똑같이 sequelize를 사용할 수 있다. 

     

    참고한 블로그 : https://velog.io/@jeff0720/Sequelize-CLI%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EA%B0%84%EB%8B%A8%ED%95%9C-User-API-%EB%A7%8C%EB%93%A4%EA%B8%B0-vdjpb8nl0k

     

    Sequelize CLI를 사용하여 User API 만들기

    서론 안녕하세요, 영훈입니다. 오랜만에 글을 쓰는거 같네요. 제가 쓴 글이 많은 분들에게 도움이 되길 바라면서 시작 해보겠습니다. 오늘은Sequelize와 Sequelize CLI의 개념에 대해서 알아보고난 후 Sequelize CLI를 사용하여 간단한 유저 정보 조회 API를 만들어 보도록 하겠습니다. 이론 ORMMapping.png Seq...

    velog.io

     


    설명이 정말 잘 되어 있다. 위 블로그 덕분에 시퀄라이즈 사용법을 얼추 느낄 수 있었다.

     

    아직 테이블 생성 삭제 등을 cli 사용방법밖에 모르지만, 오늘 저녁쯤 한번 더 찾아보고 공부해 볼 예정이다.

    시퀄라이즈는 프로젝트의 DB부분에 정말 유용하게 사용할 수 있을 것 같다.

    반응형

    댓글

Designed by Tistory.