💡 Sequelize
- Sequelize는 Node에서 데이터베이스 접속시 편리하게 작업할 수 있도록 도와주는 라이브러리, Promise 문법을 사용합니다.
- ORM(Object-relational Mapping) 으로 자바스크립트 객체와 데이터베이스 릴레이션을 맵핑해 주고 자바스크립트 구문을 알아서 SQL로 바꾸어 질의하기 때문에 SQL 문법을 몰라도 데이터베이스를 다룰 수 있게 도와줍니다.
- 더욱이 MySql, MariaDB, PostgreSQL, SQLite, MSSQL등 다른 데이터베이스도 같이 쓸 수 있기 때문에 유용하게 활용할 수 있습니다.
💡 Sequelize 설치
📌 npm i sequelize
📌 npm i mysql2
📌 npm i sequelize-cli
- sequelize를 조금 더 효율적으로 사용하기 위해서 몇 개의 폴더와 파일( 스켈레톤 )을 생성, npx sequelize init 을 통해 생성 가능
💡 dataType
📌 sequelize.define를 사용하여 column 선언시 속성의 dataType은 SQL문 dataType과는 조금 다른 이름으로 선언합니다.
- VARCHAR: STRING
- INT: INTEGER
- UNSIGNED 옵션이 적용된 INT: INTEGER.UNSIGNED
- ZEROFILL옵션: INTEGER.UNSIGNED.ZEROFILL
- TINYINT: BOOLEAN
- DATETIME: DATE
- NOT NULL: allowNull
- UNIQUE: UNIQUE
- 기본값: defaultValue
📌 options
- timestamps: true 일 경우 createdAt, updatedAt 컬럼을 자동으로 추가하고 row가 생성, 수정될 때 시간이 자동으로 입력됩니다.
- paranoid: timestamps 가 true 경우에만 사용가능합니다. deletedAt 이라는 컬럼이 추가되며 row 삭제하는 sequelize 명령 내릴 경우 deletedAt에 제거 날짜를 입력합니다.
- underscored: sequelize가 자동으로 생성해주는 컬럼명을 스네이크 형식으로 변경합니다. createdAt, updatedAt, deletedAt 컬럼을 각각 created_at, updated_at, deleted_at으로 변경해 줍니다.
- tableName: sequelize는 자동으로 define 메소드 첫번째 인자(모델명)를 복수형으로 만들어 테이블명으로 사용합니다. 테이블 명을 다른 것으로 지정하고 싶을 때 해당 옵션을 사용합니다.
💡 Model 간 관계 선언
📌 아래 메소드들을 사용하여 table에 해당하는 model간 관계를 맺어줍니다.
doc associations
- HasOne: One-to-one association
- HasMany: One-to-many association
- BelongsTo: One-to-one association
- BelongsToMany: Many-to-many association with a join table.
1:1
1:1 경우 hasOne, belongTo가 반대여도 상관없습니다.
db.User.hasOne(db.Info, { foreginKey:"user_id", sourceKey:"id"});
db.Info.belongTo(db.User, { foreginKey:"user_id", tarketKey:"id"});
1:N
foreginKey 를 사용하여 관계를 맺어줄 경우 hasMany는 sourceKey, belongTo는 targetKey를 사용합니다.
User.hasMany(Comment, { foreginKey:"commenter", sourceKey: "id"});
Comment.belongTo(User, { foreginKey:"commenter", targetKey: "id"});
N:M ( 각 테이블 PK를 부모로 여기는 추가 Table 생성)
새로운 릴레이션으로 사용될 이름을 through 속성의 값으로 넣어줍니다.
Post.belongToMany(HashTag, { through:"PostHashTag"});
HashTag.belongToMany(Post, { through:"PostHashTag"});