본문 바로가기

블록체인 기반 핀테크 및 응용 SW개발자 양성과정 일기

[39일차]20210507 CLASS, 클래스 / static method, 정적 매서드 / super, 상속에 대해 / server 회원가입 , 로그인하기

반응형

Class에 대해 더 배우기 ! 

 

function Person(name,age){
    this.name=name;
    this.age=age;
}

let foo = new Person ('foo', 20);
let jay = new Person ('jay', 21);


이렇게 만들면 여러개 객체를 만들 수 있음 -> 조금 불편함 -> CLASS 만들어진 이유 

 

함수 안 this.name / this. age는 바로 붙는다 

 

 

 

 

 

 

 

Class는 어떠한 객체를 만들기 위해, 어떠한 틀을 만들고 클래스, 함수 사용해서 new라는 생성자 이용하게 되는 것 

= ? ? 

class Person{
    constructor(name,age){
        this.name=name;
        this.age=age;
    }
}

let foo = new Person('foo',20);
let jay = new Person('foo',21);

Class -> prototype 지식이 있어야함. 

 

 

함수를 console.dir 찍으면 constructor 가 존재, ( constructor가 존재해야 new라는 생성자가 가능)  

객체를 찍을 땐 contructor 가 존재하지 않음. 

//// 함수 ////
function Person(name,age){
    this.name=name;
    this.age=age;
}

//// 객체 /////
let Person2 = {
    name:'foo',
    age:20,
}

console.dir 찍어보기 

왼 : 함수  오: 객체 

 

 

클래스를 만든다 하면 

class 클래스명 {
    constructor(){
        
    }
}

이렇게 만들어야함. 

 

 

class Person{
    constructor(name,age){
        this.name=name;
        this.age=age;
    }
}

new foo = new Person('foo', 20); 
 // -> 명령하면 Person의constructor가 가장 먼저 실행된다. 

 

 

 

연습

function Person(name, age){
    this.name=name;
    this.age=age;
}

Person.prototype.getName = function(){
    return this.name;
}

Person.prototype.getAge = function(){
    return this.age;
}

 

 

 

 

 

 

 

===> prototype안에 getAge, getName Method가 들어감

 

 

 

 

 

 

 

함수 안 함수 생성 

function Person(name, age){
    this.name=name;
    this.age=age;

    function setName(_name){
        this.name = _name; 
    }
}

Person.prototype.getName = function(){
    return this.name;
}

Person.prototype.getAge = function(){
    return this.age;
}

 

 

Person 의 객체를 만들었을 때 setName 함수가 나올지 보기 

 

아래 추가 + console에 a 입력 

let a = new Person('em', 20); 

 

 

위에 함수 틀려서 -> 다시 아래처럼 수정

function Person(name, age){
    this.name=name;
    this.age=age;

    this.setName = function (_name){
        this.name = _name; 
    }
}

Person.prototype.getName = function(){
    return this.name;
}

Person.prototype.getAge = function(){
    return this.age;
}

let a = new Person('em', 20); 

 

 

 

 

class Person{
    constructor(name,age){
        this.name=name;
        this.age=age;
    }
    
    getName = function(){
        return this.name;
    }

    getAge = function(){
        return this.age;
    }

    setName = function(_name){
        this.name = _name;
    }
}

let a = new Person('emily', 20); 

 

-> prototype을 활용하지않고 class 안에다가 다 넣은다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

function Person2(name, age){
    this.name = name;
    this.age = age;

}

Person2.setName = function(){                     //정적
    return 'a';
}

Person2.prototype.getName = function(){                //prototype
    return this.name;
}

Person2.prototype.getAge = function(){
    return this.age;
}

 

console.dir 찍어보면 

 

 

 

 

 

 

 

 

let b = new Person2('jake', 20);

 

추가해서 console창에 b 입력 

 

 

 

 

-> setName 안나왔음

 

 

 

 

 

함수인 상태일 때 사용가능한 형태, 객체일 때 사용안되는게-> static 정적 (객채변환이 안됨)  = 정적 method 

 

 

 

아래 비교해봐! 

class Person3{
    constructor(name,age){
        this.name = name;
        this.age = age;
    }
    setName = function(){
        return 'a';
    }

    getName = function(){
        return this.name;
    }

    getAge = function(){
        return this.age;
    }
}

let c = new Person3('emily',20)

 

 

다 나온다. 

 

 

 

 

 

 

 

 

 

static 을 쓰게 되면 

class Person3{
    constructor(name,age){
        this.name = name;
        this.age = age;
    }
    static setName = function(){
        return 'a';
    }

    getName = function(){
        return this.name;
    }

    getAge = function(){
        return this.age;
    }
}

let c = new Person3('emily',20)

 

 

 

 

-> setName이 빠진다. 

 

 

 

 

 

 

 

new 객체 만드는 이유 : 유동적인 객체를 만들기 위해 

-?> 그럼 왜 static을 만들었을까?? ?

=> 해당 구조를 사용하고싶지 않을 때 

 

static에 접근 하려면 

 

a.setName 은 안된다. 

Person3.setName() 은된다. 

 

 

 

new라는 생성자를 만들지않고 사용할 때 static을 쓴다. 

유동적으로 객체를 만들지 못해서 "정적 method"라고 불림 

 

 

 

 

Sequelize 사용할 때 new 를 안쓴 이유 

 

 

 

class Person3{
    constructor(name,age){
        this.name = name;
        this.age = age;
    }
    static setName = function(){
        console.log(this)
        return `${this.name} / ${this.age}`;
    }

    getName = function(){
        console.log(this);
        return this.name;
    }

    getAge = function(){
        return this.age;
    }

}

let c = new Person3('emily',20)


 

 

 

function Person2(name, age){
    console.log(this)
    this.name = name;
    this.age = age;

}

Person2.setName = function(){  //static 
	console.log(this)
    return 'a';
}

Person2.prototype.getName = function(){
    return this.name;
}

Person2.prototype.getAge = function(){
    return this.age;
}


let b = new Person2('jake', 20);

console창에 Person2() 입력 

 

this 는 Person2를 가지고있는 내용에 객체를 만들어준 상태 this = 객체로 볼 수 있음. 

자기 함수를 가르키는 내용도 + 새로운 객체도 만드는게 =this...배고팡

 

함수 안에 있는 this 와 static 정적 함수 안에 있는this의 내용이 아예 다르다. 

 

static - class, 함수 안에서 따로 실행된다. 개별적으로. 그래서 그 안에 있는 객체를 사용할 수 없음. 

정적 method는 this라는 걸 사용할 수 없다. 단일적으로 사용해야 한다. 

 

 

 

 

 

 

====================================상속 super =================================

 

 

 

 

두 개의 class 만들기 

Person == 부모로 Action==자식으로 만들기 

class Person{
    constructor(name, age){
        this.name = name;
        this.age =age;
    }
}

class Action{
    run = function(){
        console.log('run');
    }
}

 

class Person{
    constructor(name, age){
        this.name = name;
        this.age =age;
    }
}

class Action extends Person{
    run = function(){
        console.log('run');
    }
}

a = new Action (); 

 

 

console.log(a) 

 

 

 

 

 

 

 

 

 

 

 

 

 

class Person{
    constructor(name, age){
        this.name = 'ff';
        this.age =20;
    }
}

class Action extends Person{       //constructor 존재하고 있는데 안보일뿐
    run = function(){
        console.log('run');
    }
}

a = new Action (); 

 

 

함수 안에 값을 넣어주니 요렇게 나옴 

 

 

 

 

 

 

 

 

상속 = 두개의 내용을 합쳐서 보여주겠다. / 두가지를 하나로 합친다. 

같고 중복되는 내용이 있으면 따로 빼서 분류 묶음해주는게 가장 좋다. 

 

 

Action construter - Person이 줬다. 생략된다 그럼 

 

 

 

 

 

 

 

 

 

 

class Person{
    constructor(name, age){
        this.name = 'name';
        this.age =age;
    }
}

class Action extends Person{

    // constructor 생략되었다. 부모로부터 받는다. 

    run = function(){
        console.log('run');
    }
}

a = new Action ('foo', 20); 

 

 

check 

 

 

 

 

 

직접 만들어 보기 constructor 

 

class Person{
    constructor(name, age){
        this.name = 'name';
        this.age =age;
    }
}

class Action extends Person{
    constructor(name,age){
        this.name = name;
        this.age=age;
    }
    run = function(){
        console.log('run');
    }
}

a = new Action ('foo', 20); 

 

 

부모와 자식간에 constructor를 맞춰주지않으면 상속 자체가안된다. 이 코드를 실행시킬려면 super을 사용해야함 

 

class Person{
    constructor(name, age){
        this.name = 'name';
        this.age =age;
    }
}

class Action extends Person{
    constructor(name,age){
        super(name,age)
    }
    run = function(){
        console.log('run');
    }
}

a = new Action ('foo', 20); 

 

super = 부모의 내용을 가져오는 method이다. 

어떤 내용? = > 부모의constructor /  예시로 보여쥬ㅜㄹ게 

 

Person에 getName 추가 

class Person{
    constructor(name, age){
        this.name = 'name';
        this.age =age;
    }

    getName = function(){
        return this.name;
    }
}

 

 

 

 

 

 

 

 

 

 

부모의 내용 getName을 끌어다 쓰고 싶으면 ? 

 

class Person{
    constructor(name, age){
        this.name = 'name';
        this.age =age;
    }

    getName = function(){
        return this.name;
    }
}

class Action extends Person{
    constructor(name,age){  // 내가 action에서 받은 name,age를 
        super(name,age) // 부모 name,age로 ? 
    }
    run = function(){
        name = super().getName;
        console.log(name + 'is run');
    }
}

a = new Action ('foo', 20); 

 

자식 class에 constructor를 쓰고 싶으면 super는 세트

 

 

class Model{   //부모
    constructor(){
        
    }

    static init(){
        return 'init이다!악'
    }
}

class User{   //자식 (부모에constructor없으니 여기도 생략쓰~)
    static init(){
        console.log('aaa I am class User')
    }
}

 

class Model{   //부모
    constructor(){
    }

    static init(){
        console.log('aaa');
    }
}

class User extends Model{   //자식 (부모에constructor없으니 여기도 생략쓰~)
    static init(){
        this.init(); 
    }
}

 

??????????????????? 무한루프 도는 듯..

 

 

 

class Model{   //부모
    constructor(){
    }

    static init(){
        console.log('aaa');
    }
}

class User extends Model{   //자식 (부모에constructor없으니 여기도 생략쓰~)
    static init(){
        super.init() // 정적이 아닌걸 가져왔기 떄문..  
    }
}

 

?????뭘하고잇눈건지 모르겟다.

 

 

 

super는 constructor 랑 가져오는거 아닌가요? 질문 -

-> constructor는 정적method , 기본적으로 static과 비슷. 

consturctor 존재는 하지만 내용 표현x 세팅뿐 

static같은 경우도 class안에 있지만 따로 놈. 

그래서 static도 super로 가져올 수 잇다. super -> 정적method를 가져오는 거 

 

 

class Model{   //부모
    constructor(){
    }
    static init(){
        return 'aaa';
    }
}

class User extends Model{   //자식 (부모에constructor없으니 여기도 생략쓰~)
    static init(){
        return super.init() // 정적이 아닌걸 가져왔기 떄문..  
    }
}

//static은 new로 접근하면 x 
let name = User.init();
console.log(name);

 

 

 

 

 

우리가 공부한 sequelize로 공부

const Sequelize = require('sequelize'); //class 

module.exports = class User extends Sequelize.Model{ 
    static init(sequelize){  // User의 init  (한 가지 인자값)
    //User가 만든 것 / sequelize 변수를 받는다. 시작하자마자 return한다. 무엇을??
    // 부모로부터 있는init method를 호출 -> super썻다는 의미 자체로 부모의 init은 정적method다.
    // 를 알 수 있음. 
        return super.init({  //부모로부터 init한 method를 호출 , 부모의 init (두가지 인자값)
            userid:{
                type: Sequelize.STRING(20),
                // .STRING  => new 를 안쓰고 .찍고 바로 사용. -> 정적method였다. 
                // Sequelize라는 변수 안에 클래스 에서 string이라는게 정적으로 static으로 
                // 선언되어있었따........
                
                allowNull: false,
                unique:true, 
            },
            userpw:{
                type: Sequelize.STRING(40),
                allowNull: false,
            },
            username:{
                type: Sequelize.STRING(20),
                allowNull: false,
            },
            gender:{
                type: Sequelize.BOOLEAN,
                allowNull: false,
            },
            userimage:{
                type: Sequelize.STRING(100),
                allowNull: true,
            },
            create_at:{ 
                type:Sequelize.DATE,
                allowNull:false,
                defaultValue:Sequelize.NOW,
            }

        },{
            sequelize,
            timestamps:false,
            underscored:false,
            modelName:'User',
            tableName:'users',
            paranoid:false,
            charset:'utf8',
            collate:'utf8_general_ci', 

        });
    }
    static associate(db){}

};

 

 

 

 

============================================================================

 

 

 

공용pc에 있는 다른 분의 코드

    <table>
        <thead>
            <td>idx</td>
            <td>아이디</td>
            <td>비밀번호</td>
            <td>이름</td>
            <td>성별</td>
            <td>이미지</td>
            <td>아이디 생성일</td>
        </thead>
        {% for ele in userList%}
        <tr>
            <td>{{ele.dataValues.id}}</td>
            <td>{{ele.dataValues.userid}}</td>
            <td>{{ele.dataValues.userpw}}</td>
            <td>{{ele.dataValues.username}}</td>
            <td>
             {%if ele.dataValues.gender %}
                남자
             {%else%}
                여자 
            {% endif %}
            </td>
            <td>{{ele.dataValues.userimage}}</td>
            <td>{{ele.dataValues.create_at}}</td>
        </tr>
        {% endfor %}

    </table>

if /??? 공부해보기 

 

 

 

 

 

 

----------------------------------------------------------------------------------------

 

views - index.html 

<a href = "/user/join">회원가입</a>
<a href = "/user/login">로그인</a>

routers - main - main.controller.js

let main = (req,res)=>{
    res.render('index.html');
}

module.exports.dd = main; // (뒤에가 함수)

 

 

================================== J O I N ====================================

 

 

views - user - join_success.html

<h2>환영합니다. </h2>

~ 님 환영하빈다. 

<a href = "/">메인으로가기 </a>

 

join.html

join html 입니다.
<form method = "post" action="/user/join_success">
    <table>
        <tr>
            <td>아이디</td>
            <td><input type ="text" name ="userid"></td>
        </tr>
        <tr>
            <td>패스워드</td>
            <td><input type ="password" name = "userpw"></td>
        </tr>
        <tr>
            <td>이름</td>
            <td><input type="text" name ="username"> </td>
        </tr>
        <tr>
            <td>성별</td>
            <td>
                <input type = "radio" id ="gender" name="gender" value="0">남자
                <input type = "radio" id ="gender" name="gender" value="1">여자
            </td>
        </tr>

    </table>
    <input type = "submit" value="로그인">
</form>

 

 

routers - user - index.js 

router.use('/join_success', controller.join_success)

추가 

 

routers - user - user.controller.js

const {User} = require('../../models/index');

let join = (req,res) => {
    //res.send('join');
    res.render('./user/join.html')
}

let login = (req,res) => {
    res.render('./user/login.html')
}

let join_success = (req,res)=>{
    res.render('./user/join_success.html')
}

let info = async (req,res) => {
    //, 'userdt']
    let userlist = await User.findAll({});
    console.log(userlist)
    res.render('./user/info.html',{
        userList: userlist,
    })
}

module.exports = {
    join:join,
    login:login,
    info:info,
    join_success:join_success,
}

 

 

 

-> 회원가입누르면 이제 잘 나옴

 

 

 

이제 입력 submit 누르면 post로 값이 넘어오고 db에 넣기 

 

 

post 하려면 body-parser 

 

server.js 추가 

const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({extended:false}));

터미널 -> npm install body-parser 명령어 실행 / 다운 

 

 

서버에 이걸 써도 되는 이유 -> app.use를 사용해서 ( 잘 이해가 안갓당..) 

app.use(bodyPar~ ) 이게 다 뿌려주는건감 

 

 

 

routers - user - user.controller 에서 console.log 찍어서 post 값 잘 오나 확인 

let join_success = (req,res)=>{
    console.log(req.body.userid);
    console.log(req.body.userpw);
    console.log(req.body.username);
    console.log(req.body.gender);
    res.render('./user/join_success.html')
}

 

 

 

 

 

 

 

이제 DB접속 

이미 

 

const {User} = require('../../models/index');

controller.js 위에 보면 가져왔음 

 

바로User.create 사용가능 

let join_success = (req,res)=>{
    console.log(req.body.userid);
    console.log(req.body.userpw);
    console.log(req.body.username);
    console.log(req.body.gender);
    res.render('./user/join_success.html')
    User.create({
        userid:req.body.userid,
        userpw:req.body.userpw,
        username:req.body.username,
        gender:req.body.gender,
        userimage:req.body.userimage,
    })
}

 

 

->터미널에 server.js 키고 체크하면서 ㄱ ㄱ 

 

routers - user - user.controller

let join_success = async (req,res)=>{
    console.log(req.body.userid);
    console.log(req.body.userpw);
    console.log(req.body.username);
    console.log(req.body.gender);

    try{
        let rst = await User.create({
        userid:req.body.userid,
        userpw:req.body.userpw,
        username:req.body.username,
        gender:req.body.gender,
        userimage:req.body.userimage,
    })
    }catch(e){
    console.log(a);
    }
    res.render('./user/join_success.html',{
        userid:req.body.userid,
        userpw:req.body.userpw,
        username:req.body.username,
        gender:req.body.gender,
        userimage:req.body.userimage,
    })
}

 

join_success.html 

<h2>환영합니다. </h2>

{{username}} 님 환영하빈다. 
{{username}}님의 ID는 {{userid}}입니다.

<a href = "/">메인으로가기 </a>

 

회원가입 완료 

 

 

 

================================== L O G I N  ==================================

 

 

 

login.html

login html 입니다.


<form action = "/user/login_check" method="post">
    <table>
        <tr>
            <td>아이디</td>
        </tr>
        <tr>
            <td>
                <input type="text" name ="userid"> 
            </td>
        </tr>
        <tr>
            <td>패스워드</td>
            <td>
                <input type="password" name="userpw"> 
            </td>
        </tr>
    </table>

    <input type="submit" value="로그인하기">

</form>

 

 

 

routers - user - index.js

const express = require('express');
const router = express.Router();
const controller = require('./user.controller');

//해당폴더의 하위 URL을 관리하는 파일.
// join login info
router.use('/join',controller.join)
router.use('/login',controller.login)
router.use('/info',controller.info)

router.post('/join_success', controller.join_success)
router.post('/login_check', controller.login_check);

module.exports = router;

 

controller.js

let login_check = async (req,res)=>{
    res.redirect();
}

 

 

npm install express-session  설치 

설치 했으면

 

server.js

const session = require('express-session');

app.use(session({
    secret:'aaa',
    resave:false,
    saveUninitialized:true,
}))

 

controller 에 이제 입력 

 

 

 

 

 

 

 

 

 

 

 

 

지금까지의 코드 

 

server.js 

const express = require('express');
const {sequelize} = require('./models'); // 객체
const {User} =require('./models');
const app = express();
const router = require('./routers/index');
const nunjucks = require('nunjucks');
const bodyParser = require('body-parser');
const session = require('express-session');

app.use(session({
    secret:'aaa',
    resave:false,
    saveUninitialized:true,
}))

app.use(bodyParser.urlencoded({extended:false}));

app.set('view engine','html');
nunjucks.configure('views',{
    express:app,
})

// seqeulize.sync -> new Promise 객체로 반환이됩니다.
sequelize.sync({ force:false, })
.then(()=>{
    console.log('접속 성공')
})
.catch(()=>{
    console.log('접속 실패');
})

app.use('/',router); // 비동기

app.listen(3000,()=>{
    console.log('server start port 3000');
});

 

routers- index.js

const express = require('express');
const router = express.Router();
const mainRouter = require('./main/index');
const userRouter = require('./user/index');

// URL 관리하는 파일로 따로뺌.
router.use('/user',userRouter);
router.use('/',mainRouter);


module.exports = router;

 

 

routers-user-index.js

const express = require('express');
const router = express.Router();
const controller = require('./user.controller');

// 중분류 
// 해당폴더의 하위 URL을 관리하는 파일.
// join login info
router.get('/join',controller.join)
router.get('/login',controller.login)
router.get('/info',controller.info)

router.post('/join_success', controller.join_success)
router.post('/login_check', controller.login_check);

module.exports = router;

 

 

routers-user-user.controller.js

const {User} = require('../../models/index');

let join = (req,res) => {
    //res.send('join');
    res.render('./user/join.html')
}

let login = (req,res) => {
    res.render('./user/login.html')
}

let info = async (req,res) => {
    //, 'userdt']
    let userlist = await User.findAll({});
    console.log(userlist)
    res.render('./user/info.html',{
        userList: userlist,
    })
}

let join_success = async (req,res)=>{
    console.log(req.body.userid);
    console.log(req.body.userpw);
    console.log(req.body.username);
    console.log(req.body.gender);

    try{
        let rst = await User.create({
        userid:req.body.userid,
        userpw:req.body.userpw,
        username:req.body.username,
        gender:req.body.gender,
        userimage:req.body.userimage,
    })
    }catch(e){
    console.log(a);
    }
    res.render('./user/join_success.html',{
        userid:req.body.userid,
        userpw:req.body.userpw,
        username:req.body.username,
        gender:req.body.gender,
        userimage:req.body.userimage,
    })
}

let login_check = async (req,res)=>{
    let userid = req.body.userid;
    let userpw = req.body.userpw;

    res.redirect();
}





module.exports = {
    join:join,
    login:login,
    info:info,
    join_success:join_success,
    login_check:login_check,
}

 

views - index.html 

<a href = "/user/join">회원가입</a>
<a href = "/user/login">로그인</a>




 

views - user - join_success.html

<h2>환영합니다. </h2>

{{username}} 님 환영하빈다. 
{{username}}님의 ID는 {{userid}}입니다.

<a href = "/">메인으로가기 </a>

 

views - user - join.html

join html 입니다.
<form method = "post" action="/user/join_success">
    <table>
        <tr>
            <td>아이디</td>
            <td><input type ="text" name ="userid"></td>
        </tr>
        <tr>
            <td>패스워드</td>
            <td><input type ="password" name = "userpw"></td>
        </tr>
        <tr>
            <td>이름</td>
            <td><input type="text" name ="username"> </td>
        </tr>
        <tr>
            <td>성별</td>
            <td>
                <input type = "radio" id ="gender" name="gender" value="0" checked>남자
                <input type = "radio" id ="gender" name="gender" value="1">여자
            </td>
        </tr>

    </table>
    <input type = "submit" value="로그인">
</form>

한개 checked 되도록 html 에 checked 쓰기 

 

 

views -user - login.html

login html 입니다.


<form action = "/user/login_check" method="post">
    <table>
        <tr>
            <td>아이디</td>
            <td>
                <input type="text" name ="userid"> 
            </td>
        </tr>
        <tr>
            <td>패스워드</td>
            <td>
                <input type="password" name="userpw"> 
            </td>
        </tr>
    </table>

    <input type="submit" value="로그인하기">

</form>

 

views- user - info.html

info html 입니다.
<table>
    <tr>
        <td>번호</td>
        <td>아이디</td>
        <td>패스워드</td>
        <td>이름</td>
        <td>성별</td>
        <td>이미지</td>
        <td>등록일</td>
    </tr>
    {% for item in userList %}
    <tr>
        <td>{{item.dataValues.id}}</td>
        <td>{{item.dataValues.userid}}</td>
        <td>{{item.dataValues.userpw}}</td>
        <td>{{item.dataValues.username}}</td>
        <td>{{item.dataValues.gender}}</td>
        <td>{{item.dataValues.userimage}}</td>
        <td>{{item.dataValues.userdt}}</td>
    </tr>
    {% endfor %}
</table>

 

 

===================================점심 시간===================================

 

 

 

 

화면 

 

 

 

 

 

session, cookie.?  가 뭐징

 

session - server 측에서 저장되는

server, 서버에 저장됨

login의 유지는..? server측에서 내가 로그인한 id, 정보를 계속 가지고 있음. 값을 get, post등으로 계속 안넘겨줘도 됨. 

 

 

cookie -사용자 측에서 저장되는

내용이 Data가 browser, 브라우저에 저장됨 

ex) 장바구니 ( 회원가입 안하고 장바구니 놓고 다른 거 보다가 다시 돌아왔을 때 아직 장바구니에 있음. ),

팝업닫기, 팝업창 띄웠는데 일주일동안 다시보지않기-> 이런 것도 쿠키로 만드는 것 

변수, 내용들이 브라우저에 저장되어서 껏다 켜도 그대로 있음. 

- 보안성이 아주 취약 (데이터를 조작 가능함) - 수정, 삭제가 가능 

- 날라가도 괜찮은 데이터들은 쿠키로 만들어도 괜춘.! 

 

 

 

로그인 -> session 으로 만들거다. (민감한 정보일수록)  => 어떻게 사용할지 아래에 ㄱ ㄱ 

자동 로그인 -> 쿠기값과 session 같이 활용해야함 

 

 

 

= > 일상생활과 밀접해서 그런지 흥미롭당.. 

 

 

 

 

로그인 아이디,비번 넣고 -> post -> server ------조회(select * from us~)  ----> DB 

 

성공 -> index page 

DB에서 record를 못찾으면 로그인 실패  -> 이전 url 돌아가기 

 

 

로그인이 성공했을 때 session 생성해주면 됨. 

session이 생성되는 순간 어느 page를 가도  값을 가지고 댕김 

 

 

 

 

===========================================================================

 

 

 

LOGIN 

 

 

    try{
        let rst = await User.create({  // User.create 반환 값 - 비동기형식 Promise 객체 
        userid:req.body.userid,
        userpw:req.body.userpw,
        username:req.body.username,
        gender:req.body.gender,
        userimage:req.body.userimage,
    })
    }catch(e){      //예외처리 
    console.log(a);
    }

 

비동기가 아닌 동기처리 방식이면 Promise 객체 값이 항상 Pending 이 됨 

 

 

routers - user - user.controller.js 

변수 만들어서 줄이기 

let join_success = async (req,res)=>{

    let userid = req.body.userid;
    let userpw = req.body.userpw;
    let username = req.body.username;
    let gender= req.body.gender;


    try{
        let rst = await User.create({  // User.create 반환 값 - 비동기형식 Promise 객체 
        userid:userid,
        userpw:userpw,
        username:username,
        gender:gender,
    })
    }catch(e){
    console.log(a);
    }
    res.render('./user/join_success.html',{
        userid:userid,
        userpw:userpw,
        username:username,
        gender:gender,
    })
}

 

 

여기서 또 줄일 수 있다.

 

let join_success = async (req,res)=>{

    let userid = req.body.userid;
    let userpw = req.body.userpw;
    let username = req.body.username;
    let gender= req.body.gender;


    try{
        let rst = await User.create({  // User.create 반환 값 - 비동기형식 Promise 객체 
        userid,
        userpw,
        username,
        gender,
    })
    }catch(e){
    console.log(a);
    }
    res.render('./user/join_success.html',{
        userid,
        userpw,
        username,
        gender,
    })
}
let join_success = async (req,res)=>{

    let userid = req.body.userid;
    let userpw = req.body.userpw;
    let username = req.body.username;
    let gender= req.body.gender;


    try{
        let rst = await User.create({userid, userpw,username, gender,})
    }catch(e){
        console.log(a);
    }
    res.render('./user/join_success.html',{userid, userpw,username,gender})

}

 

 

 

---------------------------------------------------------------------------------------------------------------------------------

이제 로그인에 아이디, 비밀번호를 입력한 값을 post로 가져와 login_check 에서 값이 있는지 확인,

있으면 성공(session) or 없으면 실패 

 

나의 table check 

입력할 아이디, 비번 골라두기 

덤블도어, asdf 

 

 

 

 

* 성공 기준 

 

 

 

mysql select문

 

 

routers - user - user.controller.js

아래 select 문 쳌 

let login_check = async (req,res)=>{
    let userid = userid;
    let userpw = userpw;

    let result = await User.findOne({
        where:{userid,userpw}
    })
    
    console.log(result);

    res.send('test');
}


let login_check = async (req,res)=>{
    let userid = req.body.userid;
    let userpw = req.body.userpw;
    let result;
    try{
        result = await User.findOne({
        where:{
            userid:userid,
            userpw:userpw}
    })
} catch(e){
    console.log(e)
}
    console.log(result);
    res.send('test');
}

오류나서 try catch 

let login_check = async (req,res)=>{
    let userid = req.body.userid;
    let userpw = req.body.userpw;

    let result = await User.findOne({
    where:{userid,userpw}
    })
    console.log(result);
    res.send('test');
}

 

 

 

 

 

 

 

user.controller.js 

let login_check = async (req,res)=>{
    let userid = req.body.userid;
    let userpw = req.body.userpw;

    let result = await User.findOne({
    where:{userid,userpw}
    })
    
    req.session.uid = userid;
    //uid라는 변수값에 userid 값을 넣겠다. 
    req.session.isLogin = true; 
    // 개발자가 현재 로그인 상태가 true인지 편하게 구분하려고 만들어 놓은 것 
    //isLogin이라는 속성에 true라는 값을 넣겠다. 
    
    req.session.save(()=>{ //저장하겠다. 
        res.redirect('/'); //그리고 메인으로 가 ! 
    })
}

위와 같이 session 하면 JS 파일 말고server에 공통적으로 쓰는 변수가 되는 것 

 

 

server.js 의 session 요 부분은 내용 찾아보고 외우기 

app.use(session({
    secret:'aaa',
    resave:false,
    saveUninitialized:true,
}))

 

 

 

let login_check = 안에 consol

 

 

 

정리 

routers - user - user.controller.js 

let login_check = async (req,res)=>{
    let userid = req.body.userid;
    let userpw = req.body.userpw;

    let result = await User.findOne({
    where:{userid,userpw}
    })
    console.log(result);
    console.log(req)

    req.session.uid = userid;
    req.session.isLogin = true; 
    // 개발자가 현재 로그인 상태가 true인지 편하게 구분하려고 만들어 놓은 것 
    
    req.session.save(()=>{
        res.redirect('/');
    })
}

 

routers - main - main.controller 

let main = (req,res)=>{
    console.log(req.session);
    res.render('index.html',{
        userid:req.session.uid,
        isLogin:req.session.isLogin
    });
}

module.exports.dd = main; // (뒤에가 함수)

 

 

views - index.html

{% if isLogin %}  //true  == {% if true %}}
    {{userid}}님 환영합니다. <a href="#">로그아웃</a>
{% else %}                                  //true가 아니면 
    <a href ="/user/join">회원가입</a>
    <a href ="/user/login">로그인</a>
{% endif %}

 

 

 

console.log에 git commit 만 눌러서 edit 창이 열리면 

요 명령어로 나가기 

:q! 

 

 

 

=================================로그아웃 만들기 ===============================

 

 

routers - index.js

    {{userid}}님 환영합니다. <a href="/user/logout">로그아웃</a>

경로 쓰고 

user - logout 파일 만들기 

 

 

user - index.jx

router.get('/logout', controller.logout);

 

user - user.controller.js

let logout = (req,res) =>{
    delete req.session.isLgin;
    delete req.session.uid;

    req.session.save(()=>{
        res.redirect('/');
    })
}


module.exports = {
    join:join,
    login:login,
    info:info,
    join_success:join_success,
    login_check:login_check,
    logout,
}   

 

 

 

 

 

 

 

세션에 저장이 많아지면 과부하. 1000명정도까지는 괜춘 그 이상은 .. 

 

 

{% for [받을변수 ] in [반복할 배열] %}

 

{% endfor %}



{% if [조건] %}

-> BOOLEAN or 비교 연산자 

* 비교 연산자의 결과는 항상 BOOLEAN 

html 태그 가능 

{% else %}

 

{?% endif %}

 

** 구문, 언어 쓰는건  {% % } 괄호 하나야! 

** {{ }} 출력용 

 

 

 

 

--------- 정리 

server.js

const express = require('express');
const {sequelize} = require('./models'); // 객체
const {User} =require('./models');
const app = express();
const router = require('./routers/index');
const nunjucks = require('nunjucks');
const bodyParser = require('body-parser');
const session = require('express-session');

app.use(session({
    secret:'aaa',
    resave:false,
    saveUninitialized:true,
}))

app.use(bodyParser.urlencoded({extended:false}));

app.set('view engine','html');
nunjucks.configure('views',{
    express:app,
})

// seqeulize.sync -> new Promise 객체로 반환이됩니다.
sequelize.sync({ force:false, })
.then(()=>{
    console.log('접속 성공')
})
.catch(()=>{
    console.log('접속 실패');
})

app.use('/',router); // 비동기

app.listen(3000,()=>{
    console.log('server start port 3000');
});

 

 

 

routers-index.js 

 

const express = require('express');
const router = express.Router();
const mainRouter = require('./main/index');
const userRouter = require('./user/index');

// 대분류 
// URL 관리하는 파일로 따로뺌.
router.use('/user',userRouter);
router.use('/',mainRouter);


module.exports = router;



 

routers - main - index.js

const express = require('express');
const router = express.Router();
const controller = require('./main.controller')

console.log(controller);

router.use('/',controller.dd);

module.exports = router;


 

routers - main - main.controller.js

 

let main = (req,res)=>{
    console.log(req.session);
    res.render('index.html',{
        userid:req.session.uid,
        isLogin:req.session.isLogin
    });
}

module.exports.dd = main; // (뒤에가 함수)

 

routers - user - index.js 

 

const express = require('express');
const router = express.Router();
const controller = require('./user.controller');

// 중분류 
// 해당폴더의 하위 URL을 관리하는 파일.
// join login info
router.get('/join',controller.join)
router.get('/login',controller.login)
router.get('/info',controller.info)
router.get('/logout', controller.logout);

router.post('/join_success', controller.join_success)
router.post('/login_check', controller.login_check);


module.exports = router;

routers - user - user.controller.js 

 

const {User} = require('../../models/index');

let join = (req,res) => {
    //res.send('join');
    res.render('./user/join.html')
}

let login = (req,res) => {
    res.render('./user/login.html')
}


let login_check = async (req,res)=>{
    let userid = req.body.userid;
    let userpw = req.body.userpw;

    let result = await User.findOne({
    where:{userid,userpw}
    })
    console.log(result);
    console.log(req)

    req.session.uid = userid;
    req.session.isLogin = true; 
    // 개발자가 현재 로그인 상태가 true인지 편하게 구분하려고 만들어 놓은 것 
    
    req.session.save(()=>{
        res.redirect('/');
    })
}



let info = async (req,res) => {
    //, 'userdt']
    let userlist = await User.findAll({});
    console.log(userlist)
    res.render('./user/info.html',{
        userList: userlist,
    })
}

let join_success = async (req,res)=>{

    let userid = req.body.userid;
    let userpw = req.body.userpw;
    let username = req.body.username;
    let gender= req.body.gender;

    try{
        let rst = await User.create({userid, userpw,username, gender})
    }catch(e){
        console.log(a);
    }
    res.render('./user/join_success.html',{userid, userpw,username,gender})
}


let logout = (req,res) =>{
    delete req.session.isLogin;
    delete req.session.uid;

    req.session.save(()=>{
        res.redirect('/');
    })
}


module.exports = {
    join:join,
    login:login,
    info:info,
    join_success:join_success,
    login_check:login_check,
    logout,
}   



 

 

 

views - index.html

{% if isLogin %}
    {{userid}}님 환영합니다. <a href="/user/logout">로그아웃</a>
{% else %}
    <a href ="/user/join">회원가입</a>
    <a href ="/user/login">로그인</a>
{% endif %}



 

views - user - join_success.html

<h2>환영합니다. </h2>

{{username}} 님 환영하빈다. 
{{username}}님의 ID는 {{userid}}입니다.

<a href = "/">메인으로가기 </a>

 

 

vies - user - join.html

join html 입니다.
<form method = "post" action="/user/join_success">
    <table>
        <tr>
            <td>아이디</td>
            <td><input type ="text" name ="userid"></td>
        </tr>
        <tr>
            <td>패스워드</td>
            <td><input type ="password" name = "userpw"></td>
        </tr>
        <tr>
            <td>이름</td>
            <td><input type="text" name ="username"> </td>
        </tr>
        <tr>
            <td>성별</td>
            <td>
                <input type = "radio" id ="gender" name="gender" value="0" checked>남자
                <input type = "radio" id ="gender" name="gender" value="1">여자
            </td>
        </tr>

    </table>
    <input type = "submit" value="로그인">
</form>

 

views - user - login

login html 입니다.


<form action = "/user/login_check" method="post">
    <table>
        <tr>
            <td>아이디</td>
            <td>
                <input type="text" name ="userid"> 
            </td>
        </tr>
        <tr>
            <td>패스워드</td>
            <td>
                <input type="password" name="userpw"> 
            </td>
        </tr>
    </table>
    <input type="submit" value="로그인하기">
</form>

 

views - user - logout.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형