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 만들기 - 제로초