MySQL을 쓰는 이유
현재 복습하고 있는 Nodebird는 사용자가 쓴 게시글은 User와 Post 간의 관계가 있고, 사용자가 쓴 댓글은 User와 Comment간의 관계가 있습니다. 각 모델간의 관계가 많이 있기 때문에 관계형 데이터베이스인 MySQL을 이용하였습니다.
Sequelize 세팅하기
자바스크립트 코드를 SQL으로 바꿔주는 라이브러리인 sequelize와 노드와 MySQL을 연결해주는 드라이버인 mysql2을 설치합니다.
npx sequelize init 명령어로 실행하면
seeder : 테스트에 필요한 정보를 정의함
models : DB 모델 정보를 저장
migrations : 마이그레이션에 필요한 정보를 자동으로 저장함
디렉토리와
config/config.json : DB 연결 정보등을 저장함
이 생깁니다. config.json의 'development' 부분의 설치해놓은 MySQL의 password, 사용할 데이터베이스명을 입력해줍니다. config.json은 각각 개발환경, 테스트환경, 배포환경에서 작업을 진행할 수 있게 도와줍니다.
const Sequelize를 선언해주고, env가 기본값이 'development'로 설정해준뒤 config = require('../config/config')[env];를 통해 config.json이 development환경으로 구동될 수 있게끔 연결해줍니다.
const sequelize = new Sequelize(config.database(데이터베이스명), config.username, config.password, config);를 가져오는 코드를 작성합니다. 여기서 sequelize는 노드와 MySQL을 연결해주는 역할을 하게 됩니다.
https://sequelize.org/v5/manual/getting-started.html
데이터베이스 모델 만들기
user.js를 만들고, 위코드를 기본 골격으로 작성하시면 됩니다. 시퀄라이즈의 내장함수인 define 함수를 사용하여 DB를 만들어줍니다.
User를 대문자로 쓰게되면 MySQL에서는 users로 테이블이 생성되게 됩니다. 첫객체에서는 컬럼, 즉 테이블 데이터의 이름이 되는 부분을 작성해주고, 한글을 작성, 저장하기 위해서는 utf8과 collate에는 "utf8_general_ci"를 작성해줍니다.
또한, DataType이 어떻게 작성되어야 되는지 명시를 해줘야 합니다. email의 경우, 문자로 30자 안으로 작성(DataTypes.STRING(30))되게 해야되고,
allowNull: 필수로 입력되어야되는 값인지(값이 false인경우 필수로 입력해야되는 값)
unique: 고유의 값이 있어야되는지를 판단(true의 경우 고유의 값을 가짐)
으로 작성하면 됩니다. type에 자주 사용되는 것으로는
STRING(문자), TEXT, BOOLEAN(True, False), INTEGER(정수), FLOAT(실수), DATETIME 등이 있습니다. password 경우에는 STRING(100)을 주게 되는데 암호화가 되면 글자수가 길어지기 때문에 데이터값을 넉넉하게 주면 좋습니다.
데이터베이스 관계 설정하기
사용자(user) 1명이 여러 개의 게시글을 작성(post)할 수 있습니다. 여기서 user와 post의 관계를 1대다(1 : N)관계라 합니다.
user.js에는 db.User.hasMany(db.Post);
post.js에는 db.Post.belongsTo(db.User);
를 작성해주면 됩니다.
1대다(1:N) 관계 => hasMany, belongTo
다대다(N:M) 관계 => belongsToMany, belongsToMany
를 작성해줍니다.
해시태그를 클릭하면 관련 게시글들이 나오고, 게시글들에도 해시태그들이 여러개 작성할 수 있기때문에 이를 다대다(N:M)관계라 부릅니다. 이 다대다(N:M)관계는 중간에 테이블이 생깁니다. 만약 hashtagId가 1인 노드 해시태그를 가지고있는 게시글을 찾아오려면 hashtagId가 1인 것과 1을 가지고 있는 PostId를 찾아서 해당글을 검색해오게됩니다.
다대다(N:M)관계에서 belongsToMany로 연결시에 생기는 중간테이블명을 through로 변경할 수 있으며, User에서 변경을 해줬다면, Post에도 변경을 해줘야합니다. 또한, as를 통해 별칭을 설정해줄 수 있는데 이는 비슷한 컬럼을 가지는 코드를 썼을 경우, 미리 혼선을 방지하는데 유용합니다.
같은 테이블간 다대다(N:M)관계 설정하기
만약 제로의 팔로워를 찾으려면 팔로잉Id의 제로를 먼저찾고, 팔로워Id를 찾게됩니다. 따라서, 코드도 비슷하게 작성해주면 됩니다.
foreignKey를 이용하여 Follower에서는 FollowingId를 먼저 찾고, FollowerId를 찾게 됩니다.
foreignKey를 쓰는 이유 : foreignKey를 쓰지 않으면, followingId, followerId가 userId, userId로 칼럼명이 같아져 혼선이 생기므로 변경해줍니다.
같은 테이블간 1대다(1:N)관계 설정하기
Retweet의 경우, 1번게시글이 2,3,4으로 다시 작성되게 됩니다. 따라서, 1대다(1:N)관계가 되고, 마찬가지로 중간 테이블이 생기게 됩니다. 따라서, as를 통해 PostId 컬럼명이 겹치지 않게 작성해주면 됩니다.
모델들을 기획한대로 세팅했다면 index에 가서 불러온 뒤 sequelize 함수를 통해 각 모델 파일 내부를 실행되게 해줍니다.
sequelize.sync()는 Sequelize가 초기화될 때 DB에 필요한 테이블을 생성하는 함수입니다. then을 통해 연결성공 시 console.log로 연결이 성공되었다는 문구가 나타나게 설정해둡니다.
npx sequelize db:create 명렁어로 데이터베이스를 생성해줍니다.
node app 명령어를 통해 확인해보면 db연결이 성공했다는 메시지가 뜨는지를 볼 수 있고, MySQL workbench에서도 데이터베이스가 생성되고, 연결되어있다는 것을 볼 수 있습니다. 하지만, node는 옛날것만 기억해서 수정사항이 있다면 저장후 서버를 재시작해줘야만 갱신이 가능합니다. nodemon을 이용하면 저장하면 서버를 재시작해주기 때문에 훨씬 유용하게 사용할 수 있습니다.
nodemon app 명령어로 실행해주면 되지만, script의 "dev"를 통해 npm run dev할 수 있게 설정해주면 보다 편하게 사용할 수 있습니다.
'NodeBird 복습 > node.js' 카테고리의 다른 글
react nodeBird 2-6 (게시글 불러오기, morgan 도입하기) (0) | 2021.05.10 |
---|---|
react nodeBird 2-5 (게시글 댓글 완성, 로그인정보, credentials 이해하기) (0) | 2021.05.08 |
react nodeBird 2-4 (로그인완성 & 쿠키, 세션 이해하기) (0) | 2021.05.06 |
react nodeBird 2-3 (회원가입, CORS 적용하기) (0) | 2021.05.05 |
react nodeBird 2-1 (노드 서버, express 적용하기) (0) | 2021.05.03 |