데이터베이스에는 관계형 데이터베이스와 비관계형 데이터베이스 두 종류가 있다.
관계형 데이터베이스는 엑셀파일처럼 행과 열 형식의 데이터 저장 방식을 가졌고
비관계형 데이터베이스는 딕셔너리 형식의 객체와 배열이 중첩된 구조를 가지고 있다.
비관계형 데이터베이스에는 대표적으로 json파일이 있다.
MySQL은 가장 많이 쓰이는 관계형 데이터베이스 중 하나이다.
MYSQL 설치 및 실행
mysql 홈페이지에 접속해서 downloads 탭에 간 뒤
아래에 MySQL Community (GPL) Downloads 를 눌러서 이동한 뒤
MySQL Community Server 를 누르고 msi installer를 다운받으면 된다.
설치 파일을 실행해서 별 다른 설정 없이 패스워드만 정하고 설치를 완료하면 된다.
mysql 8.1 Command Line Client 를 실행하고 패스워드를 입력하면 mysql을 사용할 수 있다.
cmd창에서 mysql 사용하기
cmd창에 mysql을 입력하면 실행할 수 없는 프로그램, 배치파일이 아니라는 오류가 발생한다.
이를 해결하기 위해서 path를 바꿔줘야 한다.
mysql을 설치한 위치에 따라 다르겠지만 뭔가 바꾸지 않았다면
c드라이브에 program files에 mysql 폴더가 있을 것이다. 그 안에 bins 폴더의 주소를 복사한다.
C:\Program Files\MySQL\MySQL Server 8.1\bin
그리고 컴퓨터의 고급 시스템 설정에서 환경변수에 들어가서 시스템 변수의 path에
편집 누르고 위의 주소를 새로만들기로 추가한다.
cmd를 다시 실행해서
mysql -u root -p
를 입력하고 패스워드를 넣으면 mysql을 실행할 수 있다.
create database study;
show databases;
이 명령어들을 이용해서 study라는 데이터베이스를 만들고 확인할 수 있다.
Sequelize
자바스크립트만 가지고 데이터베이스를 조작할 수 있게 해주는 도구가 sequelize이다.
npm install sequelize
npm install mysql2
이 명령어를 통해 sequelize를 설치하고 실행할 수 있다.
그럼 이제 db.js 파일을 작성해보자.
var Seq = require("sequelize")
var seq;
seq = new Seq.Sequelize("study", "root", "vkfksshdmf0207",{
host:"localhost",
port:3306,
dialect:"mysql",
timezone:"+09:00",
define: {
charset:"utf-8",
collate:"utf8_general_ci",
timestamps:true,
freezeTableName:true
}
})
var db = {};
db.seq = seq;
db.Seq = Seq;
module.exports = db;
require로 sequelize를 가져오고, Sequelize 함수를 이용해 데이터베이스를 가져온다.
study는 아까 만들었던 데이터베이스의 이름이고, vkfksshdmf0207은 mysql의 패스워드이다.
host, port, dialect 등을 지정해주고, timezone은 한국시간, charset가 collate는 한글 인코딩이 깨지게 않게 해준다.
timestamps는 데이터를 넣을 때 날짜, 시간을 같이 입력해주는 툴이고
freezeTableName은 데이터베이스를 만들 때 자동으로 이름을 복수형으로 지정하기 때문에 이름이 의도한것과
달라질 수 있는데 이렇게 하지 않고 원하는 대로 테이블 이름을 설정할 수 있게 해준다.
이렇게 우리가 만든 데이터베이스를 불러오고 나면,
db객체를 만들어서 모든 정보를 담은 뒤 module.export로 db를 사용할 수 있게 해준다.
app.js파일로 가서
const db = require('./model/db')
이 코드를 추가하면, db를 가져올 수 있다.
app.listen(3000, function(req, res){
db.seq.sync({force:false})
console.log("서버")
})
app.listen함수에 sync함수를 이용해 db에 접속할 수 있다.
테이블 추가
model 폴더 안에 users.js 라는 파일 생성
module.exports = function(sequelize, DataTypes){
return sequelize.define('users', {
idx: {
type : DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true,
allowNull: false
},
user_id : {
type: DataTypes.STRING(250)
}
});
}
sequelize의 define함수로 새로운 테이블을 만들고 설정과 테이블의 구조를 정한다.
테이블에 들어갈 요소는 idx, user_id이다.
idx는 숫자고 데이터가 추가될 때마다 자동으로 증가한다.
user_id는 string이고 길이를 250으로 지정하였다.
db.js파일 안에서
db.users = seq.import(__dirname+"/users.js");
이 코드를 추가하면 users.js에 작성한 내용을 데이터베이스 db의 users 테이블로 추가할 수 있다.
여기서 import가 제대로 되지 않고 에러가 발생하는 경우에는 sequelize의 버전 문제이다
npm install sequelize@5.22
이 명령어로 다른 버전을 설치하고 실행하면 잘 된다.
이렇게 하고 서버를 실행하면 테이블이 추가된다.
show tables;
desc users;
mysql에 들어가서 이 명령어들을 통해 users테이블과 구조를 확인할 수 있다.
CRUD 기능 추가
CRUD는 create, read, update, delete의 약자로 데이터베이스를 관리하는 기본 요소를 의미한다.
router.get("/data/create", function(req, res){
let user_id = parseInt(Math.random() * 1000)
db.users.create({user_id:user_id}).then(function(result){
res.send({success:200})
})
})
router.get("/data/read", function(req, res){
db.users.findAll().then(function(result){
res.send({success:200, data:result})
})
})
먼저 create와 read를 router의 controller.js 파일 안에 get 방식으로 추가하였다.
위에서 데이터베이스의 테이블 구조를 만들 때 user_id라는 요소룰 추가하였기 때문에
user_id를 랜덤으로 만들어서 추가하였다. Math.ranndon()*1000은 random 함수가 임의로 만드는
소수에서 1000을 곱하고 parseInt로 정수로 바꿔주면 소수점 아래 세 자리를 쓰겠다는 뜻이 된다.
임의의 세 자리 정수로 user_id를 만들고 객체를 만든 뒤, users 테이블에 데이터를 추가하였다.
then함수는 영어 그대로 create함수가 실행되고 난 뒤에 실행되는 함수로,
성공했다는 메세지를 send한다.
read는 findAll이라는 함수를 이용해 users 테이블에 있는 모든 데이터를 불러와서
send를 할 때 객체의 data:result로 넘겨준다.
제대로 실행되는지 확인하기 위해 postman이라는 툴을 사용할 것이다.
https://www.postman.com/downloads/?utm_source=postman-home
이 링크에서 다운을 받을 수 있다.
실행을 하고 GET방식으로 설정을 한뒤, 링크를 입력하고 send를 누르면 요청을 보낼 수 있다.
아래에 sucess:200으로 성공적으로 create가 되었음을 확인할 수 있다.
마찬가지로 GET방식으로 read의 링크를 send하면, 아래 결과에서 263이라는 랜덤한 user_id를 지닌
데이터가 읽혀오는 것을 확인할 수 있다.
router.post("/data/update", function(req, res){
let target_id = req.body.target_id;
db.users.update({user_id:9999}, {where:{user_id:target_id}}).then(function(result){
res.send({success:200})
})
})
router.post("/data/delete", function(req, res){
let target_id = req.body.target_id;
db.users.destroy({where:{user_id:target_id}}).then(function(result){
res.send({success:200})
})
})
다음으로 update와 delete이다. update와 delete는 req.body를 사용해서 값을 넘겨줘야 하기 때문에
post방식을 사용하였다.
먼저 update는 req.body.target_id룰 이용해 바꿀 id를 target_id라는 변수에 담았다.
그리고 update함수를 이용해 user_id를 9999로 바꿨다. where:{}를 이용해 바꿀 데이터를 찾아내었다.
delete는 destroy라는 함수를 이용해 원하는 데이터를 없앴고, 마찬가지로 where를 이용해 제거할 데이터를 찾았다.
**이렇게만 하고 실행을 하면 이상한 에러가 발생한다.
post방식을 사용하기 위해서는 app.js 파일에
app.use(express.json())
app.use(express.urlencoded())
이 코드들을 추가하여야 한다.
postman에서 post방식으로 바꾸고, update링크를 넣은뒤, Body로 이동해 x-www-form-urlencoded로 가서
key와 value에 target_id와 263를 넣어주고 send를 누르면, update가 제대로 되었다는 결과를 확인할 수 있다.
다시 read로 가서 확인해보면, user_id가 9999로 바뀌었음을 확인할 수 있다.
이번에는 delete링크를 넣고, target_id를 9999로 바꾸고 send를 누르면, 제대로 실행되었다는 결과가 나온다.
마찬가지로 read로 가서 확인해보면, 데이터가 없어졌음을 확인할 수 있다.
https://github.com/bluesunset0207/web-study
코드들은 이곳에 저장되어 있다.
'웹개발' 카테고리의 다른 글
점프 투 파이썬 3장 - 제어문 (0) | 2023.10.19 |
---|---|
점프 투 파이썬 2장 - 자료형 (0) | 2023.10.17 |
Node.js (0) | 2023.10.11 |
JavaScript (0) | 2023.10.11 |
Css (0) | 2023.10.11 |