dukDukz
210506 Sequelize 상세 설명 본문
npm : 인터넷에서 install 파일을 다운 받는다고 생각하면 된다.
npx : 인터넷에서 install 파일을 받으면 설치한 install을 실행한다고 생각하면 된다.
sequelize 다운받고 npx 실행하면
config.json
models/index.js // 이 파일이 진짜 개중요
생성됨
index.js 안에
fs 부분 지우고
[환경세팅 부분]
1. db 접속정보 설정
models/index.js 에
const env = process.env.NODE_ENV || 'development';
config.json에 process.env 이 부분이 없으면 development를 쓴다는 얘기 - 가서 보면 없음
그래서 development 로 쓴다.
db 접속 초기 설정은 config.json 에서 해줘야 한다. 비번이랑 db 뭐쓸지 설정해주기
2. db 객체를 선언하고 sequelize(객체), Sequelize(클래스) 를 넣자.
index.js에서
db = { };
db라는 객체를 선언한다. 여기에 값을 담을거다. db.@ 로
index.js에서 db를 객체로 담아서 보냄
server.js
const sequelize = require('./models/index');
console.log(sequelize); 이것도 객체로 온다.
Sequelize는 class다.
이걸 new해서 sequelize 에 넣어서 보내준것
module.export = db; 하면 그러면 다른 파일에서 받아올 때 무조건 db값만 사용할 수 있다.
Sequelize : class
sequelize : 객체
3. sequelize 소문자 만 사용하기
server.js
지금은 소문자 sequelize만 쓰면 된다
{sequelize} 대괄호에 넣어주면
const {sequelize} = require('./models/index');
이 객체(require('./models/index'); )중 sequelize라는 프로퍼티만 가져온다
class(대문자Sequelize) 까지 가져올 필요 없으니까
const sequelize = require('./models').sequelize
이걸 {sequelize} 로 쓴거
그렇게 해서 콘솔을 찍어보면 Sequelize 부분은 나오지 않게 된다.
즉 sequelize의 내용만 객체로 가져왔다는걸 알 수 있음
4. db 연결
server.js
여기서 index.js를 연결하고 소문자 sequelize 만 가져옴 - 객체만
sequelize.sync({ force : false, })
sequelize.sync -> new Promise 객체로 반환된다
성공 - reserve
실패 - reject
로 반환된다.
그러면 .then과 .catch를 사용할 수 있다
5.
models/user.js 파일 생성
require('sequelize'); //class
module.exports = class User extends sequelize.Model{ }
class 전체를 받는 파일을 보내줌
class User라는 객체 자식이고 sequelize.Model 은 부모
static init(){ } // init 함수를 여기서 정의해주고 index.js에서 사용함
static 이라는 매서드
객체 만들지 않고 바로 실행하려고 할때 static 을 사용한다 - 정적 매서드
class 안에 매서드를 쓰려면 객체화 해야함!!!!
Class 안에는 여러 함수가 있는데 이거를 객체화 안하고 바로 쓸때 static을 써준다,
이경우네는 User라는 클래스 안에 있는 (매서드)init 함수를 바로 쓸 수 있게 하려고 한 것
return super.init({ });
부모에 대한 내용을 접근할때 접근자 super 를 사용함
부모에 있는 init 매서드를 실행하려고 한다.
Model 이라는거 안에 init이라는게 있다는...
6.
user.js
객체를 만들어준다
db datatype에 대한 값을 담아서 객체 생성
/*
이러한 필드값을 갖고싶음!
userid
userpw
username
gender
userimage
userdt
*/
* unique와 primary와 차이
unique 는 문자에도 설정가능
primary 는 숫자에만 가능
그리고 추가설정 (테이블에 대한 설정값)
{
sequelize,
timestamps : false,
underscored:false,
paranoid:false,
// 여기 위까지는 외우기
// 여기부터는
modelName : 'User', // class : class User extends Sequelize.Model 이거할 때 썼던거
tableName : 'users', // 실제 db에 들어간 테이블 이름
charset :'utf8',
collate:'utf8_general_ci'
}
7. user.js 파일 연결하기
models/index.js 에서 user.js 파일을 연결할거야
const User = require('./user'); //class 관련 내용은 초록색으로 표현됨
db.User = User; //db.User에 User라는 class를 넣는다.
User.init(sequelize);
db에 있는 접속정보를 담고 sequelize를 init한다는 느낌으로..
8.
server.js 에서 create문으로 값 넣어주기
const {User} = require('./models/index'); //User라는 변수만 가져오게됨
<sql문 처럼 써준다 create로>
app.get('/',(req,res)=>{
User.create({
userid : '',
userpw : '',
username : '',
gender : true,
userimage : 'no image',
// userdt : '', 얘는 디폴트로 들어가니까 빼줌
});
res.send('hello world');
})
추가하고 localhost 새로고침 하면 들어감
다른거 추가할거면 userid 바꿔서 추가하면 들어감
9. sql구문 쓰기
server.js 에서
let userList = User.findAll({});
console.log(userList);
콘솔 찍으면
Promise { <pending> }
Executing (default): SELECT `id`, `userid`, `userpw`, `username`, `gender`, `userimage`, `userdt` FROM `users` AS `User`;
결과를 Promise 객체로 반환한다
비동기로 처리하지 않아서 정확하지 않은 값이 옴
let userList = User.findAll({})
.then((result)=>{
console.log(result);
})
.catch((error)=>{
console.log(error);
})
이렇게 하면 정확한 값을 얻을 수 있다
변수에 넣어서 확인하려면 async await 를 사용한다. - 비동기
app.get('/',async(req,res)=>{
let userList = await User.findAll({});
//resolve 혹은 reject 완료후 값이 userList란 변수에 들어가게끔 await를 사용함
console.log(userList);
res.send('hello world');
})
Update문
//UPDATE 문
User.update({
userpw : '12345',
username : '곽인구1',
gender : false
},{
//이 부분이 where절
where:{ userid:'rh5815', gender=0 }
})
//UPDATE 문 await 사용
let result = await User.update({
userpw : '1234588',
username : '곽인구1',
gender : true
},{
//이 부분이 where절
where:{ userid:'rh5815' }
})
console.log(result);
0 : 수정된게 있다
1 : 수정된게 없다
DELETE 문
User.destroy({
where:{id:4}
});
10.
폴더트리
sequelize깔면서 깔린거
폴더 중 migration 지움 안쓰는거 다 지움
localhost:3000
실행하면
1. server.js 로 온다.
app.get('/') 여기가 실행되고
* 이렇게 쓰는것도 가능함
function hello (req,res){
res.send('hello world!!!')
}
app.use('/',hello);
이것도 결국엔 비동기라고 할 수 있다.
hello 함수를 다른 파일에넣고 불러오는것도 가능함
* 실습 중에 = 사진 12
/
/user
이렇게 했을때 안된이유
.use 가 '/' 로 시작하는 모든걸 말한다
localhost:3000
해서 먼저 / 조건에 맞음 -> 계속 / 이거를 씀
/user라고 주소창이 변경되도 / 이게 맞는줄 알고 씀
/user를 먼저 넣어놓으면 / 일때 아니니까 다음것도 봄
그 다음에 주소창에 /user를 넣으면 처음에 걸리는 /user를 사용함
******************************************
11. 폴더 나누기 - 사진 16
나누는 이유:
url 입력하는 부분 따로 빼고
코드 입력하는 부분은 따로 파일 만들어서 그 부분에만 적는다.
12.
exports.main = main
함수 딱 하나만 보낼 수 있냐? 이 함수를 보내면 받아오는 변수는 객체에 이 함수가 담아져있다
NO !!
객체를 만들어서 함수를 여러개 넣어서 담아 보낸다
다른 곳에서 받아와서 그 객체 안에 있는 함수를 쓰고 싶으면
객체.함수이름 이라고 쓰면 사용 가능하다.
13.
user폴더 나누기 사진 18
14.
파일이 다르면 변수 공유가 안됨!!
15. nunjucks
server.js
const nunjucks = require('nunjucks');
app.set('view engine', 'html');
nunjucks.configure('views',{
express:app,
})
와
user.controller.js 만 바꿔서 조작
// server.js에서 views라는 폴더에 이미 접근해있기때문에 거기서 부터 시작하면됨
let join = (req,res)=>{
res.render('./user/join.html');
}
let login = (req,res)=>{
res.render('./user/login.html');
}
let info = (req,res)=>{
res.render('./user/info.html');
}
16. user.controller.js 에서 User 객체 가져오기
const {User} = require('../../models/index'); //User라는 객체를 가져오기 위해서 접근
가져와서 findAll 써보기
let info = async (req,res)=>{
let userList = await User.findAll({});
console.log(userList);
res.render('./user/info.html',{
userList : userList
});
}
17. user.controller.js 에서 data 값을 List 에 넣어서 html에 뿌려보기
let info = async (req,res)=>{
let userList = await User.findAll({
attributes:['id','userid','userpw','username','gender','userimage',
[Sequelize.fn('date_format',Sequelize.col('userdt'), '%Y-%m-%d'),'userdt']]
});
console.log(userList);
res.render('./user/info.html',{
userList : userList
});
}
<h2>사용자 가입정보</h2>
<table>
<tr>
<td>이름</td>
<td>ID</td>
<td>PW</td>
<td>성별</td>
<td>가입일자</td>
</tr>
{% for item in userList %}
<tr>
<td> {{ item.username }} </td>
<td> {{ item.userid }} </td>
<td> {{ item.userpw }}</td>
<td> {{'여자' if item.gender else '남자' }}</td>
<td> {{item.userdt}}</td>
</tr>
{% endfor %}
</table>
쿠키 내용 브라우저에 저장됨
세션 내용 서버에 저장됨
쿠키
- 장바구니 기능 (비회원일때)
- 일주일 동안 다시보지 않기
- 사용자 측에 저장하는거
- 보안성이 아주 취약함
세션
- 서버 측에 저장
- 로그인 (서버측에서 로그인한 상태를 알고 뿌려줌)
* 자동로그인 기능
- 이거는 쿠키와 세션을 같이 활용해야 함
* 세션 생성
- 로그인이 성공했을 때만 세션을 생성해주면 된다.
-----------------------------------------------
node server.js로 서버 오픈하고
server.js 파일로 가서 실행이 된다.
const router = require('./routers/index'); // 2. 여기로 가서 이 위치를 찾는다.
app.use('/',router); // 1. 이 부분이 실행이 되면
routers/index.js 로 와서
여기는 url의 대분류를 관리하는 곳이다.
localhost:3000 - const mainRouter = require('./main/index');
localhost:3000/user - const userRouter = require('./user/index');
부분을 관리한다.
각각 이렇게 연결을 해놓았다.
<main 부분>
처음에 localhost:3000 부분이 main 폴더라고 할 수 있다.
main/index.js 로 가면 여기가 중분류하는 곳이다.
localhost:3000/user/중분류
const controller = require('./main.controller');
여기로 연결 되어있다.
실질적인 코드가 들어가는 부분인 main/main.controller.js 부분으로 가보자
main 함수에 index.html을 렌더해서 보내주었다. 이 main은 exports 되어서 main/index.js로 가게 된다.
<user 부분>
main : localhost:3000 인 상태에서
두가지 선택이 있다
회원가입과 로그인
user폴더에서 처리해준다.
회원가입
localhost:3000/user/join
여기서 get된 값이랑 post된 값을 받아온다. url 정리만 해주는 부분이다.
실질적인 코드들은 user.controller.js 에 적는다. - sql 구문 같은 것들.
다 적으면 이걸 변수에 담아서 user/index.js로 보내준다.
* 쿼리를 실행하는 부분
무조건 비동기로
async
await
반환값은 reserve 혹은 reject 로 오게 된다.
* 로그인 check
select * from users where userid = ' ' and userpw = ' ';
'웹 개발 > DB | MYSQL' 카테고리의 다른 글
210604 Sequelize-auto 로 테이블 생성 구문 만들기 (0) | 2021.06.04 |
---|---|
2021.06.03 DB - LEFT JOIN (4) | 2021.06.03 |
210504 MVC / Sequelize 시퀄라이즈 활용하기 (0) | 2021.05.04 |
210503 테이블 여러개 JOIN ON (0) | 2021.05.03 |
21.04.28 DB Connection pool (0) | 2021.04.30 |