객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 의미한다.
객체지향 프로그래밍-클래스사용
관계형 데이터베이스-테이블사용
👉 객체 모델과 관계형 모델간 불일치 존재
이것을 ORM을 통해 해결하는데, 객체간 관계를 바탕으로 SQL을 자동으로 생성한다. (데이터베이스의 데이터와 객체의 필드를 매핑해줌)
ORM은 특정 Database에 종송되지 않는다는 특징을 가진다.
ORM을 이용하면 객체는 객체대로 설계하고 관계형 데이터베이스는 데이터베이스대로 설계하고 중간에서 ORM 프레임워크가 중간에서 매핑해주어 서로의 의존성을 배제할 수 있다. -> 생산성 + 유지보수성 향상
ORM을 이용하면 query가 아닌 method로서 데이터를 조작할 수 있다.
기존 MySQL:
MySQL SELECT * FROM User;
대신
ORM 이용:user.findAll();
으로 메서드 호출로 데이터를 조회할 수 있다!
SQL문이 복잡해지면 ORM으로 표현하는 한계가 있다. 이런 경우 raw query문 실행할 수 있는 방법 제공
ORM을 이용하면 관계형 모델과 관련된 성능 오버헤드를 수반하지 않고도 요구사항에 적합한 도메인 모델을 생성할 수 있으며 column이 아닌 Object 관점으로 작업수행이 가능하다.
ORM은 변경사항을 자동감지하여 전체 개발 라이프사이클에 걸쳐 에러의 가능성을 줄여준다.
sequelize는 NodeJS에서 MySQL을 사용할 때 raw query문을 사용하지 않고 더욱 쉽게 다룰 수 있도록 도와주는 라이브러리이며 Promise 문법을 사용하는 NodeJS기반 ORM이다.
sequelize를 사용하기 위해서 설치해야할 모듈은 sequelize와 RDB모듈이다.
npm install sequelize mysql
sequelize-cli를 이용하면 초기설정을 손쉽게 할 수 있다.
sequelize-cli사용하여 모델을 만들면 migration이 생기는데, 모델과 마이그레이션안에 있는 내용이 같아야 한다. 그리고 모두 수정이 끝나면 sequelize db:migrate
를 해주는데 이때 다시 migration파일을 수정할 것이 생기면 꼭 sequelize db:migrate:undo
나 sequelize db:migrate:undo:all
을 해줘야 한다. 그래야 수정사항이 반영되니까 꼭꼭!! 이것 때문에 안되서 한참 헤맸다..
- 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): 한 개 || 여러 개 레코드 삭제
자세한 설명까지 잘 나와있는 요기를 참고하며 코딩했다.
user 테이블과 todo 테이블의 관계를 설정하고싶었는데,
sequelize에서 foreign key를 설정할때는
'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;
};
이부분👇이 뽀인트인데 user
와 todo
의 관계를 정의하는 것이다.
user.associate=function(models){
user.hasMany(models.todo)
}
User와 Todo는 1:M관계로 User가 많은 Todo를 가지기 때문에 `.hasMany()`사용
'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;
};
여기서는 이 부분👇이 todo
가 user
에게 소속된다는 것을 의미하며,
외래키로 todo
의 user_id
를 사용하겠다라고 지정한 것이다.
todo.associate = function(models){
todo.belongsTo(models.user, {foreignKey: 'user_id'})
}
서버 뜯어고치기 중..