[Node.js] Sequelize

Joo Yeong Park·2020년 10월 11일
1

develop

목록 보기
4/8

ORM

ORM(Object Relation Mappings)이란

객체관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 의미한다.

객체지향 프로그래밍-클래스사용
관계형 데이터베이스-테이블사용
👉 객체 모델과 관계형 모델간 불일치 존재

이것을 ORM을 통해 해결하는데, 객체간 관계를 바탕으로 SQL을 자동으로 생성한다. (데이터베이스의 데이터와 객체의 필드를 매핑해줌)

ORM은 특정 Database에 종송되지 않는다는 특징을 가진다.

왜 ORM 사용하지?

  • ORM을 이용하면 객체는 객체대로 설계하고 관계형 데이터베이스는 데이터베이스대로 설계하고 중간에서 ORM 프레임워크가 중간에서 매핑해주어 서로의 의존성을 배제할 수 있다. -> 생산성 + 유지보수성 향상

  • ORM을 이용하면 query가 아닌 method로서 데이터를 조작할 수 있다.

    기존 MySQL: MySQL SELECT * FROM User; 대신
    ORM 이용: user.findAll(); 으로 메서드 호출로 데이터를 조회할 수 있다!

    SQL문이 복잡해지면 ORM으로 표현하는 한계가 있다. 이런 경우 raw query문 실행할 수 있는 방법 제공

  • ORM을 이용하면 관계형 모델과 관련된 성능 오버헤드를 수반하지 않고도 요구사항에 적합한 도메인 모델을 생성할 수 있으며 column이 아닌 Object 관점으로 작업수행이 가능하다.

  • ORM은 변경사항을 자동감지하여 전체 개발 라이프사이클에 걸쳐 에러의 가능성을 줄여준다.

Sequelize

Sequelize란?

sequelize는 NodeJS에서 MySQL을 사용할 때 raw query문을 사용하지 않고 더욱 쉽게 다룰 수 있도록 도와주는 라이브러리이며 Promise 문법을 사용하는 NodeJS기반 ORM이다.

sequelize를 사용하기 위해서 설치해야할 모듈은 sequelize와 RDB모듈이다.
npm install sequelize mysql

sequelize-cli

sequelize-cli를 이용하면 초기설정을 손쉽게 할 수 있다.

나에게 도움을 주는 블로그!

sequelize-cli사용하여 모델을 만들면 migration이 생기는데, 모델과 마이그레이션안에 있는 내용이 같아야 한다. 그리고 모두 수정이 끝나면 sequelize db:migrate를 해주는데 이때 다시 migration파일을 수정할 것이 생기면 sequelize db:migrate:undosequelize db:migrate:undo:all을 해줘야 한다. 그래야 수정사항이 반영되니까 꼭꼭!! 이것 때문에 안되서 한참 헤맸다..

sequelize에서의 쿼리 사용법

  • INSERT 함수
    • create(values, options): 레코드 생성
    • findOrCreate(options): 조회 시 없으면 생성
    • findCreateFind(options): 조회 시 없으면 생성 후 조회
    • upset(values, options): 한 레코드만 insert || update
  • SELECT 함수
    • findOne(options): 하나만 조회 == find()
    • findAll(options): 여러 개 조회
    • findAndCountAll(find_options): 조회 후 조회된 것의 개수까지 반환
    • findByPk(id: Number|String|Buffer, options): 프라이머리키로 조회
    • findCreateFind(options): 조회 시 없으면 생성 후 조회
    • findOrCreate(options): 조회 시 없으면 생성
  • UPDATE 함수
    • update(values, options): 값을 업데이트 //여러 레코드 가능
    • upsert(values, options): 한 레코드만 insert || update
  • DELETE 함수
    • destroy(options): 한 개 || 여러 개 레코드 삭제

code

자세한 설명까지 잘 나와있는 요기를 참고하며 코딩했다.

user 테이블과 todo 테이블의 관계를 설정하고싶었는데,
sequelize에서 foreign key를 설정할때는

  • user.js
'use strict';
module.exports = (sequelize, DataTypes) => {
  var user=sequelize.define('user', {
    user_id: {
      type: DataTypes.STRING,
      allowNull: false
    },
    user_pw: {
      type: DataTypes.STRING,
      allowNull: false
    } 
  },);

  user.associate=function(models){
    user.hasMany(models.todo)
  }
  
  return user;
};

이부분👇이 뽀인트인데 usertodo의 관계를 정의하는 것이다.

user.associate=function(models){
    	user.hasMany(models.todo)
}
 User와 Todo는 1:M관계로 User가 많은 Todo를 가지기 때문에 `.hasMany()`사용
  • todo.js
'use strict';
module.exports = (sequelize, DataTypes) => {
  var todo = sequelize.define('todo', {
    todo_id: {
      type: DataTypes.INTEGER,
      allowNull: false
    },
    contents: {
      type: DataTypes.STRING,
      allowNull: false
    },
    is_completed: {
      type: DataTypes.BOOLEAN,
    },
    is_deleted: {
      type: DataTypes.BOOLEAN,
    },
    user_id:{
      type: DataTypes.STRING,
      allowNull: false
    }, 
  });

  todo.associate = function(models){
    todo.belongsTo(models.user, {foreignKey: 'user_id'})
  }

  return todo;
};

여기서는 이 부분👇이 todouser에게 소속된다는 것을 의미하며,
외래키로 todouser_id를 사용하겠다라고 지정한 것이다.

todo.associate = function(models){
    todo.belongsTo(models.user, {foreignKey: 'user_id'})
}

서버 뜯어고치기 중..

profile
웹 개발자를 꿈꾸는 삐약

0개의 댓글