https://www.freepik.com/free-photos-vectors/banner

휴먼스케이프

Sequelize: 정의한 Model의 Instance 다루기

안녕하세요. 휴먼스케이프 개발팀 인턴 oliver입니다.

이 글에서는 sequelize에서 하나의 model을 가지고 생성한 (혹은 query를 통해 database에서 갖고온) instance를 다루는 방법을 소개하고자 합니다.

Model이란?

Database의 table을 표현하기 위해, sequelize를 통해 model이라는 것을 정의할 수 있습니다. 다음은 간단한 model에 대한 하나의 정의입니다.

3개의 column을 가진 human이라는 model 정의하기

Instance 만들어보기

Table에 실제로 쓰이는 값들을 row 형태로 넣듯이, 정의된 model에 해당하는 값을 다루기 위해서 instance를 만들 수 있습니다. 위 예시에서 만든 Human이라는 model을 가지고 instance를 만들어보도록 하겠습니다.

Human이라는 model에 해당하는 instance 만들기

이 instance는 .build()라는 method를 실행한 후, 그의 return값을 human이라는 변수 이름으로 지정해두었죠. 실제 table이 존재하는 database에 저장을 하거나 접속을 안하였기 때문에, 이것을 일시적인, non-persistent instance라고 부릅니다. 하나의 instance를 생성할 때에 모르는 attribute가 있다면, defaultValue로 대체가 가능합니다.

만약 이 instance를 나중에 database로 옮기는 방법이 없더라면, 활용도가 떨어질 수 밖에 없죠. 이 instance를 .save를 통해 database에 넣은 후, callback 함수를 통해 다시 불러올 수 있습니다.

Instance는 결국 database에 넣을려고 만드는건데… 하나의 함수로 해결할 방법이 없을까?

만약 생성한 instance를 바로 database에 저장하고 싶다면, .create함수를 대신 쓰면 됩니다. 앞서 알려드린 것과 다르게 이것을 persistent instance라고 부릅니다. 물론 database의 안전을 위해, 어떤 attribute들을 create할 수 있는지 제한도 걸어놓을 수 있습니다. 예를 들어, 권한 여부를 attribute로 저장을 한다면 이 기능이 유용할 수 있죠.

User의 isAdmin이라는 attribute의 기본값은 false이다.

위 예시에는 isAdmin의 기본값이 false인 User라는 model을 가지고 create를 했습니다. 그러나, { fields: [ ‘username’ ] } 옵션을 추가함으로서, username만 지정할 수 있도록 제한을 걸어둡니다. 나머지 attribute들은 기본값으로 대체되도록 만드는 거죠.

Instance를 만들어서 table에 저장할 수 있는 것 처럼 table에서 instance를 끌고와서 update시켜줄 수 있습니다. 이를 위해 .reload 함수를 쓸 수 있습니다.

Instance를 통해 row값들을 변경하기: update

Instance는 생성할 뿐만이 아니라, 이미 존재하는 table에서 query를 통해 가지고 올 수 있습니다. 이 값들을 update하기 위해서 두가지 방법이 있습니다. 1. attribute를 새로 지정해준 다음에 save함수로 바뀐 값을 저장하거나, 2. update라는 새로운 함수로 한번에 해결을 할 수 있습니다.

2가지 방법으로 instance 업데이트하기

create함수와 마찬가지로, update할 때 { fields: … } 옵션을 추가해서 어떤 attribute들을 업데이트할 수 있는지에 대한 제한을 걸어둘 수 있습니다.

Instance를 통해 table의 row를 제거하기: destroy

Instance를 table에서 제거하기 위해 destroy라는 method를 쓸 수 있습니다. 단, 만약 model에 paranoid 속성을 추가한다면 아래와 같이 { force: true }를 추가해줘야 아예 사라집니다.

여기서 잠시 paranoid에 대해 잠시 설명드리고자 합니다. 이미 아시는 분들은 이 부분을 넘겨주셔도 됩니다.

하나의 model을 정의할 때, paranoid: true를 아래 예시와 같이 함께 정의해주면 자동으로 deletedAt라는 새로운 column이 model에 추가됩니다. 하나의 instance를 생성했을 때, deletedAt는 null로 기본값이 정해집니다. 만약 paranoid한 model의 instance를 destroy했을 경우, 실제로 지워지지 않는 대신 함수가 실행된 시점의 시간값이 deletedAt에 저장됩니다. 이런 방법으로 처리된 instance들을 soft-deleted라고 부릅니다.

paranoid 옵션을 추가한 model

Paranoid 상태에서 soft-deleted된 값들을 복구하고 싶다면 .restore을 쓸 수 있습니다 (deletedAt의 값을 다시 null로 지정해줍니다).

여러 instance들을 한번에 다루기: bulkCreate

여러 instance를 한번에 생성하고, 다 같은 방식으로 편하게 다루기 위해 bulkCreate라는 method도 존재합니다. 간단한 예시를 한번 다뤄봅시다.

bulkCreate 예시 1

bulkCreate 예시 2

BulkCreate와 create의 차이점은 1. bulkCreate로 여러 instance들을 한번에 생성할 수 있고, 2. callback 함수에 생성한 instance들을 부르기 위해 findAll을 따로 쓰거나 { returning: true } 옵션을 추가해야 합니다.

Instance에 update와 destroy를 썼던 것 처럼, model에 여러 instance들을 한번에 업데이트 하거나 제거하고 싶을 때

[Model 이름].update

또는

[Model 이름].destroy

를 이용할 수 있습니다. 예를 들어, Human 모델에 age가 18인 사람들의 직업을 student으로 바꾸고 싶다면,

와 같이 써줄 수 있습니다.

Instance안에 있는 값들 불러오기: get

만약 instance를 console.log를 통해 출력했을 경우, 그 모든 정보가 당장 필요하지 않을 수도 있습니다. Instance의 value들만 출력하고 싶은 경우에 아래와 같이 .get과 함께 argument로 { plain: true }를 추가해주면 됩니다.

감사합니다.

Get to know us better! Join our official channels below.

Telegram(EN) : t.me/Humanscape KakaoTalk(KR) : open.kakao.com/o/gqbUQEM Website : humanscape.io Medium : medium.com/humanscape-ico Facebook : www.facebook.com/humanscape Twitter : twitter.com/Humanscape_io Reddit : https://www.reddit.com/r/Humanscape_official Bitcointalk announcement : https://bit.ly/2rVsP4T Email : support@humanscape.io

기업문화 엿볼 때, 더팀스

로그인

/