노드 학습 13일차
목차
- 시퀄라이즈
- 설치방법
- 실행 환경 설정
- 관계 정의
시퀄라이즈
자바스크립트 문법으로 DB 조작이 가능하도록 돕는 라이브러리. ORM(Object-Relational Mapping)
설치 방법
npm i sequelize sequelize-cli
여기서 sequelize
는 시퀄라이즈 모듈의 본체고 sequelize-cli
는 시퀄라이즈 명령어를 사용할 수 있도록 돕는 모듈입니다.
npx sequelize init
명령어를 통해 시퀄라이즈를 사용할 기본 세팅을 할 수 있습니다.
이 부분이 sequelize-cli
를 통해 처리되는 기능입니다.
명령어의 주요 결과로써, 위에서 체크한 디렉토리가 생성되었음을 확인할 수 있습니다.
실행 환경 설정
npx sequelize init
명령어를 통해 생성된 디렉토리 내 파일을 통해 환경 설정합니다.
config
config 디렉토리 내에는 config.json
파일이 위치하며 개발/테스트/운영 으로 구분하여 사용할 수 있도록 세팅이 되어 있으며 DB HOST, 유저명, 스키마, 패스워드 등을 설정할 수 있습니다.
실제로 DB 연결이 아닌, 각 환경에 맞는 값을 미리 설정해 놓는 파일입니다.
models
models 디렉토리에는 index.js
파일이 있습니다.
여기서는 앞서 config.json
에서 입력한 설정값을 통해 데이터베이스에 연결하는 객체를 생성합니다.
실제 DB 연결은 app.js
에서 이루어지며 여기서는 연결하게될 객체를 만듭니다.
app.js
다음의 코드를 통해 DB에 연결합니다.
1
2
3
4
5
6
7
8
9
10
11
12
...
const {sequelize} = require('./models');
sequelize.sync({ force : false })
.then(()=>{
console.log('연결 성공');
})
.catch((err)=>{
console.error(err);
});
여기서 변수 sequelize
는 앞서 models/index.js
를 가리키며 여기서 생성한 DB객체를 가져온 것 입니다.
force:false
옵션은 사용할 테이블이 이미 존재한다면 해당 테이블을 유지하도록 합니다. true
로 설정하면 기존 테이블을 삭제하고 새로 생성합니다.
여기서 초보 학습자들이 테이블의 관계를 정립하고 생성하는 과정을 연습하기 위해서는 force:true
로 해놓는 편이 좋다고 생각합니다.
초보 학습자들에게는 테이블간의 관계 구성에 서투르기 때문에 잦은 실수가 반복되는데 이때 force:false
로 되어있다면 테이블을 DROP 하고 다시 만드는 과정을 반복해야하기 때문입니다.
관계 정의
1:N 관계
- 1이 되는 모델에서는 hasMany 를 통해 표현
- N이 되는 모델에서는 belongsTo 를 통해 표현
기본 형태)
1
2
db.{모델명}.hasMany({대상모델},{foreignKey:{컬럼명},sourceKey:{FK키 컬럼명}})
db.{모델명}.belongsTo({대상모델},{foreignKey:{컬럼명},sourceKey:{FK키 컬럼명})
사용 예시)
1
2
db.User.hasMany(db.Comment, {foreignKey:'commenter',sourceKey:'id'});
db.Comment.belongsTo(db.User,{foreignKey:'commenter',targetKey:'id'})
1:1 관계
- hasOne 과 belongsTo 를 통해 표현
- 이 때, hasOne 을 사용할 모델과 belongsTo 를 사용할 모델은 개발자의 선택
기본 형태)
1
2
db.{모델명}.hasOne({대상모델},{foreignKey:{컬럼명},sourceKey:{FK키 컬럼명}})
db.{모델명}.belongsTo({대상모델},{foreignKey:{컬럼명},sourceKey:{FK키 컬럼명})
사용 예시)
1
2
db.User.hasOne(db.Info, {foreignKey:'userId',sourceKey:'id'});
db.Info.belongsTo(db.User,{foreignKey:'userId',targetKey:'id'})
N:M 관계
- belongsToMany 를 통해 표현
through
속성으로 명시한 중간 테이블이 생성됨
기본 형태)
1
2
db.{모델명}.belongsToMany({대상모델},{through:'중간테이블명'});
사용 예시)
1
2
db.Post.belongsToMany(db.Hashtag,{through:'PostHashtag'});
db.Hashtag.belongsToMany(db.Post,{through:'PostHashtag'});