와우.. 처음 설치해보는 DB입니다.. 두근두근했는데 역시나 잘 깔리지 않았어요 ㅠ_ㅠ
homebrew를 이용해 설치했지만 결국 환경변수 설정도 필요했습니다.
brew install mysql@5.7
brew services start mysql
homebrew를 설치했다는 가정하에 brew 명령어로 디비를 설치합니다.
그리고 mysql을 실행합니다.
mysql_secure_installation
그리고 위와 같이 작성했는데 not found같은 오류가 나온다면 환경변수 설정이 안된 것입니다. 이 것 때문에 또 한참 찾아다닌...ㅠㅠ
처음에 mysql을 설치할 때 나온 문구들 중에서 echo로 시작하는 부분 복사해서 터미널에 실행시킨 후, 터미널을 끄고 다시 켠 다음에 해보시면 될거예요.
그 다음 다시 위 명령어를 치면 나머지는 다 n, password 부분만 비밀번호를 설정해주세요.
해석이 가능하고 보안에 신경을 쓰신다면 다 n을 하지 마시고 보구서 설정해주시면 됩니다. 개발 연습용에서는 굳이 할 필요 없어서 다 N를 적어둡니다.
터미널에서 복잡하고 긴 디비를 보기 힘드므로 gui환경으로 디비를 볼 수 있는 프로그램.
https://dev.mysql.com/downloads/workbench/ 로 들어가서 다운로드하면 끝.
sequelize를 할 수 있는 디렉토리 구조를 자동으로 설치해 줍니다. config, models, migrations, seeders폴더가 생성됩니다.
npm i -g sequalize-cli // 전역설치가 안되어 있을 시 설치
sequelize init
config/config.json에서 DB에 관한 정보를 저장합니다. 비밀번호 부분을 바꿔줘야겠죠.
index.js에 아래와 같이 적습니다. sequelize를 사용하기 위한 설정 같은데 별 설명이 없었어서 이 부분은 아직 이해는 못했습니다.
models에서 테이블을 만듭니다.
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const db = {};
const sequelize = new Sequelize(config.database, config.username, config.password, config);
// 테이블 sequelize에 연결
db.Comment = require('./comment')(sequelize, Sequelize);
Object.keys(db).forEach((modelName) => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
models 폴더 아래에 놓인 파일들이 하나의 테이블이 됩니다.
ERD를 통해 데이터의 관계를 설계할 수 있습니다.
예를 들어 User 테이블이면,
module.exports = (sequelize, DataTypes) => {
// sequelize.define에는 대문자로 시작하게 적지만 실제 테이블명은 users
const User = sequelize.define('User', { // column정의
nickname: {
type: DataTypes.STRING(20), // 문자열. 20글자 이하
allowNull: false, // 필수항목
},
userId: {
type: DataTypes.STRING(20),
allowNull: false,
unique: true, // 고유한 값
},
password: {
type: DataTypes.STRING(100),
allowNull: false,
},
}, {
charset: 'utf8',
collate: 'utf8_general_ci', // charset과 colate를 해줘야 한글이 저장돼요.
// tableName: 'users' // sequalize에서 자동으로 이렇게 만들어주지만 헷갈린다면 표시.
});
// 테이블간의 관계
User.associate = (db) => {
db.User.hasMany(db.Post, { as: 'Posts' }); // hasMany: 여러개의 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' }); // foreignKey : db 컬럼명.
db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followings', foreignKey: 'followerId' });
};
return User;
};
(1) DataTypes
(2) charset
(3) 테이블간의 관계 표현
root/index.js
const express = require('express');
const db = require('./models');
const app = express();
db.sequelize.sync(); // 테이블 생성
app.listen(9000, () => {
console.log('server is running localhost:9000');
});