back-end/express.js

[Express+Sequelize] MySQL과 Express연결 (ES6)

hojung 2022. 7. 10.
728x90
반응형

1. 문제

대부분의 sequelize설명들이 구글링을 한 결과 CommonJS의 require문을 통해 구현이 되어있거나 ES6의 Class를 extends한 뒤 구현을 하는 형태로 이루여저 있었다. 하지만 나는 Sequelize의 모델을 define함수 내에서 정의해주고 싶었고 내가 현재 개발하고 있는 Express서버는 ES6를 사용하고 있었으므로 구글링을 통해 찾은 require문은 사용할 수 없었다. 따라서 ES6의 모듈 import와 export를 사용해서 코드를 바꿔보자는 생각을 가지고 이슈를 해결하였다. 

 

2. Sequelize+Express의 연결

sequelize는 백엔드 서버에서 mysql을 간단히 조작할 수 있도록 도와주는 라이브러리이다. 나는 mysql을 database수업 시간에 다뤄본 적이 있어서 터미널로 조작했지만 쉽게 확인하려면 mysql workbench를 사용하는 것이 더 좋을 수도 있겠다. 

 

우선 연결을 하려면  다음과 같은 것들을 설치해주어야한다. 

yarn add mysql2 sequelize sequelize-cli

그 후 sequelize를 시작하려면 다음과 같은 명령어가 필요하다. 

sequelize init

위의 명령어를 실행하면 sequelize를 실행하는데 필요한 파일들이 생성된다. 

생성된 폴더

다음 네 폴더가 sequelize를 실행하는데 필요한 폴더이다. 

우선 config에는 데이터 베이스의 정보 및 비밀번호와 같은 내용이 들어간다. 

config.json의 모습이다. password부분에 자신의 mysql비밀번호를 넣어주면 된다. 

 

그 후 아까 생성된 models안에 존재하는 index.js로 이동한 후 sequelize 객체를 생성해준다. 

const sequelize = new Sequelize(config.database, config.username, config.password, config);
import Sequelize from "sequelize";
import Config from "../config/config.json";
const env = process.env.NODE_ENV || "development";
const config = Config[env];
const db = {};
const sequelize = new Sequelize(config.database, config.username, config.password, config);
Object.keys(db).forEach((modelName) => {
	if (db[modelName].associate) {
		db[modelName].associate(db);
	}
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

export default db;

models/index.js의 모습이다. 이 때 json모듈을 import하는 부분에서 문제가 생길 수 있지만 package.json파일의 script를 조금 수정해줌으로써 해결할 수 있다. 

package.json파일의 명령어 수정

이렇게 하면 아마 터미널이나 mysql workbench를 통해서 아무 테이블이 들어있지 않은 아까 config.json파일에서 지정해준 이름의 데이터 베이스가 들어있는 것을 확인할 수 있을 것이다.

나는 아까 simbwatda로 설정해주었기 떄문에 다음과 같은 이름의 데이터베이스가 생성된 것을 터미널에서 확인할 수 있었다. 

테이블이 비어있다.

 

3. 테이블 만들어주기

sequelize에서 테이블을 만들어주려면 model이라는 것을 이용해야한다. 원래는 create table문을 이용해야하지만 sequelize에서는 자바스크립트를 이용해서 mysql에 테이블을 만들어줄 수 있다. 나는 우선 user테이블을 만들어주려고 한다. 

ES6는 모듈 기반이므로 나는 테이블 별로 파일을 만들어주었다. 파일의 위치는 아까 sequelize init명령어를 통해 생성된 models폴더 안에 생성해주었다. 

생성된 user.js

우리가 만들고 싶은 Entity들을 정의해준다. 이 테이블을 정의할 때 mysql에서 할 때처럼 primary key등과 같은 것들은 sequelize가 어느 정도는 알아서 해준다. 

const User = (sequelize, DataTypes) => {
	const User = sequelize.define(
		"User",
		{
			//id가 기본적으로 들어있다.
			email: {
				type: DataTypes.STRING(30),
				allowNull: false, //필수
				unique: true,
			},
			nickname: {
				type: DataTypes.STRING(30),
				allowNull: false,
			},
			password: {
				type: DataTypes.STRING(100),
				allowNull: false,
			},
		},
		{
			charset: "utf8",
			collate: "utf8_general_ci", // 한글 저장
		},
	);
	User.associate = (db) => {
		db.User.hasMany(db.Post);
		db.User.hasMany(db.Comment);
		db.User.belongsToMany(db.Post, { through: "Like", as: "Liked" });
		db.User.belongsToMany(db.User, { through: "Follow", as: "Followers", foreignKey: "followingId" });
		db.User.belongsToMany(db.User, { through: "Follow", as: "Followings", foreignKey: "followerId" });
	};
	return User;
};

export default User;

위의 코드를 보면 const를 사용해서 지정해준 후 export default문을 통해 module로써 내보내고 있다. 

User.associate에는 다른 테이블 과의 관계를 설정해주면 된다. 일대일 일대 다 등 데이터 베이스 수업 시간에 배운 관계들을 설계하고 지정해주었다. 그 후 index.js파일에 import를 해준다. 

import Sequelize from "sequelize";
import Config from "../config/config.json";
import Comment from "./comment.js";
import Hashtag from "./hashtag.js";
import Image from "./image.js";
import Post from "./post.js";
import User from "./user.js";
const env = process.env.NODE_ENV || "development";
const config = Config[env];
const db = {};
const sequelize = new Sequelize(config.database, config.username, config.password, config);

db.Comment = Comment(sequelize, Sequelize);
db.Hashtag = Hashtag(sequelize, Sequelize);
db.Image = Image(sequelize, Sequelize);
db.Post = Post(sequelize, Sequelize);
db.User = User(sequelize, Sequelize);
Object.keys(db).forEach((modelName) => {
	if (db[modelName].associate) {
		db[modelName].associate(db);
	}
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

export default db;

다음과 같이 import를 해주고 아까 지정한 함수들을 실행해주면 된다. 

 

4. app.js와 연결

그 후 app.js(기본이 되는 파일 )로 이동한 후 

models/index.js에 정의된 db를 import해주고 sequelize명령어를 이용해서 mysql과 연결해주면 아까 정의한 모델들이 mysql의 table로 변환되어 생성된다. 

다음과 같이 코드를 작성해주고 npm start명령어를 통해 서버를 실행시켜주면 

다음과 같은 로그들이 터미널에 찍히면서 테이블들이 생성된다. 

mysql 터미널

mysql터미널에서 확인해봐도 테이블들이 잘 생성된 것을 확인할 수 있다. 

728x90
반응형

댓글