진행중인 프로젝트 폴더안에서 models 폴더로 가서 user.js파일을 만든다.(sequelize에서는 테이블을 모델이라고 부른다. / mysql에서는 table라고 부름)

사용자 정보를 저장할 코드를 만들어준다. User가 모델의 이름, 모델이름이 자동으로 users 소문자가 되고 복수가 되어서
MySQL에 저장이 된다. 이제 엑셀처럼 만들어준다하고 작성을 하자.
// models폴더의 user.js
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', { // MYSQL에는 users 테이블 생성
// id가 기본적으로 들어있다.
email: {},
nickname: {},
password: {},
}, {
charset: 'utf8',
collate: 'utf_general_ci', // 한글 저장
});
User.associate = (db) => {};
return User;
}
이번에는 models폴더 안에서 post로 파일을 생성한다. post에는 게시글이 있고 게시글 쓸때는 이모티콘도 사용할 수도 있으니까 charset부분에 'utf8mb4'라고 mb4도 같이 넣어준다.
// post.js 파일
module.exports = (sequelize, DataTypes) => {
const Post = sequelize.define('Post', { // MySQL에는 posts 테이블 생성
// id가 기본적으로 들어있다.
content: {},
}, {
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci', // 이모티콘 저장
});
Post.associate = (db) => {};
return Post;
}
이제 사용자 게시글을 만들어 주었으니 comment.js를 만들어 준다.

// comment.js
module.exports = (sequelize, DataTypes) => {
const Comment = sequelize.define('Comment', { // MySQL에는 comments 테이블 생성
// id가 기본적으로 들어있다.
content: {},
}, {
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci', // 이모티콘 저장
});
Comment.associate = (db) => {};
return Comment;
}
hashtag와 image도 있다. 만들자. image에는 이모티콘이 안들어갈거니까 charset를 'utf8'로 설정을 해준다.
// model 폴더안에 hashtag.js
module.exports = (sequelize, DataTypes) => {
const Hashtag = sequelize.define('Hashtag', {
// id가 기본적으로 들어있다.
name: {},
}, {
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci', // 이모티콘 저장
});
Hashtag.associate = (db) => {};
return Hashtag;
}
// model 폴더안에 image.js
module.exports = (sequelize, DataTypes) => {
const Image = sequelize.define('Image', {
// id가 기본적으로 들어있다.
src: {},
}, {
charset: 'utf8',
collate: 'utf8_general_ci', // 이모티콘 저장
});
Image.associate = (db) => {};
return Image;
}
사용자가 게시글에 좋아요 누른거랑 사용자가 쓴 게시글 정보랑 팔로우 팔로잉 한거도 db에 저장해야하는데 어떻게 해야할까?
공통점은 테이블 또는 모델이 하나만 단독으로 작동하고 있는 것이 아니다. 예를 들어 아래 폴더에서 user와 post 즉 사용자가 쓴 게시글 user와 comment 사용자가 쓴 댓글 이렇게 관계가 있고, 게시글에 달린 해시태그 또는 해시태그에 속해져 있는 게시글 이러한 식으로 서로 관계들이 있다. 게시글에 속한 이미지들이 있다.
그리고 같은 테이블 끼리 두번 참조관계가 있을 수가 있는데 사용자와 사용자가 팔로잉하고 팔로우하고 하는 관계가 있다. (어떤 사용자랑 다른 사용자 그 두명이 관계가 있는 것)

이러한 관계들은 associate에다가 적는 것이다.
관계들이 많기 때문에 MySQL같은 거를 관계형 데이터베이스라고 한다.(RDBMS RDBMS와 NOSQL의 차이점은 여기를 살펴보자.)
기본적인 낱개 테이블들을 독립적으로 만들어 주고 걔내들 간에 무슨 관계가 있는지 파악하면 된다.
// models폴더의 user.js
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', { // MYSQL에는 users 테이블 생성
// id가 기본적으로 들어있다.
email: {},
nickname: {},
password: {},
}, {
charset: 'utf8',
collate: 'utf_general_ci', // 한글 저장
});
User.associate = (db) => {};
return User;
}
email, nickname, password의 빈 객체 안에다가 컬럼에 대한 설명을 넣어주자. (엑셀에서 세로줄)
아래와 같이 작성해서 컬럼에 어떤 데이터가 들어갈지를 대충 적어줄 수 있다.(아래 STRING 대신에 INT 정수 FLOAT 실수 즉 소수가 될 수도 있고 TEXT라고 해서 엄청 긴글, BOOLEAN이 될 수도 있고 DATETIME이라해서 시간정보가 들어갈 수 도 있다.)
아래와 같이 해야지 어떤 데이터가 들어갈 수 있는지 엄격하게 검사를 해준다.
password는 왜 100글자냐면 password도 10글자에서 20글자 이렇게 쳐주는데 비밀번호는 암호화를 하면 길이가 엄청 늘어나기 때문에 넉넉하게 길이를 늘려놨다.
// user.js
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', { // MYSQL에는 users 테이블 생성
// id가 기본적으로 들어있다.
email: {
// 문자열이여야 하고 30글자 이내여야 한다.
type: DataTypes.STRING(30), // STRING, TEXT, BOOLEAN, INTEGER, FLOAT, DATETIME
allowNull: false, // 필수 true면 선택적
unique: true, // 고유한 값
},
nickname: {
type: DataTypes.STRING(30),
allowNull: false, // 필수
},
password: {
type: DataTypes.STRING(100),
allowNull: false, // 필수
},
}, {
charset: 'utf8',
collate: 'utf_general_ci', // 한글 저장
});
User.associate = (db) => {};
return User;
}
post와 comment도 변경시켜주자.
// post.js
module.exports = (sequelize, DataTypes) => {
const Post = sequelize.define('Post', { // MySQL에는 posts 테이블 생성
// id가 기본적으로 들어있다.
content: {
type: DataTypes.TEXT, // 글자를 일단 무제한으로 늘려놓자.
allowNull: false,
},
}, {
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci', // 이모티콘 저장
});
Post.associate = (db) => {};
return Post;
}
// comment.js
module.exports = (sequelize, DataTypes) => {
const Comment = sequelize.define('Comment', { // MySQL에는 comments 테이블 생성
// id가 기본적으로 들어있다.
content: {
type: DataTypes.TEXT, // 글자를 일단 무제한으로 늘려놓자.
allowNull: false,
},
}, {
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci', // 이모티콘 저장
});
Comment.associate = (db) => {};
return Comment;
}
hashtag는 20글자 이하로 제한을 해놓자.
// hashtag.js
module.exports = (sequelize, DataTypes) => {
const Hashtag = sequelize.define('Hashtag', {
// id가 기본적으로 들어있다.
name: {
type: DataTypes.STRING(20),
allowNull: false,
},
}, {
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci', // 이모티콘 저장
});
Hashtag.associate = (db) => {};
return Hashtag;
}
image 경로는 url이여가지고 엄청 길어질 수 있어서 STRING(200)으로 해놓는다. 이렇게 해서 각 컬럼에 대한 정보들을 적어놨다. 이렇게 해주면 Sequelize가 MySQL에다가 저절로 만들어준다. 알아서 만들어 주니까 원래는 SQL로 만들어야 하는데 SQL몰라도 JS 코드로 테이블을 만들수가 있다.
// image.js
module.exports = (sequelize, DataTypes) => {
const Image = sequelize.define('Image', {
// id가 기본적으로 들어있다.
src: {
type: DataTypes.STRING(200),
allowNull: false,
},
}, {
charset: 'utf8',
collate: 'utf8_general_ci', // 이모티콘 저장
});
Image.associate = (db) => {};
return Image;
}
user.js에서 사용자 정보가 다 필수로 되어있는데 기능에 따라서 true로 하여 선택적으로 할 수도 있다.
// user.js
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define('User', { // MYSQL에는 users 테이블 생성
// id가 기본적으로 들어있다.
email: {
// 문자열이여야 하고 30글자 이내여야 한다.
type: DataTypes.STRING(30), // STRING, TEXT, BOOLEAN, INTEGER, FLOAT, DATETIME
allowNull: false, // 필수 true면 선택적
unique: true, // 고유한 값
},
nickname: {
type: DataTypes.STRING(30),
allowNull: false, // 필수
},
password: {
type: DataTypes.STRING(100),
allowNull: false, // 필수
},
}, {
charset: 'utf8',
collate: 'utf_general_ci', // 한글 저장
});
User.associate = (db) => {};
return User;
}
<출처 조현영: [리뉴얼] React로 NodeBird SNS 만들기>
[리뉴얼] React로 NodeBird SNS 만들기 - 인프런 | 강의
리액트 & 넥스트 & 리덕스 & 리덕스사가 & 익스프레스 스택으로 트위터와 유사한 SNS 서비스를 만들어봅니다. 끝으로 검색엔진 최적화 후 AWS에 배포합니다., 새로 만나는 제로초의 리액트 노드버
www.inflearn.com
'Node.js > NodeBird(ZeroCho)' 카테고리의 다른 글
Sequelize sync + nodemon 구현 (0) | 2021.11.03 |
---|---|
Sequelize 관계 설정하기 (0) | 2021.11.03 |
MySQL과 Sequelize 연결하기 (0) | 2021.11.02 |
Express Router 분리하기 (0) | 2021.11.02 |
Express로 Routing하기 (0) | 2021.11.02 |