dukDukz

210506 Sequelize 상세 설명 본문

웹 개발/DB | MYSQL

210506 Sequelize 상세 설명

헤일리_HJ 2021. 5. 6. 12:20

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 = ' ';