- MVC폴더 구조에서 Model에 DB를 연결한다
- Controller에서 (req, res)를 받는 작동함수를 작성한다
- 다만 sql명령을 실행하는 함수가 Model파트에 추가되어 해당함수를 Controller에서 받아 사용한다
- 작동과정은 View > Router > Controller > Model > Controller > View 순서로 작동한다
- npm install mysql로 sql설치
- DB에 Table생성하고 더미 데이터 작성
- 새로운 user생성(중요!!)
CREATE USER 'sesac'@'%' IDENTIFIED WITH mysql_native_password BY '1234';
- sesac이라는 user를 비밀번호 1234로 설정하였다
GRANT ALL PRIVILEGES ON *.* TO 'sesac'@'%' WITH GRANT OPTION;
- 모든 테이블(.)에 대해 모든 권한(PRIVILEGES)을 가지도록 user에게 부여
FLUSH PRIVILEGES;
- 현재 사용중인 sql캐시 삭제하고 새로운 설정적용(필수!!!)
- mysql모듈을 require하여 connect객체 생성하고 해당 객체를 이용하여 query문을 DB로 전달하는 코드 작성
- Controller로부터 데이터를 받아 sql문을 실행하는 함수 작성
- conn(connect객체).query(sql문, (err, rows)=>{})
- sql문(1)과 error, rows(결과행)을 매개변수로 받는 함수(2) 2가지매개변수를 가지는 함수 작성
- model의 함수는 cb함수를 인자로 받아 sql문 실행(query메소드) 이후 작동하는 cb함수에 결과값 rows를 전달하도록 한다
- controller에서는 model의 함수에 데이터 전달 후 반환데이터를(rows) 받아 실행될 cb함수의 내용을 작성하게 된다
예를 들어 위의 코드의 경우 userid와 pw의 data를 받아서 검색하는
sql문을 실행하고 반환값을 cb(rows)로 다시 controller로 보내고 있다
post_signin함수가 받는 data와 cb 매개변수는 Controller에서 보내진다
- 현재 코드에서는 js의 axios를 통해 post메소드로 정보가 보내진 상태이다
- Controller는 req.body를 통해 데이터를 전달받아 model의 post_signin함수로 해당 데이터를 전달한다
- 또한 model의 함수 실행 이후 실행될 cb함수의 내용을 작성한다
controller의 post_signin은 model을 require한 User의 메소드
User.post_signin으로 받은 데이터 req.body를 넘기고
cb(rows)를 result로 받는 cb함수의 내용을 작성하고 있다
cb은 result즉, 결과 행의 길이가 1이상일 경우 true를 전송, 아닐경우(검색결과X)
false를 전송하여 로그인 기능을 작동하도록 하고 있다
View에서는 해당 send데이터로 로그인이 되었는지 되지 않았는지 표시한다
이하 View, Routes, app.js의 작업은 이전 MVC모델과 동일하게 진행된다
- Sequelize란 자바스크립트 구문을 알아서 SQL로 변환해주어 DB작업을 쉽게 할 수 있도록하는 ORM라이브러리이다
- ORM: Object Relational Mapping, 객체와 DB관계를 연결하는 도구
- Sequelize를 사용하면 Controller와 Model작성이 간단해지지만 초기 설정 과정이 다소 복잡하다
- Sequelize 설정 파일 참고 https://github.com/hjh3933/SeSAC_Dobong1_Web/tree/main/13_sequelize
- npm install sequelize sequelize-cli mysql2
- sequelize는 패키지 sequelize-cli는 명령어 실행 mysql2는 mysql과 sequelize를 연결하는 드라이버(도구)를 의미한다
- npx sequelize init으로 init명령어를 호출한다(npm아니고 npx인것 주의!!)
- 설치 시 몇몇 폴더가 생성되는데 수업에서는 migrations와 seeders폴더를 삭제하고 config와 models폴더만 사용하였다
config.json파일
개발(development) 버전만 남겨두고 username, pw, db등의 sql설정 관련 정보를
수정하였다
- index.js에서 sequelize, db, config를 설정한다
- 1. Sequelize는 sequelize모듈을 require한다
- 2. config는 앞선 config.json파일의 development버전을 require한다
- 3. sequelize는 Sequelize클래스에 config에 있는 db정보를 담아 선언된다(객체)
- 4. db는 선언 후 각각 sequelize와 Sequelize를 가진다
- 5. 사진에는 생략되어있지만 module.exports = db;로 내보내기를 한다
- 위의 내용까지가 sequelize의 기본설정이라고 할 수 있다 이제부터는 Sequelize를 사용한 DB사용 방법에 대한 설명이다
- DB에 있는 실제테이블을 토대로 Sequelize를 활용하여 Model을 작성한다
- 작성한 모델을 exports하여 controller에서 사용한다
- 모델의 기본구조는 다음과 같다
const ModelName = function(Sequelize, DataTypes) {
const model = Sequelize.define(params1, params2, params3);
return model;
};
module.exports = ModelName;
//***function(Sequelize, DataTypes)는 어디서 받는 걸까?
//각각 index.js의 sequelize와 Sequelize!!
//***params에 들어가는것은?
// params1: 모델 이름 정의
// params2: 컬럼을 정의, (CREATE TABLE 제약조건)
// params3: 모델 옵션
- 이후 모델의 index.js에서 exports바로 위에 db. 을 이용해 해당 객체를 저장하고(sequelize와 Sequelize변수 받아) 내보내기가 된다
model의 index.js파일의 하단코드이다
Visitor와 User모델이 정의되어 require되고 각각 seq, Seq를 매개변수로 받아
db의 이름으로 exports되고 있다.
- 예시 코드
datatype에 대한 정의나 제약 조건을 적는 방식이 다르다
- 해당 내용은 Sequelize관련 ppt와 공식문서를 참고하자
https://sequelize.org/docs/v6/core-concepts/model-querying-basics/
- sync()는 dml뿐만 아니라 ddl을 사용할 수 있도록 돕는다
- sync({force: false}) or sync()사용 시 테이블이 존재하면 해당 테이블 사용, 존재하지 않으면 새 테이블을 생성한다(작성된대로)
- true는 존재할 경우 테이블을 삭제하므로 사용하지 말자
app.js에서 404 get 밑에 작성된 코드이다
- models를 require하고 models.모델이름.sql명령()의 형태로 사용한다
- 기본 MVC모델의 Controller와 같이 req,res매개변수를 받는 작동함수 내부에 sql관련 명령이 작성되는 방식이다
- model단으로 데이터를 전송할 필요없이 받은 데이터를 곧바로 require한 models.모델이름으로 보낼 수 있다
- Sequelize의 CRUD는 sql문과 차이가 있다
- promise기반이라 실행 성공 후 결과를 then()으로 받는다
- 각 메소드의 괄호 안에 {} 배열의 형태로 조건이나 입력 내용 등이 작성된다
- 예시코드1) create
create({속성이름1: 입력값, 속성이름2: 입력값 ...}).then((sql실행 후 결과값)=>{})
- 예시코드2) findAll, findOne
모든 행을 가져오는 명령으로 별다른 입력없이도 가능하다
findOne({where: {속성1: 값, 속성2: 값...}})
- 예시코드3) update
update({속성1: 값, 속성2: 값}, {where: {속성1: 값, 속성2: 값..}})
- 예시코드4) destroy
destroy({where: {속성1: 값, 속성2: 값..}})
기존 SQL문의 블럭 별로 {}배열에 작성된다고 생각하면 된다
ex) where블럭, set블럭 values블럭 etc