학습목표
sequelize가 무엇이고, sequelize를 효율적으로 사용하기 위한 sequelize-cli가 무엇인지, 각 파일의 역할이 무엇인지 살펴보기
2022.12.14 직접 만져보면서 이 과정들을 다시한번 확인할 것. 아직 이해가 잘 안간다.
(1회독) 한번 쭉 읽어보고 스스로 요약을 시도했으나 기억을 떠올리지 못했음
ORM( Object Relational Mappings )이란 프로그램 상의 객체(Object)와 DB의 테이블(Relation)이 일대일 대응하는 관계를 맺는 것(Mapping)을 의미한다.
cf) 객체와 테이블을 같은 것이라고 봐도 무방하다.
ORM을 이용하면 query가 아닌 메서드로서 데이터를 조작할 수 있다는 것이 큰 장점이다.
ORM의 특징은 특정 DB에 종속되지 않는다. 따라서 DB와 커넥션만 연결되면 어떤 DB를 사용하던지 상관없이 동일한 메서드로 쿼리 수행이 가능하다.
여기에서 커넥션은 구체적으로 무엇을 가르키는가?(커넥션이 연결인데, 왜 이중표현을 쓰지?) 내 생각은 연결만 된다면 이라는 말이 가장 자연스러울 것 같다. 실제로 db와 연결시킬때는 xx커넥션이라는 라이브러리나 기능 같은건 내 기억에 없었기 때문이다.
ex)
MySQL
SELECT * FROM user; 쿼리 실행
ORM
User 테이블과 매핑된 객체를 user라 할 때, user.findAll(); 라는 메서드 호출
user.findAll(); 메서드를 직접 써보자.
※ 이렇게 ORM에서는 테이블과 매핑되는 객체의 메서드를 통해 쿼리를 조작한다.
그래서 ORM을 사용하면 생산성을 높일 수 있다.
(단, 개발자가 쿼리를 메서드로 호출할 뿐이지 메서드를 호출하면 내부적으로 쿼리가 실행되기 때문에 메서드가 원하는 대로 쿼리가 실행되고 있는지 파악할 수 있도록 쿼리 공부도 열심히 할 것)
Sequelize는 Node.js기반의 ORM으로 Promise 문법을 사용한다.
( Promise는 비동기 코드를 깔끔하게 작성하도록 도와주는 JS 문법이다 )
sequelize-cli은 명령어를 사용해 데이터베이스 작업을 할 수 있는 툴이며, sequelize-cli모듈은 sequelize를 조금 더 효율적으로 사용하기 위해서 몇 개의 폴더와 파일(=skeleton)을 생성해준다.
npm install -g sequelize-cli
cf) sequelize-cli 모듈을 전역으로 설치하면, 커맨더 창에서 sequelize 명령어를 실행할 수 있다.
config.json 파일에서 DB 커넥션 정보를 각 환경에 맞게 설정할 수 있다.
예시
{
"development": {
"username": "root",
"password": "비밀번호를 입력해주세요.",
"database": "clitest",
"host": "127.0.0.1",
"dialect": "mysql",
"operatorsAliases": false
},
...
}
username : DB 사용자명
password : DB 비밀번호
database : RDB에서 사용할 database이름
host : host주소
dialect : 사용할 RDB 이름
operatorsAliases : 연산자에 대한 별칭을 사용할 것인지 ( 참고 )
models 폴더는 Model을 정의한 js 파일들을 모아놓은 폴더이다.
models/index.js 파일은 다음 과정을 수행한다.
(1) /config/config.json 파일의 설정 값을 읽어 sequelize를 생성
(2) models 폴더 아래에 존재하는 js 파일을 모두 로딩
(3) db 객체에 Model을 정의하여 반환
정리하면, 여러 모델들을 한 객체( db )에 담아 반환하는 역할을 한다.
※ 위의 예시는 models 폴더의 모든 파일들을 불러와서 db객체에 모델을 정의하는 과정이다.
첫 번째 밑줄을 보면 반복문을 돌면서 import를 통해 현재 폴더 내의 모든 파일들을 불러오고 있다. import 메서드는 파일에 있는 Model 정의들과 완벽히 같은 object를 생성한다.
따라서 models 폴더 내에 Model을 정의하면, 반복문을 돌면서 Model들을 취합한다.
그런데 이는 모델을 정의만 하는 것일 뿐, 실제로 프로젝트 내에 모델을 등록하는 것은 sync() 메서드에 의해서 이루어진다.
메서드들이 어떻게 동작하고, 모델들을 어떻게 만들어내고 있는지 차근차근 이해해보자. 나중에 콘솔을 찍어봐야하는 일이 생길 수도 있다. (2022.12.14)
(참고)
foreach 반복문은 오직 Array 객체에서만 사용가능한 메서드이다. (ES6부터는 Map,Set 지원) map과 비슷해 보이지만 forEach는 return값이 없다.
두 번째에서는 반복문을 돌면서 associate() 메서드를 통해 Model 사이의 관계(N:M 등..)를 정의한다.
sequelize는 CRUD의 데이터 조작( DML : Data Manipulation Language ) 뿐만 아니라, 데이터 정의( DDL : Data Definition Language )도 지원한다.
따라서 이미 만들어진 테이블에 Model을 매핑할 수 있을 뿐만 아니라, DB에 테이블이 없는 상태라면 정의한 Model을 바탕으로 테이블을 생성할 수도 있다.
mapping이라는 개념이 말은 이해가 가겠는데, 직접보지 않으니 모호한데, 직접 model을 매핑을 해보면서 mapping의 개념이 무엇인지 이해해보자. (2022.12.17)
이를 수행하는 메서드가 sync() 이며, sync()는 모델에서 정의한 이름을 갖는 테이블이 존재하지 않을 경우에만 동작한다.
쉽게 말하면, /models/index.js 파일에서 정의한 모델들을 바탕으로 실제로 Model을 등록하는 일을 한다.
따라서 sync() 메서드를 호출하면 모델을 사용할 준비가 되는 것이다.
sync() 메서드를 호출하는 방법은 /app.js 파일 상단에 아래의 코드를 작성하면 된다.
/app.js
...
const models = require("./models/index.js");
models.sequelize.sync().then( () => {
console.log(" DB 연결 성공");
}).catch(err => {
console.log("연결 실패");
console.log(err);
})
...
출처
12.17 : 막혔던 문장도 시간을 두고 읽다보니 이해를 할 수 있었다.