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

์ด์ „ ํฌ์ŠคํŒ…์—์„œ๋Š” DB๋ฅผ ์…‹ํŒ…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ DB์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•ด์•ผํ•˜๊ฒ ์ฃ ? ๊ทธ๋Ÿผ server์™€ client ๊ฐ„์˜ ํ†ต์‹ ์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์•ž ๋‹จ๊ณผ ๋’ท ๋‹จ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ . 


commuity ๋ผ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ ์šฉ์„ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 


์ €๋Š” pug ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋•Œ๋ฌธ์— html ํ˜•ํƒœ๊ฐ€ ์กฐ๊ธˆ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜์„ ํ•ด์ฃผ๋Š” ์‚ฌ์ดํŠธ๋“ค์ด ๋งŽ์ด ์žˆ์œผ๋‹ˆ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•˜์…”๋„ ๋˜๊ณ  ์•„๋‹ˆ๋ฉด ๊ฐœ์ธ์ ์œผ๋กœ ๊ฒŒ์‹œํŒ ํผ์„ ๋งŒ๋“ค์–ด์„œ ์“ฐ์…”๋„ ๋ฉ๋‹ˆ๋‹ค. 



views/commuity.pug

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
31
32
33
script(src='https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js')
link#custom-css(href='custom_css/commuity.css', rel='stylesheet')
link(rel='stylesheet', href='https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.4/css/bootstrap-select.min.css')
    table.type09(id='List')
        thead
        tr
            th(scope='cols' style="width:10%") nums 
            th(scope='cols' style="width:55%") Title
            th(scope='cols' style="width:10%") Views 
            th(scope='cols'Date
            th(scope='cols' style="width:10%") Author
        tbody#tbody
    div(align="right" style="margin-right:10%;")
    script.
        let data = !{data}
        let len = Object.keys(data).length
        $(document).ready(function(){
            let tbody = document.getElementById('tbody');
            if(data==0)
                len = 1
            else{
                len = Object.keys(data).length
                tbody = document.getElementById('tbody');
                for(let i=0;i<len;i++){
                    tbody.innerHTML += "<th>"+(i+1)+"</th>"
                    +"<th>"+data[i].subject+"</th>"
                    +"<th>"+data[i].count+"</th>"
                    +"<th>"+data[i].created_at.substr(0,10)+ "</th>"
                    +"<th>"+data[i].name+"</th>"
                }
            }
        });
 
cs


์•ฝ๊ฐ„์˜ css๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ์–ด์„œ ๊ฐ™์ด ์ฒจ๋ถ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์„ ์ข€ ๋ณด๊ธฐ ์ข‹๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


custom_css/commuity.css

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
31
32
table.type09 {
    margin-left: auto;
    margin-right: auto;
    border-collapse: collapse;
    line-height: 1.5;
    width: 80%;
    margin-top:3%;
}
table.type09 thead th {
    padding: 10px;
    font-weight: bold;
    vertical-align: top;
    text-align:left;
    color: #369;
    border-bottom: 3px solid #036;
}
table.type09 tbody th {
    width: 150px;
    padding: 10px;
    font-weight: bold;
    text-align:center;
    vertical-align: top;
    border-bottom: 1px solid #ccc;
    background: #f3f6f7;
}
table.type09 td {
    width: 350px;
    padding: 10px;
    vertical-align: top;
    border-bottom: 1px solid #ccc;
}
 
cs



๊ทธ๋Ÿผ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ app.js ํŒŒ์ผ์—์„œ ๋ Œ๋”๋ง์„ ํ•˜๊ฒŒ ๋˜๋ฉด html ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


app.js

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const session = require('express-session')
const passport = require('passport')
const sequelize = require('sequelize')
const models = require('./models')
const app = express();
 
//app.get
const indexRouter = require('./routes/index');
const commuityRouter = require('./routes/commuity')
//sequelize
models.sequelize.sync()
    .then(function() {
    console.log('โœ“ DB connection success.');
      console.log('  Press CTRL-C to stop\n');
  })
  .catch(function(err) {
    console.error(err);
    console.log('โœ— DB connection error. Please make sure DB is running.');
    process.exit();
  });
 
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine''pug');
 
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(cookieParser())
app.use(session({
    secret:'123123123',
    resave:false,
    saveUninitialize:true
}));
app.use(express.static(__dirname));
 
//get
app.use('/', indexRouter);
app.use('/commuity',commuityRouter);
 
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});
 
// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env'=== 'development' ? err : {};
 
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});
module.exports = app;
cs


์—ฌ๊ธฐ์„œ commuity ๋ผ์šฐํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ฉด


routes/commuity.js

1
2
3
4
5
6
7
8
9
10
let express = require('express')
let router = express.Router()
let app = express();
let path = require('path')
app.set('views',path.join(__dirname,'views'));
app.set('view engine','pug')
 
router.get('/',function(req,res){
    res.render('commuity')
})
cs


์•„์ง์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค€ ๊ฒƒ์ด ํ•˜๋‚˜๋„ ์—†์œผ๋‹ˆ ์ด๋Ÿฐ ์‹์œผ๋กœ ์—ด๋งŒ ๋‚˜์˜ค๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. commuity ๋ผ์šฐํ„ฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ์ž‘์—…์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ์•„๋ฌด ๋ฐ์ดํ„ฐ๋‚˜ ๋„˜๊ฒจ์ค„ ์ˆœ ์—†๊ฒ ์ฃ  DB์™€ ์—ฐ๋™ํ•ด์„œ ์“ฐ๊ณ  ์žˆ์œผ๋‹ˆ DB์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.


์ €๋Š” DB์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ž‘์—…์„ ํ•จ์ˆ˜๋กœ ๋”ฐ๋กœ ์ž‘์„ฑํ•˜์—ฌ ๋ถˆ๋Ÿฌ์™”๋Š”๋ฐ ๊ทธ๋ƒฅ ํ•œ ํŒŒ์ผ์— function์„ ์„ ์–ธํ•ด์„œ ์“ฐ์…”๋„ ์ƒ๊ด€์€ ์—†์Šต๋‹ˆ๋‹ค.



function/board.js

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
let models = require('../models');
let async = require('async');
 
function boardLoadFunction(callback) {
    models.Board.findAll().then(function(result){    //result๊ฐ€ board ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๊ฐ’์„ json์œผ๋กœ ๋ฐ˜ํ™˜
        let jsonObj = [];                //board ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด
        let tasks = [
            function(call){            
                if(result.length==0)    //๊ฒŒ์‹œํŒ์— ๊ธ€์ด ํ•˜๋‚˜๋„ ์—†์„ ๋•Œ0๊ฐ’ ๋ฆฌํ„ด
                    callback(0)
                else{
                    for(let i=0;i<result.length;i++)        //๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋ฌธ
                        jsonObj.push(result[i].dataValues)    //jsonObj ๋ฐฐ์—ด์— select * from board ๊ฐ’์„ ์ €์žฅ
                    call(null,jsonObj);                        //์œ„์˜ ์ฟผ๋ฆฌ๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์Œ ํ•จ์ˆ˜๋กœ ๋„˜๊ฒจ์คŒ
                }
            },
            function(jsonObj,call){
                let i =0;                            
                let nameList = {};                            //{ ์™ธ๋ž˜ํ‚ค : ์ด๋ฆ„ } ์˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค json ๋ฐ์ดํ„ฐ
                jsonObj.forEach(function(element){            //board ํ…Œ์ด๋ธ”๊ณผ userํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ต
                    models.User.findOne({                    
                        where:{id:element.fk_userId}        //board์˜ ์™ธ๋ž˜ํ‚ค์™€ user์˜ id๊ฐ’์˜ ์ผ์น˜์—ฌ๋ถ€
                    }).then(function(user){
                        nameList[element.fk_userId] = user.dataValues.name    
                        //nameList ๊ฐ์ฒด์— { ์™ธ๋ž˜ํ‚ค : ์ด๋ฆ„ } ์œผ๋กœ ์ €์žฅ
                        i++;
                        if(jsonObj.length==i)    //๋ฐฐ์—ด ๋๊นŒ์ง€ ๋น„๊ต๊ฐ€ ๋๋‚˜๋ฉด ๋‹ค์Œ ํ•จ์ˆ˜๋กœ ๋„˜๊ฒจ์คŒ
                            call(null,nameList);        
                    })
                })
            },
            function(nameList,call) {            //jsonObj์— name๊ฐ’์„ ์ถ”๊ฐ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ๋งŒ๋“ฆ
                let i=0
                jsonObj.forEach(function(element){    
                    if(nameList.hasOwnProperty(element.fk_userId)){
                        jsonObj[i].name = nameList[element.fk_userId]    //jsonObj๊ฐ์ฒด์— name key์™€ key value ์ถ”๊ฐ€
                        i++
                    }
                    if(i==jsonObj.length)
                        callback(jsonObj)        //๋ฐฐ์—ด ๋๊นŒ์ง€ ๋น„๊ต๊ฐ€ ๋๋‚˜๋ฉด app.js๋กœ ๋„˜๊ฒจ์คŒ
                })
            }
        ]
        async.waterfall(tasks,function(err){
            if(err)
                console.log(err)
        })
    }).catch(function(err){
        console.log(err);
    })
}
exports.boardLoadFunction = boardLoadFunction;
 
cs


์ž‘์„ฑํ•˜๋‹ค๋ณด๋‹ˆ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋„ˆ๋ฌด ์ปค์ ธ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ฒŒ์‹œํŒ์— ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•  ์—ด์˜ ๋ชฉ๋ก์€ ์œ„์—์„œ ๋ณด๋‹ค์‹œํ”ผ


๊ฒŒ์‹œ๋ฌผ ๋ฒˆํ˜ธ    |     ๊ฒŒ์‹œ๋ฌผ ์ œ๋ชฉ     |     ์กฐํšŒ ์ˆ˜     |     ๋‚ ์งœ     |     ๊ธ€์“ด์ด    |


์ด๋ ‡๊ฒŒ 6๊ฐœ์˜ ์—ด์ธ๋ฐ ๊ฒŒ์‹œ๋ฌผ ๋ฒˆํ˜ธ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” board ํ…Œ์ด๋ธ”๊ณผ user ํ…Œ์ด๋ธ”์— ํ•ด๋‹น ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‘ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด ๋˜์ฃ ..


board ํ…Œ์ด๋ธ” -> ๊ฒŒ์‹œ๋ฌผ์ œ๋ชฉ , ์กฐํšŒ์ˆ˜ , ๋‚ ์งœ

user ํ…Œ์ด๋ธ” -> ๊ธ€์“ด์ด


๊ทธ๋ž˜์„œ ์œ„์— ํ•จ์ˆ˜ ์ž‘์—…์„ ๋‹จ๊ณ„๋ณ„๋กœ ๋‚˜๋ˆ„์ž๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค.



๊ทผ๋ฐ async ๋ชจ๋“ˆ์„ ์จ๊ฐ€๋ฉด์„œ๊นŒ์ง€ ํ•œ ์ด์œ ๋Š” user ํ…Œ์ด๋ธ”์—์„œ name ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ธฐ์กด์˜ jsonObj ๋ณ€์ˆ˜์— ์ €์žฅ์„ ํ•  ๋•Œ ๋งค์นญ์ด ์•ˆ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค๋ฉด 1๋ฒˆ์ด๋ผ๋Š” ๊ฒŒ์‹œ๋ฌผ์€ 1๋ฒˆ์ด๋ผ๋Š” ์ด๋ฆ„์ด ์ž‘์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ


๊ฒŒ์‹œ๋ฌผ ๋ฒˆํ˜ธ    |     ๊ฒŒ์‹œ๋ฌผ ์ œ๋ชฉ     |     ์กฐํšŒ ์ˆ˜     |     ๋‚ ์งœ     |     ๊ธ€์“ด์ด    |

        1                         1๋ฒˆ                        0              ~~~              1๋ฒˆ

2                        2๋ฒˆ                        0             ~~~               2๋ฒˆ


์ด๋Ÿฐ ์‹์œผ๋กœ ๋‚˜์™€์•ผ ํ•˜๋Š”๋ฐ



๊ฒŒ์‹œ๋ฌผ ๋ฒˆํ˜ธ    |     ๊ฒŒ์‹œ๋ฌผ ์ œ๋ชฉ     |     ์กฐํšŒ ์ˆ˜     |     ๋‚ ์งœ     |     ๊ธ€์“ด์ด    |

        1                         1๋ฒˆ                        0              ~~~              2๋ฒˆ

2                        2๋ฒˆ                        0             ~~~               1๋ฒˆ


์ด๋Ÿฐ์‹์œผ๋กœ ๊ธ€์“ด์ด์™€ ๊ฒŒ์‹œ๋ฌผ์ด ๋งค์นญ์ด ์•ˆ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋˜์–ด ์ตœ๋Œ€ํ•œ ๋‹จ๊ณ„๋ณ„๋กœ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ์‚ฝ์ž…ํ•˜๊ฒŒ ๋” ์ˆ˜์ •์„ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ ๋น„๋™๊ธฐ์„ฑ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค. 

๊ฐ€๋…์„ฑ๋„ ๋–จ์–ด์ง€๊ณ  ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๋ผ ์ƒ๊ฐ์€ ๋“œ๋Š”๋ฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋‚ด๋ฉด ์—…๋ฐ์ดํŠธ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.



์œ„ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋ฌผ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ์ตœ์ข…์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ jsonObj๊ฐ’์„ boardLoadFunction์„ ํ˜ธ์ถœํ•œ ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•ด์ค๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋Š” html ํŽ˜์ด์ง€๋ฅผ ๋กœ๋”ฉํ•จ๊ณผ ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ค˜์•ผ๊ฒ ์ฃ 


์ˆ˜์ • ๋œ

routes/commuity.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let express = require('express')
let router = express.Router()
let app = express();
let path = require('path')
let board = require('../function/board')
app.set('views',path.join(__dirname,'views'));
app.set('view engine','pug')
 
router.get('/',function(req,res){
    board.boardLoadFunction(function(result){
        res.render('commuity',{data:JSON.stringify(result)})
    })
})
module.exports = router;
cs


board ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๋‹น ๊ฐ’์„ commuity ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉด์„œ ๊ฐ์ฒด๋ฅผ client ํŽ˜์ด์ง€์— ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.



๋งจ ์ฒ˜์Œ์— ์ž‘์„ฑํ–ˆ๋˜ html ํŽ˜์ด์ง€ ์ค‘ script ๋ถ€๋ถ„๋งŒ ๋”ฐ๋กœ ๋–ผ์–ด์„œ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<script>
    let data = !{data}
    let len = Object.keys(data).length
    $(document).ready(function() {
        let tbody = document.getElementById('tbody');
        if (data == 0)
            len = 1
        else {
            len = Object.keys(data).length
            tbody = document.getElementById('tbody');
            for (let i = 0; i < len; i++) {
                tbody.innerHTML += "<th>" + (i + 1+ "</th>" +
                    "<th>" + data[i].subject + "</th>" +
                    "<th>" + data[i].count + "</th>" +
                    "<th>" + data[i].created_at.substr(010+ "</th>" +
                    "<th>" + data[i].name + "</th>"
            }
        }
    });
</script>
cs


data ๋ณ€์ˆ˜๋Š” board ํ•จ์ˆ˜์—์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฒŒ์‹œ๋ฌผ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” json ๊ฐ์ฒด ๋ฐ์ดํ„ฐ ์ž…๋‹ˆ๋‹ค. 

ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด์„œ ํ…Œ์ด๋ธ”์— ์ฐจ๋ก€๋Œ€๋กœ ์‚ฝ์ž…์‹œ์ผœ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. innerHTML ๋ฅผ ์ด์šฉํ•˜์—ฌ data ๊ฐ์ฒด์— ์žˆ๋Š” ๊ฐ’๋“ค์„ ํ•ด๋‹น ์—ด์— ๋งž๊ฒŒ๋” ๋ฐ์ดํ„ฐ ํ–‰์„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.



DB์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ์ด๋Ÿฐ์‹์œผ๋กœ ๋ชจ์Šต์ด ๋‚˜์˜ค๊ฒŒ ๋˜๊ฒ ์ฃ 



๋ฌผ๋ก  ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์˜ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜๋„ ์žˆ์–ด์•ผ ํ•˜๊ณ  ๊ธ€์“ฐ๊ธฐ ํŽ˜์ด์ง€ ๋ผ๋˜๊ฐ€ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์žˆ์–ด์•ผ ๊ฒŒ์‹œํŒ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ .

์ง€๊ธˆ์€ ์–ด๋–ค์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ฟŒ๋ ค์ฃผ๋Š” ๊ฒƒ์ธ์ง€๋ฅผ ์œ„์ฃผ๋กœ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. 



๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
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 31
๊ธ€ ๋ณด๊ด€ํ•จ