ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Sequelize.js 입문
    Computer Science/Database 2019.07.11 04:13

     

    노드와 MySQL을 연동해줄 뿐만 아니라 SQL문을 작성하는 것을 도와주는 라이브러리



    시퀄라이즈는 ORM(Object-relational Mapping)으로 분류된다.



    ORM은 자바스크립트 객체와 데이터베이스의 관계를 매핑해주는 도구이다.



    시퀄라이즈를 쓰는 이유는 자바스크립트 구문을 알아서 SQL로 바꿔주기 때문이다.



    1. Express-generator로 프로젝트 생성, 시퀄라이즈 설치



    npm i



    npm i sequelize mysql2



    npm i -g sequelize-cli



    2. 시퀄라이즈를 통해 익스프레스 앱과 MySQL을 연결.



    MySQL에서 정의한 테이블을 시퀄라이즈에서도 정의해야 함.



    MySQL의 테이블은 시퀄라이즈의 모델과 대응된다.



    즉 시퀄라이즈는 모델과 MySQL의 테이블을 연결해주는 역할을 한다.



    기본적으로 모델 이름은 단수형, 테이블 이름은 복수형



    시퀄라이즈는 알아서 id를 기본 키로 연결하므로 id컬럼은 적어줄 필요 없음.



    define() 테이블명과 각 컬럼의 스펙을 입력



    MySQL 테이블과 컬럼 내용이 일치해야 정확하게 대응됨.



    VARCHAR는 STRING, INT는 INTEGER, TINYINT는 BOOLEAN, DATETIME은 DATE



    INTEGER.UNSIGNED는 UNSIGNED 옵션이 적용된 INT 의미.



    literal 메서드는 인자로 넣은 문자를 그대로 사용하는 역할을 함.



    define 메서드의 세 번째 인자는 테이블 옵션, timestamps 속성이 true면



    시퀄라이즈는 createdAt, updatedAt 컬럼을 추가함.



    3. 기타 테이블 옵션



    paranoid, underscored, tableName



    timestamps: true 여야 paranoid: true 사용 가능 -> deletedAt 컬럼 추가



    로우를 제거하는 대신 deletedAt에 제거된 날짜를 입력.



    로우를 조회하면 deletedAt의 값이 null인 로우(삭제되지 않았다는 뜻)를 조회



    이렇게 하는 이유는 데이터 복구를 위해서.



    underscored 옵션은 스네이크 케이스 형식으로 바꾸어줌.



    스네이크 케이스란? 변수 이름에 대문자 대신 _를 사용하는 방식



    예를 들면, createdAt -> created_at



    tableName 옵션은 테이블 이름을 다른 것으로 설정하고 싶을 때 사용한다.



    시퀄라이즈는 자동으로 define 메서드의 첫 번째 인자를 복수형으로 만들어 테이블 이름으로 사용한다.



    이러한 자동 변환을 막고 싶다면 tableName 옵션에 값을 주어 해당 값으로 테이블을 만들 수 있다.


    4. 관계 정의하기



    일대다(1:N), 일대일(1:1), 다대다(N:M)



    MySQL에서는 JOIN이라는 기능으로 여러 테이블 간의 관계를 파악해 결과를 도출.



    시퀄라이즈는 JOIN 기능 알아서 구현해줌. 대신 시퀄라이즈에게 테이블 간에



    어떠한 관계가 있는지 알려주어야 함.



    1:N 

     

    -> hasMany() 

     

    <- belongsTo()



    시퀄라이즈가 스스로 실행하는 SQL문,

     

    CREATE TABLE IF NOT EXISTS(테이블이 존재하지 않을 시에 실행된다는 뜻)



    이미 워크벤치 또는 콘솔로 테이블을 만들어두었으므로 구문은 실행되지 않음.



    대신 실수로 테이블을 삭제했을 때는 위의 구문으로 인해서 다시 테이블이 생성됨.



    1:1 

     

    -> hasOne() 

     

    <- belongsTo()



    N:M 

     

    <-> belognsToMany(), 

     

    through, 

     

    데이터 조회시 여러 단계 거쳐야함.



    시퀄라이즈는 이 과정을 편하게 할 수 있도록 몇 가지 메서드를 지원한다.

     

    async (req, res, next) => { 
      const tag = await Hashtag.find({ where: { title:'Any' } }); 
      const posts = await tag.getPosts(); 
    }; 

     


    find메서드로 where 조건 찾고, get + 모델 이름의 복수형


    프로미스 형식

     

    HashTag.find({ where: { title:'Any' } }) 
      .then(tag => tag.getPosts()) 
      .then(posts => console.log(posts)); 

     

    add + 모델 이름의 복수형 메서드

     

    async (req, res, next) => { 
      const tag = await Hashtag.find({ where: { title:'노드' }}); 
      await tag.setPosts(3); 
    }; 

     

    5. 쿼리 알아보기

    시퀄라이즈로 CRUD 작업을 하려면 먼저 시퀄라이즈 쿼리에 대해 알아야 한다.

    SQL문을 자바스크립트로 생성하는 것이라 시퀄라이즈만의 방식이 있다.

     

    (1) 로우를 생성하는 쿼리

     

    INSERT INTO nodejs.users (name, age, married, comment) VALUES ('zero', 24, 0,'자기소개1'); 
    const { User } = require('../models') 
    User.create({ 
      name:'any', 
      age: 24, 
      married: false, 
      comment:'자기소개1', 
    }); 

     

    첫 줄이 SQL문, 그 아래는 시퀄라이즈 쿼리

    models 모듈에서 User 모듈을 불러와 create 메서드를 사용한다.

    주의할점은 MySQL의 자료형이 아니라 시퀄라이즈 모델에 정의한 자료형대로 넣어야함.

    시퀄라이즈가 알아서 MySQL 자료형으로 바꿔줌.

    (2) 로우를 조회하는 쿼리

     

    SELECT * FROM nodejs.users; 
    User.findAll({}) 

     

    모든 데이터 조회 findAll 메서드

     

    SELECT * FROM nodejs.users LIMIT 1; 
    
    User.find({}) 
    

     

    데이터 하나만 가져오는 SQL문, 

     

    데이터 하나만 가져올 때 find 메서드, 여러개 findAll



    attributes 옵션을 사용해서 원하는 컬럼만 가져올 수도 있음.

     

    SELECT name, age FROM nodejs.users WHERE married = 1 AND age > 30; 
    const { User, Sequelize: { Op } } = require('../models'); 
    User.findAll({ 
      attributes: ['name','age'], 
      where: { 
        married: 1, 
        age: { [Op.gt]: 30 }, 
      }, 
    }); 

     

    시퀄라이즈는 자바스크립트 객체를 사용해서 쿼리를 생성

     

    자주 쓰이는 연산자로는 Op.gt(초과), Op.gte(이상), Op.lt(미만), Op.lte(이하), 



    Op.ne(같지 않음), Op.or(또는), Op.in(배열 요소 중 하나), 



    Op.notIn(배열 요소와 모두 다름) 등이 있되.

     

    SELECT id, name FROM users WHERE married = 0 OR age > 30; 
    const { User, Sequelize: { Op } } = require('../models'); 
    User.findAll({ 
      attributes: ['id','name'], 
      where: { 
        [Op.or]: [{ married: 0 }, { age: { [Op.gt]: 30 } }], 
      }, 
    }); 

     


    Op.or 속성에 OR 연산을 적용할 쿼리들을 배열로 나열하면 된다.

     

    SELECT id, name FROM users ORDER BY age DESC; 
    User.findAll({ 
      attributes: ['id','name'], 
      order: [['age','DESC']], 
    }); 

     

    시퀄라이즈 정렬 방식, order 옵션으로 가능, 배열 안에 배열 있다는 점 주의

     

    정렬은 컬럼 두 개 이상으로 할 수도 있기 때문

    SELECT id, name FROM users ORDER BY age DESC LIMIT 1; 
    User.findAll({ 
      attributes: ['id','name'], 
      order: ['age','DESC'], 
      limit: 1, 
    }); 

     

    limit 옵션으로 가능, OFFSET도 offset 속성 구현

    SELECT id, name FROM users ORDER BY age DESC LIMIT 1 OFFSET 1; 
    User.findAll({ 
      attributes: ['id','name'], 
      order: ['age','DESC'], 
      limit: 1, 
      offset: 1, 
    }); 

     

    (3) 로우를 수정하는 쿼리

    UPDATE nodejs.users SET comment ='바꿀 내용' WHERE id = 2; 
    User.update({ 
      comment:'바꿀 내용', 
    }, { 
      where: { id: 2 }, 
    }); 
    

     

    update 메서드로 수정할 수 있음. 첫 번째 인자는 수정할 내용, 

     

    두 번째 인자는 수정 대상 찾는 조건

    (4) 로우를 삭제하는 쿼리

     

    DELETE FROM nodejs.users WHERE id = 2; 
    User.destory({ 
      where: { id: 2 }, 
    });



    destroy 메서드로 삭제할 수 있음.

     

    Node.js 교과서를 보고 정리한 내용입니다.

    댓글 0