컨벤션이란 회사마다 다를 수 있죠. 공식 문서도 회사마다의 특징들이 있는 것 같은데요. Sequelize 의 공식 문서를 보면서 발견한 특징은 놓쳐서는 안 될 중요한 부분들이 죄다 Note: ~
에 들어가 있다는 것입니다.(물론 개인적인 생각입니다.)
그래서 Note 라는 표현을 발견하시게 되면 그냥 넘어가지 마시고 꼭 한번씩 확인해보시는 것을 추천해드립니다. 오늘도 공식 문서를 쭈욱 훑어보면서 Sequelize 를 이해하는데 도움이 되는 것들을 나름대로 정리할 예정인데요. 어제의 글도 그렇고 오늘도 대부분 Note 부분들을 정리하는 글이 될 것 같네요. 자 그럼 시작해보겠습니다.
공식 문서의 Model Instances 의 Note: logging instances 부분에 보면 모델 인스턴스를 로그로 찍어볼 때 그 자체를 바로 찍는 대신, toJSON()
을 적용해 로그로 찍는 것을 권장하고 있습니다. Sequelize 에서 자체적으로 많은 기능을 붙여두었기 때문에 그대로 로그를 찍어서는 값들을 일일히 알아보는 것이 어렵기 때문입니다.
공식 문서를 다루면서 무언가를 배워가려면 console.log 를 일일히 찍어가며 그 안에서 내가 쓸만한 것들이 무엇이 있는지를 파악해야 하는 경우가 다반사인데요. Sequelize 를 다룰 때는 toJSON()
을 적용해야 원하는 것들을 바로 파악할 수 있는 것이죠. 알아두면 좋을 내용이라 소개하게 되었습니다.
Sequelize 의 모델 인스턴스를 활용하다가 헷갈릴 수도 있는 부분인 것 같아 기록해두려고 합니다. 공식 문서에서는 Saving only some fields 라고 설명해둔 부분입니다.
const jane = await User.create({ name: "Jane" });
console.log(jane.name); // "Jane"
console.log(jane.favoriteColor); // "green"
jane.name = "Jane II";
jane.favoriteColor = "blue";
await jane.save({ fields: ['name'] });
console.log(jane.name); // "Jane II"
console.log(jane.favoriteColor); // "blue"
// The above printed blue because the local object has it set to blue, but
// in the database it is still "green":
await jane.reload();
console.log(jane.name); // "Jane II"
console.log(jane.favoriteColor); // "green"
Sequelize 에서 save
를 사용할 때 바꾸고자 하는 column 들을 배열에 담아 전달하면, 특정한 column 의 값만 변경할 수 있는데요. 위의 예시 코드에서는 4~5번째 줄에서 name 과 favoriteColor 를 설정해 주었음에도 6번째 줄에서 'name' 이라는 컬럼 이름만 전달하고 있죠.
근데 console.log(jane.favoriteColor) 를 찍어 확인해보니 "blue" 라고 나왔습니다. 공식 문서는 콘솔 로그에 색깔이 블루로 출력되는 것은 local object 가 블루로 세팅되었기 때문이지 데이터베이스 값이 변경된 것은 아니라고 설명을 덧붙이고 있습니다. 개발 환경 내에서 객체값이 변경되어 콘솔에 그렇게 찍히고 있지만, favoriteColor 를 저장하라고 전달한 것은 아니기 때문에 데이터베이스는 여전히 green 으로 되어있는 것이죠. 그래서 reload
를 하게 되면 실제 green 값이 다시 출력되는 것을 알 수 있습니다.
Sequelize 는 save
또는 create
를 활용해야 인스턴스를 기반으로 데이터베이스에 데이터를 저장하게 되어있습니다. 따라서 콘솔에 찍히는 것과 실제 데이터베이스에 저장된 값은 달라질 수도 있는 것이죠.
그 외에도 save
를 활용할 때 주의해야 할 점을 바로 그 아래 Change-awareness of save 에서 언급하고 있으니 함께 확인해두시면 좋을 것 같습니다.
Sequelize 는 숫자형 자료의 값을 증가시키거나 감소시키는 increment/decrement 메소드를 제공하고 있습니다.
메소드의 사용 방법은 다음과 같습니다.
인스턴스를_저장한_변수명.increment(컬럼_이름, {by: 증가시키는_양});
한글로 적은 부분에 실제 해당하는 값을 넣으면 됩니다. 만약 여러 개의 컬럼을 동시에 바꾸기를 원한다면 배열 안에 이름을 나열해서 전달할 수 있습니다. 메소드의 두 번째 인자로 전달하는 {by: ?}
에서 만약 1 씩만 증가시키기를 원한다면 두 번째 인자를 생략하는 것도 가능합니다.
링크로 안내한 공식 문서에 자세한 예시가 있으니 참고하시면 되겠습니다.
어떤 데이터를 데이터베이스에 삽입하고자 할 때, 만약 이미 같은 데이터가 있다면 그 값을 대신 사용할 수 있도록 해주고 데이터가 없을 경우에만 새로운 데이터를 만들어주는 메소드가 findOrCreate 메소드입니다.
이 메소드는 데이터베이스에 같은 데이터가 있든 없든 간에 인스턴스를 돌려주게 됩니다. 그리고 더해서 이것이 만들어진 것인지 아니면 가져온 값인지를 알려주는 boolean 값을 함께 리턴하죠. 공식 문서는 구조분해할당식을 이용해 리턴되는 값을 변수에 담아내고 있습니다.
중복되는 데이터를 걸러낼 수 있다는 점에서 사용 빈도가 높지 않을까 싶어 정리해보았습니다. 더 자세한 사용법은 링크로 안내해드린 공식 문서를 참고하시면 되겠습니다.