Sequelize
는 각각의 메서드를 통해CRUD
를 구현
CRUD
는 대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성)
, Read(읽기)
, Update(갱신)
, Delete(삭제)
를 묶어서 일컫는 말이다.
또한 사용자 인터페이스가 갖추어야 할 기능(정보의 참조
, 검색
, 갱신
)을 가리키는 용어로서도 사용된다.
Database
는 SQL
문을 사용하여 CRUD
의 기능을 구현하는데, 여기서 SQL
문이란 관계형 데이터베이스 시스템(RDBMS)
에서 자료를 관리 및 처리하기 위해 설계된 언어를 뜻한다.
대표적인 SQL
문의 종류는 다음과 같다.
CRUD | 조작 | SQL |
---|---|---|
Create | 생성 | INSERT |
Read | 읽기 | SELECT |
Update | 갱신 | UPDATE |
Delete | 삭제 | DELETE |
이전 포스팅에서 설명했듯 Sequelize
는 DB
작업을 쉽게 할 수 있도록 JavaScript
객체와 관계형 데이터베이스를 서로 연결해주는 도구라고 설명했다.
그래서 Sequelize
는 CRUD
작업을 JavaScript
를 통해 만들며, 작성된 Sequelize
는 Promise
를 반환하므로 then
이나 async / await
문법을 사용할 수 있다.
이번 포스팅에서는 Sequelize
의 CRUD
를 구현하는 메서드들에 대해서 설명해보겠다.
본 예제는 아래의
Users
시퀄라이즈 모델을 참조한다.
module.exports = class User extends Model {
static init(sequelize) {
return super.init({
email: {
type: DataTypes.STRING(30),
allowNull: false,
unique: true,
},
password: {
type: DataTypes.STRING(100),
allowNull: false,
},
nickname: {
type: DataTypes.STRING(30),
allowNull: false,
},
age: {
type: DataTypes.INTEGER,
allowNull: false,
},
}, {
modelName: 'User',
tableName: 'users',
charset: 'utf8',
collate: 'utf8_general_ci',
sequelize,
});
}
};
create
메서드를 사용하여 필드를 생성한다.
INSERT INTO users (email, nickname, password, age) VALUES('aaa@naver.com', 'Mirrer', 'aaabbb', 20);
User.create({
email: 'aaa@naver.com',
nickname: 'Mirrer',
password: 'aaabbb',
age: 20,
});
findAll
, findOne
메서드를 사용하여 필드를 조회한다.
findAll
은 모든 데이터를 조회
SELECT * FROM users;
User.findAll({
:
:
});
findOne
은 하나의 데이터를 조회
SELECT * FROM users LIMIT 1;
User.findOne({
:
:
});
attributes
는 데이터의 특정 필드를 조회
SELECT email FROM users;
User.findAll({
attributes: ['email'],
});
where
은 데이터의 특정 필드를 조건부 조회
Op객체
를 사용하여 데이터 쿼리시 연산자를 적용
SELECT nickname, age FROM users WHERE nickname = 'Mirrer' AND age > 15;
User.findAll({
attributes: ['nickname', 'age'],
where: {
nickname: 'nickname',
age: {[Op.gt]: 15} // [Op.gt] = 초과(>)
}
});
사용되는 Op객체
종류는 다음과 같다.
Op객체 | 기능 |
---|---|
Op.gt | 초과 |
Op.gte | 이상 |
Op.lt | 미만 |
Op.lte | 같지 않음 |
Op.or | 또는 |
Op.in | 배열 요소 중 하나 |
Op.notIn | 배열 요소와 모두 다름 |
order
는 데이터의 특정 필드를 정렬
SELECT nickname FROM users ORDER BY age DESC;
User.findAll({
attributes: ['nickname'],
order: [['age', 'DESC']]
});
중첩(nested)
된 order
는 2차원 배열로 지정
SELECT nickname FROM users ORDER BY age DESC, email ASC;
User.findAll({
attributes: ['nickname'],
order: [
['age', 'DESC'],
['email', 'ASC'],
]
});
limit
은 조회할 레코드의 갯수를 지정
SELECT nickname FROM users ORDER BY age DESC LIMIT 10;
User.findAll({
attributes: ['nickname'],
order: [['age', 'DESC']],
limit: 10, // 10개의 데이터를 조회
});
offset
은 조회할 레코드의 시작인덱스를 지정
SELECT nickname FROM users ORDER BY age DESC LIMIT 10 OFFSET 0;
User.findAll({
attributes: ['nickname'],
order: [['age', 'DESC']],
offset: 0 // 0번 인덱스부터
limit: 10, // 10개의 데이터를 조회
});
update
메서드를 사용하여 필드를 수정한다.
UPDATE users SET nickname = 'Mirrer2' WHERE age = 20;
User.update({
nickname: 'Mirrer2'
}, {
where: {
age: 20
}
});
destory
메서드를 사용하여 필드를 삭제한다.
DELETE FROM users WHERE nickname = 'Mirrer';
User.destory({
where: { nickname: 'Mirrer' }
});
include
메서드를 사용하여 테이블간의 관계를 정의한다.
User
, Post
테이블이 1:N(일대다)
관계일 때 아래와 같이 관계를 정의한다.
const user = await User.findOne({
include: [{
model: Post
}]
});
변수 user
에는 프로미스의 결과물인 모델이 반환되며, 이를 통해 다른 테이블을 데이터를 사용할 수 있다.
Node.js 공식문서
Node.js 교과서 - 조현영
React로 NodeBird SNS 만들기 - 제로초