ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๊ธ€์˜ ์ œ๋ชฉ์„ session์œผ๋กœ ํ•˜์˜€๋Š”๋ฐ session์€ ์ฟ ํ‚ค์—์„œ ์•ฝ๊ฐ„ ๋ณ€ํ˜•๋œ? ํ˜น์€ ๊ฐœ์„ ๋œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.


์ฟ ํ‚ค์™€ ์„ธ์…˜์— ๋Œ€ํ•ด ์“ฐ๋Š” ์ด์œ ์™€ ๊ฐ„๋‹จํ•œ ์†Œ๊ฐœ๋ฅผ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.



- ์ฟ ํ‚ค์™€ ์„ธ์…˜์„ ์“ฐ๋Š” ์ด์œ ๋Š”?


: Http ํ”„๋กœํ† ์ฝœ์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ ๋น„์—ฐ๊ฒฐ์„ฑ(connectionless)๊ณผ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€์•Š๋Š”(stateless) ํŠน์ง• ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


์ฟ ํ‚ค์™€ ์„ธ์…˜์„ ์‚ฌ์šฉํ–ˆ์„ ๊ฒฝ์šฐ, ํ•œ ๋ฒˆ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์–ด๋– ํ•œ ๋ฐฉ์‹์— ์˜ํ•ด์„œ ๊ทธ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ธ์ฆ์„ ์œ ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


์‡ผํ•‘๋ชฐ ์นดํŠธ ๊ธฐ๋Šฅ๊ฐ™์€ ๊ฒฝ์šฐ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ •๋ณด๋ฅผ ๊ณ„์†ํ•ด์„œ ์ง€๋‹ˆ๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์— ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•˜์ฃ .



** ์ฟ ํ‚ค **

 ์ธํ„ฐ๋„ท ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋– ํ•œ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•  ๊ฒฝ์šฐ ๊ทธ ์‚ฌ์ดํŠธ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์„œ๋ฒ„๋ฅผํ†ตํ•ด ์ธํ„ฐ๋„ท ์‚ฌ์šฉ์ž์˜ ์ปดํ“จํ„ฐ์— ์„ค์น˜ ๋˜๋Š” ์ž‘์€ ๊ธฐ๋ก ์ •๋ณด ํŒŒ์ผ์„ ์ผ์ปซ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋ก ํŒŒ์ผ์— ๋‹ด๊ธด ์ •๋ณด๋Š” ์ธํ„ฐ๋„ท ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ™์€ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ์ฝํžˆ๊ณ  ์ˆ˜์‹œ๋กœ ์ƒˆ๋กœ์šด ์ •๋ณด๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.



์œ„์—์„œ ๋งํ–ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ ์ฟ ํ‚ค ์ •๋ณด๋Š” ์‚ฌ์šฉ์ž์˜ ์ปดํ“จํ„ฐ์— ๋ชจ๋‘ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ์— ๊ด€๊ณ„์—†๋Š” ์ •๋ณด๋“ค์ด๋ฉด ๊ด€๊ณ„์—†๊ฒ ์ง€๋งŒ ๋กœ๊ทธ์ธ ์ •๋ณด์™€ ๊ฐ™์€ ์ •๋ณด๋“ค์€ ์ฟ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฑด ์˜ณ์ง€ ์•Š๊ฒ ์ฃ 




** ์„ธ์…˜ **

์ฟ ํ‚ค์™€ ๊ธฐ๋Šฅ์€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์„ธ์…˜์€ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋Š” ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฟ ํ‚ค์™€๋Š” ๋‹ฌ๋ฆฌ ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค. 



์‚ฌ์šฉ์ž ์ธก์—์„œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋งˆ์น˜ ์ธ๋ฑ์Šค์™€ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ id๊ฐ’๋งŒ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. id ๊ฐ’์„ ํ†ตํ•ด ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ์ •๋ณด๋“ค์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ฃ . session id ๊ฐ’์ด ์ค‘๋ณต๋  ์ผ์€ ์—†์œผ๋ฉฐ ํ•œ ๋ช…์˜ ์‚ฌ์šฉ์ž(์›น๋ธŒ๋ผ์šฐ์ €)์— ํ•˜๋‚˜์˜ ์„ธ์…˜์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 



์ผ๋‹จ npm์—์„œ ๋ชจ๋“ˆ์„ ๊น”์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜๊ฐ€ ์™„๋ฃŒ ๋์œผ๋ฉด,

$ npm install express-session

require๋ฅผ ํ†ตํ•ด ๋ถˆ๋Ÿฌ์™€์•ผ๊ฒ ์ฃ ? ๋ชจ๋‘ npm ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— ์žˆ๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

var session = require('express-session')

๊ทธ๋ฆฌ๊ณ  ์ด์™€๊ฐ™์ด  


app.use(session({

secret:'keyboard cat',

resave:false,

saveUninitialize:true

}));


์ด๋Ÿฐ ํ˜•์‹์„ ์•„๋ž˜์— ๋ณต์‚ฌํ•ด์ฃผ์„ธ์š”. secret์ด๋ผ๊ณ  ํ•˜๋Š” ๋ถ€๋ถ„์€ session id ๋ฅผ ์‚ฌ์šฉ์ž์˜ ์›น๋ธŒ๋ผ์šฐ์ €์— ์‹ฌ์„ ๋•Œ ๋ง๋ถ™์—ฌ์„œ ๋“ค์–ด๊ฐ€๋Š”? ๊ทธ๋Ÿฐ ๊ฐœ๋…์ธ๋ฐ ๋‹ค๋ฅธ ๋ฌธ์ž๋‚˜ ์ˆซ์ž๋กœ ์“ฐ์…”๋„ ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์†์„ฑ๋“ค์€ ๋‹ค ๊ถŒ์žฅ ๊ฐ’์ด๋ผ๊ณ  ํ•˜๋‹ˆ ์ผ๋‹จ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.




์ด๋Ÿฌํ•œ ๋กœ๊ทธ์ธ ํผ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์ฃผ์†Œ๋ฅผ ๋ณด๋‹ˆ login์ด๋ผ๋Š” ๋ผ์šฐํ„ฐ์—์„œ ๋ Œ๋”๋งํ•˜๋Š” ํŽ˜์ด์ง€๋„ค์š” ์ €๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ session ์ •๋ณด์— ํ˜„์žฌ ๋กœ๊ทธ์ธ ๋˜์–ด์žˆ๋Š” ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ ๊ฐ’์„ session์œผ๋กœ ๊ฐ–๊ฒŒํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. 


๊ทธ๋Ÿผ ์ด๋Ÿฐ ์ˆœ์„œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๊ฒ ์ฃ 



๋กœ๊ทธ์ธ์ด ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด ์„ธ์…˜ ๊ฐ’์„ ๊ฐ€์งˆ ๊ฒƒ์ด๊ณ , ๋กœ๊ทธ์ธ ํ›„์— ๋กœ๊ทธ์•„์›ƒ์„ ํ•œ๋‹ค๋ฉด ์„ธ์…˜๊ฐ’์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.



์ฒซ ํ™”๋ฉด์ด ๋กœ๋”ฉ๋  ๋•Œ session๊ฐ’์„ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์„ธ์…˜ ๊ฐ’์ด ์ด๋ฏธ ์„ค์ •๋˜์–ด์žˆ๋‹ค๋ฉด ๋ฐ”๊ฟ”์„  ์•ˆ๋˜๊ธฐ๋•Œ๋ฌธ์— if๋ฌธ์„ ํ†ตํ•ด ์„ธ์…˜ ๊ฐ’์ด ์„ค์ •๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. login์ด๋ผ๋Š” ๊ฐ’์€ ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์ƒํƒœ์ธ ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•œ ๊ฐ’์ด๋ฉฐ idx๋Š” User ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค ๊ฐ’ ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธํ‚ค ๊ฐ’์„ ์•Œ๊ณ ์žˆ์œผ๋ฉด ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋‹ค ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ฃ 

1
2
3
4
5
6
7
app.get('/index',function(req,res){
    if(!req.session.login){
        req.session.login = false
        req.session.idx = -1
    }
    res.render('index');
});
cs


์•ž๋‹จ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ Ajax๋ฅผ ํ†ตํ•ด POST๋กœ ๋„˜๊ฒจ์คฌ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ด ํ•จ์ˆ˜๋ฅผ ์ฝœ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ณ„์ •์ •๋ณด๊ฐ€ DB์— ์žˆ๋Š” ์ •๋ณด์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ์ฒดํฌํ•˜์—ฌ ์ผ์น˜ํ•œ๋‹ค๋ฉด ok์‚ฌ์ธ๊ณผ session์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธ ์‹œ์ผœ์ค๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ์— ์„ธ์…˜์ •๋ณด๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ์ด์œ ๋Š” ๋กœ๊ทธ์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํ˜น์€ ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์„ ๋ณด์ด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž…๋‹ˆ๋‹ค.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var models = require('../models');
 
function loginFunction(id,pwd,res,req){
    var responseData;
    models.User.findOne({
        where: {user_id: id}
    })
        .then(function(user){
            if(user==null || user.dataValues.password!=pwd){
                responseData = {'result':'no','flag':req.session.login};
                res.json(responseData);
                console.log('๋กœ๊ทธ์ธ ์‹คํŒจ');
            } 
            else{
                req.session.login = true
                req.session.idx = user.dataValues.id
                responseData = {'result' : 'ok','session':req.session.login};
                res.json(responseData);
                console.log('๋กœ๊ทธ์ธ ์„ฑ๊ณต');
            }
        });
}
 
exports.loginFunction = loginFunction;
cs


๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ์•„์›ƒ ๋ผ์šฐํ„ฐ๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ด์™€ ๊ฐ™์ด ์„ธ์…˜ ๊ฐ’์„ ๋‹ค์‹œ ๋ฐ”๊ฟ”์ค˜์•ผํ•˜๊ฒ ์ฃ 

1
2
3
4
5
app.get('/logout',function(req,res){
    req.session.login = false    //login session ๋ณ€๊ฒฝ
    req.session.idx = -1
    res.render('index');
});
cs







์ด๋Ÿฐ ํ—ค๋”๋ฅผ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๋„ฃ์„ ๊ฒƒ์ธ๋ฐ ๋กœ๊ทธ์ธ ์ƒํƒœ ๊ฐ’์— ๋”ฐ๋ผ ๋ณด์—ฌ์ง€๋Š” ๋ฒ„ํŠผ์ด ๋‹ฌ๋ผ์ ธ์•ผ ํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค.



ํ—ค๋”๋ฅผ ๊ทธ๋ฆฌ๊ณ  ์žˆ๋Š” ํŒŒ์ผ ์Šคํฌ๋ฆฝํŠธ ๋ถ€๋ถ„์—์„œ ์•„๊นŒ ์„ค์ •ํ–ˆ๋˜ ์„ธ์…˜์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.  header ๋ผ์šฐํ„ฐ์—์„œ session๊ฐ’์„ ๋„˜๊น๋‹ˆ๋‹ค.


1
2
3
app.get('/header',function(req,res){
    res.render('header',{login:req.session.login});
});
cs


1
2
3
4
5
6
7
8
9
10
11
12
script.
    var f = !{login};
    $(document).ready(function(){
        if(f){    //๋กœ๊ทธ์ธ ์ƒํƒœ์ผ ๋•Œ
            $("#login").hide()
            $("#logout").show()
        }
        else{    //๋กœ๊ทธ์ธ ์ƒํƒœ๊ฐ€ ์•„๋‹ ๋•Œ
            $("#logout").hide()
            $("#login").show()
        }
});
cs



์ œ๊ฐ€ ์•„๊นŒ ๋กœ๊ทธ์ธ ์ •๋ณด ์™ธ์—๋„ User ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค ๊ฐ’ ๋˜ํ•œ session ์ •๋ณด๋กœ ๋”ฐ๋กœ ์ €์žฅํ•ด๋’€์—ˆ๋Š”๋ฐ ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์–ด๋””์—์„œ๋‚˜ DB ์กฐ์ž‘์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค๋ฉด ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ๋””ํดํŠธ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์˜ ์ผ์ • ์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ ์ฑ„์›Œ๋‘๋ ค๊ณ  ํ•  ๋•Œ



์ด์™€ ๊ฐ™์ด ์•„์— ๊ณต๋ฐฑ์ด ์•„๋‹ˆ๋ผ ๋””ํดํŠธ ๊ฐ’์œผ๋กœ ๋ช‡๋ช‡ ๊ฐ’๋“ค์€ ๋ฏธ๋ฆฌ ๋‹ค ์ฑ„์›Œ์ ธ์žˆ๊ธธ ๋ฐ”๋ž„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” DB๊ฐ€ ๋ถ™์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋กœ๊ทธ์ธ๊ณผ ๋™์‹œ์— ์‹น ๋‹ค ์ €์žฅํ•  ํ•„์š”๋Š” ์—†๊ณ  User ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค ๊ฐ’๋งŒ ์•Œ๊ณ  ์žˆ์œผ๋ฉด DB ๊ตฌ๋ฌธ์„ ํ†ตํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •๋ณด์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์•„์˜ฌ ์ˆ˜๊ฐ€ ์žˆ๊ฒ ์ฃ 


1
2
3
4
5
6
7
8
9
10
11
app.get('/mypage',function(req,res) {
    if(req.session.login){
        models.User.findOne({
            where: {id: req.session.idx}
        }).then(function(info){
            res.render('mypage',{data: JSON.stringify(info.dataValues)});
        })
    }
    else
        res.send("<script>alert('๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.')</script><meta http-equiv='refresh' content='0; url=http://localhost:3000/login'</meta>");
});
cs


๋งˆ์ดํŽ˜์ด์ง€๋Š” ๋‹น์—ฐํžˆ ๋กœ๊ทธ์ธ์ด ๋˜์–ด์žˆ๋Š” ์ƒํƒœ์—์„œ๋งŒ ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— if๋ฌธ์œผ๋กœ ํ•œ ๋ฒˆ ์ฒดํฌํ•˜๊ฒŒ ๋˜๊ณ  ํ†ต๊ณผ๊ฐ€ ๋œ๋‹ค๋ฉด DB ๊ตฌ๋ฌธ์„ ํ†ตํ•ด์„œ idx ๊ฐ’์„ ํ†ตํ•ด ๊ฒ€์ƒ‰๋œ ์œ ์ €์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๊ทธ ์ •๋ณด๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ ๋‹จ์œผ๋กœ ๋„˜๊ฒจ์ค€ ํ›„์— ์‚ฌ์šฉํ•˜๋ฉฐ ๋ฉ๋‹ˆ๋‹ค.


์ด๋ ‡๊ฒŒ ๋งˆ์ดํŽ˜์ด์ง€ ํ™”๋ฉด์—์„œ ์œ ์ € ์ •๋ณด๋ฅผ ์…‹ํŒ…ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

1
2
3
4
5
script.
 var info = !{data};
 document.getElementById('email').value=info.user_id;
 document.getElementById('name').value=info.name;
 document.getElementById('nickname').value=info.nick;
cs


๋ชจ๋“  ๊ฑธ ๋‹ค ํฌํ•จํ•˜์ž๋‹ˆ ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์„œ ํ™”๋ฉด ๊ตฌํ˜„๋ถ€๋ถ„์ด๋‚˜ DB ์„ค์ •์— ๊ด€๋ จ๋œ ๋ถ€๋ถ„์€ ์ƒ๋žตํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

๋Œ€๋žต์ ์ธ ๋™์ž‘ ์ˆœ์„œ๋กœ ์ž‘์„ฑํ•˜์˜€์œผ๋‹ˆ ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2024/11   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
๊ธ€ ๋ณด๊ด€ํ•จ