5.6 씨퀄라이즈
<sequelize 매커니즘 이해하기>
오늘 학습을 하기에 앞서 기본 세팅을 해줍니다.
필요한것을 깔고 모델의 인덱스부분에 불필요한 코드(fs 부분)를 삭제해 줍니다.
npm install express+npm install nunjucks + npm install mysql+ npm install mysql2
+ npm install sequelize-cli + npm install sequelize + npx sequelize init
세팅완료
간단한 코드를 만들어서 실행이 되는지 쳐봅시다.
새 파일 server.js를 생성합니다.
브라우저에 hello wolrd가 나오도록 하는 코드를 만듭니다. 제대로 작동이 되는지 서버를 실행시켜봅니다.
실행이 되는것을 확인이 되었다면, const sequelize 로 씨퀄라이즈를 가져옵니다.
console.log(sequelize) 를 찍어서 그안에 뭐가 들었나 보니 객체로 들어있는것을 확인 할 수 있었습니다.
변수선언에서 중괄호를 사용해주는데, 대소문자를 구분해서 특정하여 내가 원하는 프로퍼티값을 가져올 수 있습니다.
예를 들어 {sequelize} 라고 해주면 s가 소문자인 sequelize의 프로퍼티 값만 가져옵니다.
( S대문자 Sequelize는 결과값으로 class를 반환하는데 현재 class는 사용할 일이 없으므로)
이제 마리아 디비를 연결해봅니다.
DB가 제대로 연결 되었는지 아닌지 확인 해 볼 수 있는 방법이 무엇일까요?
바로 sequelize.sync를 이용하는 것입니다.
sequelize.sync는 결과값으로 new Promise 객체를 반환해 줍니다.
즉, 결과값이 코드 이행시 resolve가 되고 코드 거부시 reject가 되는 상태입니다.
이것을 이용해 then과 catch로 받을 수 있습니다.
sequelize.sync({ force:false, })
.then(()=>{
console.log('접속성공');
})
.catch(()=>{
console.log('접속 실패');
}
위 코드를 저장 뒤, 서버를 재실행 시켰을 때 제대로 실행이 되었다면 콘솔창에는 "접속 성공"이 나올 것입니다.
접속 실패가 뜬다면 나의 접속 정보를 잘못 입력한것이니 models의 index.js부분을 확인해 보면 됩니다.
여기서 또하나 기억해야 할 것으로, sequelize - DB간 연결이
sequelize를 이용한 접속이니 비동기로 처리되었다는 것 또한 알 수 있습니다.
(2교시)
<sequelize 매커니즘 찍먹>
mysql 매커니즘이 서버와 DB간의 요청과 응답으로 이루어지는 반면,
sequelize 매커니즘에서는 그 사이에 객체와 sequelize 가 들어갑니다.
(서버) "sequelize야 내 요청좀 들어줘"
(seq) (확인)" 서버가 얘네 테이블 내용을 받고 싶은거구나.
db야~ 이 객체 프로퍼티 가진 테이블 내용좀 다 가져와줘~ 서버 주게"
(DB) "여기 있어"(건네 줌)
(seq) "받았어~" (건네 받음)
"서버야 니가 말한 객체 있잖아. 그거에 해당하는 db내용 가져왔어 여기있어"(db 건네 줌)
(서버) "고마워 씨퀄아~"
씨퀄라이즈 매커니즘을 대화로 하자면 이런식입니다.
서버가 씨퀄한테 요청을 하고 씨퀄이 그 요청에 해당하는 걸 디비에서 받아와서 다시 서버한테 건내주는 식입니다.
이런 메커니즘을 더 깊게 이해하기 위해,
직접 객체를 생성해서 서버와 시퀄라이즈가 서로 의사소통을 할 수 있는 환경을 만들어 줄겁니다.
먼저 객체 생성부터 해봅니다.
<객체 생성하기>
먼저 model>user.js 파일을 만들어줍니다.
여기서 객체를 생성하고 프로퍼티를 줘서 씨퀄라이즈로 보내야 하기 때문에, 씨퀄라이즈 사용하려면 설정을 해줍니다.
const Sequelize = require('sequelize');
가져오는 파일이기 때문에 module.exports도 써줍니다. 객체의 원본 형태인 클래스값을 넘겨줄겁니다.
const Sequelize = require('sequelize');
module.exports = class User extends Sequelize.Model{
}
이렇게 써주면 다른 파일에서 이 파일을 받을 때 여기 클래스 부분을 받는게 되는것입니다.
※
여기서 class.
class User extends Sequelize.Model
- User 라는 클래스 (다른말로 하면 객체)가 있고 이 아이는 자식입니다.
그리고 extends 옆에 붙은 Sequelize.Model 이라는 아이가 부모입니다.
(여기서 대문자 Sequelize는 클래스. )
여기서 이제 바로 매서드를 하나 만드는데 그게
static init(){} 이라고 하는 매소드였습니다.
static은 클래스를 객체로 생성하지 않고 클래스 형태에서 바로 매서드를 실행할 수 있는 구문중에 하나입니다.
(정적 메소드중 하나임.)
※
이 상태에서 바로 super.init을 return해줍니다.
const Sequelize = require('sequelize');
module.exports = class User extends Sequelize.Model{
static init(){
return super.init();
}
}
super는 부모에 대한 내용에 접근할 때 쓰는 접근자입니다.
이 코드의 의미는, 부모인 Sequelize.Model에 접근해서 init을 실행할건데,
(Sequelize.Model에 또 init이라는 매서드가 존재하나봅니다.)
바로 자식의 매소드 init 을 실행 할 때 그렇게 될 것이라는 의미입니다.
즉 코드의 의미를 총 정리하자면, User라는 클래스에서 init매소드를 호출하게 되면 ,
바로 Sequelize.Model에 있는 init을 실행하도록 return해주는 겁니다.
자식과 부모를 연결해줬다고 보면 됩니다. 이 super.init() 의 결과값이 바로 static init()이 갖는겁니다.
....................(근데 여기서 의문.. 대체 왜,,? 왜지,,? 왜 굳이 클래스로 값을 받고 굳이 부모자식을 연결해줘서 쓰지..?)
super.init의 실행 방법- 괄호안에 객체가 인자로 들어갑니다. (이 부분은 이후에 안에 내용 넣을때 다시 나옵니다.)
이제 테이블을 만들어볼겁니다.
객체를 생성할 때 내가 원하는 프로퍼티 값을 줄거고, 그 값들이 DB 테이블의 필드값으로 들어갈겁니다.
따라서 내가 어떤 필드값을 가진 테이블을 만들고 싶은지 먼저 생각해봅니다.
우리는 " userid, userpw, username, gender, userimage "를 필드값으로 만들어봅시다.
module.exports = class User extends Sequelize.Model{
static init(){
return super.init({
userid:'',
userpw:'',
username:'',
gender:'',
userimage:''
});
}
}
그런데 여기서 중요한 점은, 각각의 내용을 입력할 때
DB가 알아들을 수 있도록 세부적인 조정을 해줘야 한다는 것입니다. 각 항목들에 대한 설정값을 넣어주면 됩니다.
※ (이때 super.init 안에 객체 안에 또 객체로 설정을 넣어줘야 합니다.)
※ (그리고 여기서 static init 으로 User 호출할때- 받는 값을 sequelize로 해줘야한다는데, 이부분은 지금 상태에서 이해하기가 어려우니 나중에 다시 본다고 하심)
models 안 user.js 파일을 만들어서 코드 짰는데 이부분을 왜 한거였지..? (뭔가 큰 흐름 파악이 안된다.. )근
근데 이제 생각해보니, 로그인할때 입력되는 그 데이터 정보 세팅을 해준 것 같다.( 그리고 나중에 index랑 연결해주기..?)
모르겠다... 뭔소리를 하는건지...
(3교시)
앞시간은 대면분들 설명해주심..
폴더 트리를 파악하는 것이 매우 중요합니다.
우리가 쓰는 폴더중에는 config라는 폴더가 있습니다. model이라는 폴더도, server.js 파일도 있습니다.
이런 구조를 머릿속에 그린 상태로 하나씩 생각해봅니다.
server.js 파일은 무엇을 가져온 상태인가요? -> model > index.js(의 결과치에 대한 객체) 를 가져왔습니다.
model 안에는 2개 파일 있습니다. index.js 와 user.js 입니다. 각각의 파일이 무엇을 가지고 오는지. 그리고 각각의 파일이 어떻게 쓰여서 어디로 가는지 파악 할 수 있어야 합니다.
user.js는 class를 반환해줍니다. user.js 파일은 어디서 처음 사용될까요? -> index.js 입니다.
타고타고 가는것입니다. 그래서 server.js에서는 user.js까지 접근할 수 있는것입니다.
model > index.js 파일에서 보면
const db = {};
const User = require('./user');
...
db.User = User;
이런 부분이 있습니다.
여기서 User는 model > user.js 파일을 보면
...
module.exports = class User extends Sequelize.Model{
static init(){
return super.init({
userid:{
type: seqeulize,
},
userpw:'',
username:'',
gender:'',
userimage:''
});
}
}
위 코드를 통해 User가 class라는걸 알 수 있습니다.
즉
db객체 에다가 User라는 프로퍼티를 만들어서 거기다 User 라는 class를 만든것입니다.
index라는 파일은 다른 model들을 한곳에 모아주고있는 역할을 하는 것이라고 합니다. .
(이건 뭔소린지 이해 안됨..)
(4교시)
다른건 외워서 친다한들 class는 외워서 치면 안되는 부분이라고 합니다..
4교시까지는 그냥 개인 이해시간 갖고,, 다음교시부터 create문이라던지 써본다고 합니다.
하.. 수업에 집중을 못하니 자습시간에도 뭘 자습해야 될지조차 모르겠는디...
이제 자습시간에는 뭘 자습할 지 모르겠으면 그냥 코드 외우거나 타자연습이라도 해야겠다.
(5교시)
4교시에도 쭉 자버려서 이제 정신이 들었음.. 오늘거는 꼭 복습하고 내일 빡세게 수업 들어야지.
insert, find, update,delete .. 등 쿼리문 연습을 함.
(6교시)
라우터 안에 라우터 넣는거..? uri 두개 연결하기 위해서 라고 함. 아주 굉장히 어렵군.
3개연결하려면,,? 선생님 이게바로 콜백헬이라 하시며 혀를 내두르심..
우리가 앞으로 계속 할것은 파일 쪼개기라고 합니다.
파일이 실행 됐을때 server.js가 무조건 거쳐가게 한다고 칩니다. 이것을 염두해두고 메인페이지를 작성해봅시다.