모델을 만들어보자.
모델은 다음과 같은 형식으로 만든다.
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define(모델이름, {모델 데이터 설정}, {모델 옵션});
User.associate = (db) => { 다른 모델들과 관계 설정 }
return user;
}
예시를 통해 더 자세하게 살펴보자.
user.js
유저데이터를 다룰 user파일을 설정해보자.
데이터 설정 중 id는 자동으로 설정해주기 때문에, 만들어 줄 필요가 없다.
각 데이터들은 고유의 id값을 가진다.
데이터이름 : {
type: DataTypes.데이터타입,
allowNull: false(필수값)/true(데이터가없어도 됨),
unique: true(고유한 값을 가져야함)
}
데이터타입에는 다음과 같은 종류가 있다.
STRING(최대 글자 수), TEXT, BOOLEAN, ...
한글 입력이 가능하도록 하는 설정
{ charset: 'utf8', collate: 'utf8_general_ci' }
한글+이모티콘 입력도 가능하게 하려면 다음과 같이 설정한다.
{ charset: 'utf8mb4', collate: 'utf8mb4_general_ci' }
User.associate = (db) => { db.User.관계설정(db.관계있는모델, { through: 중간테이블(모델)이름, as: 별칭 }) };
다른 모델들과 어떤 관계가 있는지 파악해야한다. (이때 ERD툴을 사용할 수 있다.)
일대다 관계
User : Post = 1 : 多 관계가 있다.
(유저가 여러 포스트를 작성할 수 있지만, 포스트를 작성한 유저는 한 명이다.)
그럴땐 User는 관계설정으로 hasMany 를 사용한다.
Post는 User를 하나만 가지므로 관계설정은 belongsTo 이다.
db.Post.belongsTo(db.User)는 Post모델의 데이터 설정에 UserId라는 컬럼을 만들어줌.
일대일 관계
일대일관계의 관계설정은 hasOne , belongsTo 이다.
다대다 관계
다대다 관계의 관계설정은 belongsToMany 이다.
다대다 관계의 경우 중간테이블이 생성된다.
유저가 좋아요를 누른 포스트를 설정하는 관계를 생각해보자.
유저가 여러포스트에 좋아요를 누를 수 있고,
한 포스트에 좋아요를 누른 유저가 여러명 일 수 있다.
그럴때 다음과 같이 코드를 작성할 수 있다.
User.associate = (db) => {db.User.belongsToMany(db.Post, { through: 'Like', as: 'Likers' });
중간모델이름(through)는 Post에서도 동일하게 작성해줘야한다.
as를 작성하지 않는 경우는 Post 파일의 관점에서 생각해보자.
Post를 작성한 유저는 한명이므로 이미 UserId라는 데이터를 가지고 있다.
하지만 별칭을 만들지 않을 경우, 또다시 UserId라는 데이터가 생성되므로 혼란이 생긴다.
그러므로 별칭을 예를들어 Liked라고 설정하면 LikedId 데이터가 생성되고,
이 데이터안에 좋아요를 누른 유저 정보가 들어가므로 포스트를 작성한 유저와 헷갈리지 않을 수 있다.
Sequelize :: DB에 데이터 추가하기(포스트쓰기) (0) | 2021.01.01 |
---|---|
Sequelize:: DB에서 프론트로 필요한 정보만 전달하기 (0) | 2021.01.01 |
MYSQL :: sequelize_ express와 연결하기 (0) | 2020.12.23 |
MYQSL :: sequelize_ models 연결하기 (0) | 2020.12.23 |
MYSQL :: JavaScript를 SQL로 변환해주는 ORM, sequelize (0) | 2020.12.23 |
댓글 영역