๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

[Node.js] ์ฑ„ํŒ…๋ฐฉ ๋งŒ๋“ค๊ธฐ (sequelize, socket.io, express-session, nunjucks) (2023.07.11~13) ๋ณธ๋ฌธ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[Node.js] ์ฑ„ํŒ…๋ฐฉ ๋งŒ๋“ค๊ธฐ (sequelize, socket.io, express-session, nunjucks) (2023.07.11~13)

Shinjio 2023. 7. 13. 14:11
๋ฐ˜์‘ํ˜•

app.js

 

//๋ชจ๋“ˆ์‚ฌ์šฉ
const express = require('express') //express
const session = require('express-session') //session
const fileStore = require('session-file-store')(session) //session ์ €์žฅ
const {sequelize} = require('./models') //sequelize (ORM)
const webSocket = require('./socket') //socket
const nunjucks = require('nunjucks') //nunjucks - ํ…œํ”Œ๋ฆฟ์—”์ง„
const bodyParser = require('body-parser') //jsonํƒ€์ž… body ํŒŒ์‹ฑ

//router
const indexRouter = require('./routes') //./routes/index
const memberRouter = require('./routes/member')
const chatRouter = require('./routes/chat')

const app = express()

//sequelize DB ์—ฐ๊ฒฐ
//force : false -> ๊ธฐ์กด ํ…Œ์ด๋ธ”์€ ๊ฑด๋“ค์ง€ ์•Š์Œ
sequelize.sync({force:false}) 
.then(()=>{console.log('DB ์—ฐ๊ฒฐ ์„ฑ๊ณต!');})
.catch((err)=>{console.log(err);})

//nunjucks ์„ค์ •
//view๋Š” indexRouter์—์„œ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์œ„์ชฝ์—์„œ ์ž‘์„ฑํ•ด์•ผ ํ•จ 
app.set('views', __dirname+'/views')
app.set('view engine', 'html')
nunjucks.configure('views', {
    express : app,
    watch : true
})

//์„ธ์…˜ ์„ค์ • 
app.use(
    session({
        httpOnly: true,
        secret: "secretkey",
        resave: false,
        cookie:{
            httpOnly: true,
        },
        store: new fileStore(),
    })
);

app.use(express.urlencoded({extended:true})) //post์š”์ฒญ - req.body ํŒŒ์‹ฑ
app.use(bodyParser.json()) //jsonํ˜•์‹์˜ body ํŒŒ์‹ฑ

//router ์—ฐ๊ฒฐ
app.use('/', indexRouter)
app.use('/member', memberRouter)
app.use('/chat', chatRouter)

//์ •์ ํŒŒ์ผ ๊ฒฝ๋กœ ์„ค์ •
app.use(express.static(__dirname+'/public'))

//์„œ๋ฒ„ ์—ฐ๊ฒฐ
app.set('port', process.env.PORT||8888)
const server = app.listen(app.get('port'), ()=>{
    console.log(app.get('port'), '๋ฒˆ ํฌํŠธ์—์„œ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋Œ€๊ธฐ์ค‘...');
})

//์†Œ์ผ“ ์—ฐ๊ฒฐ
//์†Œ์ผ“์„ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก app์„ ํ•จ๊ป˜ ์ „๋‹ฌ
//app์— ๋ณ€์ˆ˜ ์ €์žฅํ•˜๋ฉด ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
webSocket(server, app)

 

models (sequelize => ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ)

 

index : ๊ธฐ๋ณธ ์„ค์ • 

const Sequelize = require('sequelize')
const Member = require('./member')
const Room = require('../models/room')
const Chat = require('../models/chat')

const env = process.env.NODE_ENV || 'development'
//[env] : development๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด key๊ฐ’ ์ง€์ •
const config = require('../config/config.json')[env] //๊ฐœ๋ฐœ์šฉ DB ์‚ฌ์šฉ 

//Sequelize ๊ฐ์ฒด ์ƒ์„ฑ 
//member init ํ˜ธ์ถœ์‹œ ์‚ฌ์šฉ 
const sequelize = new Sequelize(config.database, config.username, config.password, config)

//sequelize๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€ 

const db = {} //app (model, sequelize - db ์—ฐ๊ฒฐ์ •๋ณด)

db.sequelize = sequelize
db.Member = Member
db.Room = Room
db.Chat = Chat

//ํ…Œ์ด๋ธ” ์ƒ์„ฑ ํ›„ ์—ฐ๊ด€๊ด€๊ณ„ ์„ค์ • ๊ฐ€๋Šฅ >>> init ์ง„ํ–‰ ํ›„ associate
//init, associate ์‹คํ–‰
Member.init(sequelize) //ํ…Œ์ด๋ธ” ์ƒ์„ฑ 
//associate๋Š” ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ์˜ ๊ด€๊ณ„ ์„ค์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•จ => db์•ˆ์— ๋‹ด๊ฒจ์ ธ ์žˆ์Œ => ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ db
Room.init(sequelize)
Chat.init(sequelize)

Member.associate(db) //ํ…Œ์ด๋ธ” ์—ฐ๊ด€๊ด€๊ณ„ ์„ค์ •
Room.associate(db)
Chat.associate(db)

module.exports = db

 

member, chat, room model class ์ž‘์„ฑ ํ›„ index.js ์™€ ์—ฐ๊ฒฐ 

 

 

 

index.js (indexRouter)

1. ๊ธฐ๋ณธ ๊ฒฝ๋กœ์ผ ๊ฒฝ์šฐ login.html ํŽ˜์ด์ง€ ๋ Œ๋”๋ง

2. /rooms๋กœ ๋“ค์–ด์˜ค๋ฉด Room ํด๋ž˜์Šค๋กœ ์ „์ฒด room ์กฐํšŒ ํ›„ rooms.html์— result๋ฅผ ๋‹ด์•„์„œ ํ™”๋ฉด ๋ Œ๋”๋ง

 

const express = require('express')
const Room = require('../models/room')
const router = express.Router()

//์ฒซํŽ˜์ด์ง€
router.get('/', (req, res)=>{
    res.render('login') //login.html ๋ Œ๋”๋ง
})

//rooms ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€ (DB์—์„œ ์ฑ„ํŒ…๋ฐฉ ๋ฆฌ์ŠคํŠธ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•จ!)
router.get('/rooms', async(req, res, next)=>{

    try{
        const result = await Room.findAll()
        // console.log(result);

        //result๋ฅผ html๋กœ ๋ณด๋‚ด์ค˜์•ผ ํ•จ
        res.render('rooms', {rooms:result})
    }catch(err){
        next(err)
    }
})

module.exports = router

 

member.js

๋กœ๊ทธ์ธ ์„ฑ๊ณต์‹œ session์— ๋ฐ์ดํ„ฐ ์ €์žฅ ํ›„ /rooms๋กœ ์ด๋™

const express = require('express')
const Member = require('../models/member')
const router = express.Router()

router.post('/login', async(req, res, next)=>{
    console.log(req.body)
    let {id, pw} = req.body
    try{
        const result = await Member.findOne({
            where : {id : id, pw : pw}
            //id, pw๋กœ๋งŒ ์ž‘์„ฑํ•ด๋„ ๋“ค์–ด๊ฐ
        })

        req.session.member = result
        req.session.save(function(){
            
            if(result){
                res.redirect('/rooms')
            }else{
                res.redirect('/')
            }
    })}catch(err){
        next(err)
    }
})

module.exports = router;

 

chat.js

 

const express = require('express')
const Chat = require('../models/chat')
const router = express.Router()

router.get('/:roomid', async(req, res, next)=>{
    console.log(req.params.roomid);

    //์ง€๊ธˆ๊นŒ์ง€ ์ง„ํ–‰๋œ ์ฑ„ํŒ… ๋‚ด์šฉ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ 
    try{
        const chats = await Chat.findAll({
            where : {roomid : req.params.roomid}
        })
        // console.log('์ฑ„ํŒ…์ „์ฒด๋‚ด์šฉ',chats);
        //nunjucks์—์„œ๋Š” ๋ฐ”๋กœ session์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ -> ๊ฐ™์ด ๋ณด๋‚ด์ค˜์•ผ ํ•จ
    res.render('chat', {roomid : req.params.roomid, userid : req.session.member.id, chats : chats})
    }catch(err){
        next(err)
    }
})

router.post('/:roomid/insert', async(req, res, next)=>{
    let roomid = req.params.roomid;
    let chat = req.body.chat;
    let userid = req.session.member.id;

    console.log(roomid, chat, userid);
    try{
        //์ฑ„ํŒ…db์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž… -> ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ ํ™”๋ฉด์— ๋ณด์ด์ง€ ์•Š์Œ
        const chats = await Chat.create({
            roomid : roomid,
            chat : chat,
            userid : userid
        })
        
        //socket ์‚ฌ์šฉ -> ์ด ์ฑ„ํŒ…์„ ์ž…๋ ฅํ•œ ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ™์€ ๋ฃธ์— ์žˆ๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ ๋ฟŒ๋ ค์ฃผ๊ธฐ! (์‹ค์‹œ๊ฐ„)
        //๋ฐ์ดํ„ฐ ๋ฟŒ๋ฆฌ๊ธฐ (๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ ํ™”๋ฉด์— ๋ฐ์ดํ„ฐ ๋ณด์ด๋„๋ก)
        req.app.get('io').of('/chat').to(roomid).emit('chat', {userid : userid, chat:chat, roomid:roomid})
        res.send('OK')

    }catch(err){
        next(err)
    }
})


module.exports = router

 

์„œ๋ฒ„์ธก socket

 

const socketIO = require('socket.io')

//server : app์—์„œ ์ƒ์„ฑํ•œ express server
//app : ์–ด๋””์„œ๋“  io ๊ฐ์ฒด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก app ๊ฐ€์ ธ์™”์Œ
module.exports = (server, app)=>{

    //express server - socket ์—ฐ๊ฒฐ
    //1) ์†Œ์ผ“ ๊ฐ์ฒด ์ƒ์„ฑ
    const io = socketIO(server, {path : '/socket.io'})
    // ์†Œ์ผ“io ๊ฐ์ฒด๋ฅผ ์™ธ๋ถ€(๋ผ์šฐํ„ฐ)์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๊ธฐ  > app์— ๋ณ€์ˆ˜ ์„ค์ •
    // -> app์„ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
    app.set('io', io)

    //2) io ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์ ‘์† ์„ฑ๊ณต, ์ ‘์† ํ•ด์ œ, ์—๋Ÿฌ ์ด๋ฒคํŠธ ์ถ”๊ฐ€
    // ๋ผ์šฐํŒ… (-> ๋„ค์ž„์ŠคํŽ˜์ด์Šค : ๊ธฐ๋Šฅ ๊ตฌ๋ถ„, ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ฒ˜๋ฆฌ)
    // - ์ฑ„ํŒ… ๊ธฐ๋Šฅ ->  /chat
    // - ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ  -> /alarm
    // - ํ†ต์งธ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ io.on
    // - namespace ์„ค์ • : io.of('๊ฒฝ๋กœ')
    const chat = io.of('/chat') //์ฑ„ํŒ… ๊ด€๋ จ ๋„ค์ž„์ŠคํŽ˜์ด์Šค
    chat.on('connection', (socket)=>{
        //์—ฐ๊ฒฐ์ด ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์†Œ์ผ“์ด ์ƒ์„ฑ๋จ(์†Œ์ผ“์ด ํด๋ผ์ด์–ธํŠธ์˜ ์ •๋ณด ๋‹ด๊ณ  ์žˆ์Œ)
        console.log('chat ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ ‘์† ์„ฑ๊ณต ');

        //room ์„ค์ • (room ๊ธฐ๋Šฅ์„ socket.io์—์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Œ)
        // -> ๋ฐฉ์ด๋ฆ„(roomid) ์„ค์ • -> ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ๊ฒฝ๋กœ(request)์— ํฌํ•จ
        //room์— ๋“ค์–ด๊ฐ„ ํด๋ผ์ด์–ธํŠธ๋ผ๋ฆฌ๋งŒ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋„๋ก!
        const ref = socket.request.headers.referer //ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ์ฃผ์†Œ
        const roomid = ref.split('/')[ref.split('/').length-1];
        console.log(roomid); 

        //roomid์— ๋”ฐ๋ผ์„œ ๋ฃธ์„ ๋งŒ๋“ค์–ด์คŒ - roomid๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ฐ™์€ ๋ฐฉ์œผ๋กœ ๋“ค์–ด๊ฐ!
        socket.join(roomid)

        //ํด๋ผ์ด์–ธํŠธ๋งˆ๋‹ค ์†Œ์ผ“ ์ƒ์„ฑ๋˜๋ฏ€๋กœ socket์— ์ด๋ฒคํŠธ ๋ถ€์—ฌ
        socket.on('disconnect', ()=>{
            console.log('chat ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์ ‘์† ํ•ด์ œ');
        })

        //chat ์ด๋ฒคํŠธ : ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’(data)์„ ๋ฟŒ๋ ค์คŒ
        socket.on('chat', (data)=>{
            // console.log('socket.js : ',data);
            socket.to(roomid).emit(data)
        })

    }) //์ฑ„ํŒ… ์—ฐ๊ฒฐ ์ด๋ฒคํŠธ
}

 

 

socket ํด๋ผ์ด์–ธํŠธ ์ธก - chat.html

 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="/css/style.css">
</head>

<body>
    <fieldset>
        <legend>์ฑ„ํŒ… ๋‚ด์šฉ</legend>
        <!-- class ์ง€์ • : mine -> ๋‚˜์˜ ์ฑ„ํŒ… ๋‚ด์šฉ (์˜ค๋ฅธ์ชฝ์— ์ถœ๋ ฅ), other -> ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฑ„ํŒ… ๋‚ด์šฉ(์™ผ์ชฝ ์ถœ๋ ฅ) -->
        <div id="chat-list">
            {%for chat in chats%}
            {%if chat.userid === userid%}
            <div class="mine">
                <div>{{chat.userid}}</div>
                <div>{{chat.chat}}</div>
            </div>
            {%else%}
            <div class="other">
                <div>{{chat.userid}}</div>
                <div>{{chat.chat}}</div>
            </div>
            {%endif%}
            {%endfor%}
        </div>
    </fieldset>
    <!--๋น„๋™๊ธฐ ๋ฐฉ์‹
    action : ๋™๊ธฐ๋ฐฉ์‹ -->
    <form id="chat-form">
        <input type="text" id="chat-input" name="chatinput">
        <input type="submit" value="์ „์†ก">
    </form>

    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        //ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“ ๊ฐ์ฒด ์ƒ์„ฑ (์†Œ์ผ“ ์—ฐ๊ฒฐ)
        const socket = io.connect('http://localhost:8888/chat', { //chat : chat namespace ์ง€์ •
            path: '/socket.io'
        })

        socket.on('chat', function (data) {
            console.log(data);
            const div = document.createElement('div')
            if (data.userid == '{{userid}}') { //๋กœ๊ทธ์ธํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž…๋ ฅํ•œ ์ฑ„ํŒ…์ด๋ผ๋ฉด
                div.classList.add('mine')
            } else { //๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž…๋ ฅํ•œ ์ฑ„ํŒ…์ด๋ผ๋ฉด
                div.classList.add('other')
            }

            //Id ์ถœ๋ ฅ div
            const divId = document.createElement('div')
            divId.textContent = data.userid
            div.appendChild(divId) //์ž์‹ div๋กœ ์ถ”๊ฐ€

            //์ฑ„ํŒ… ์ถœ๋ ฅ div
            const divChat = document.createElement('div')
            divChat.textContent = data.chat
            div.appendChild(divChat) //divId ์ž์‹์œผ๋กœ ์ถ”๊ฐ€๋จ

            //#chat-list์— div ์ถ”๊ฐ€
            document.getElementById('chat-list').appendChild(div)
        })

        //submit ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ form์˜ input ๋‚ด์šฉ์„ ๊ฐ€์ง€๊ณ  ์™€์•ผํ•œ๋‹ค!
        document.getElementById('chat-form').addEventListener('submit', function (e) {
            //submit ๊ธฐ๋ณธ๊ธฐ๋Šฅ : ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์„œ๋ฒ„๋กœ ์š”์ฒญ >> ๋ง‰๊ธฐ
            //e(event) > submit event
            e.preventDefault() //์„œ๋ฒ„๋กœ ์š”์ฒญํ•˜๋Š” submit์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ๋ง‰๊ธฐ
            // console.log(e.target.chatinput.value); //์„œ๋ฒ„๋กœ ๋ณด๋‚ด์„œ DB๋กœ ์ €์žฅ
            console.log(e)
            if (e.target.chatinput.value) {
                //์„œ๋ฒ„๋กœ ์ฑ„ํŒ… ๋‚ด์šฉ ์ „์†ก
                axios.post('/chat/{{roomid}}/insert', {
                    chat: e.target.chatinput.value
                    //jsonํ˜•ํƒœ๋กœ ์ „์†ก
                })
                    .then((data) => {
                        console.log(data);

                    })
                    .catch((err) => {
                        console.log(err);
                    })
            }
        })
    </script>
</body>

</html>

 

์†Œ์ผ“ ํ†ต์‹  ์ •๋ฆฌ

socket.js ์ƒ์„ฑ - ์„œ๋ฒ„๋‹จ

 

1. socket.io ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ


2. exports = (server, app) => {}
 express server์™€ ์†Œ์ผ“ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด server ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ, 
 router์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด app ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์Œ => app์—์„œ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜๋ฉด ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

2.1. ์†Œ์ผ“ ๋ชจ๋“ˆ๋กœ ์†Œ์ผ“ ๊ฐ์ฒด ์ƒ์„ฑ. ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, server์™€ path๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ €์žฅ
 : ์—ฌ๊ธฐ์„œ path์˜ ์˜๋ฏธ๋ž€???
 app.set์œผ๋กœ ์†Œ์ผ“ ๊ฐ์ฒด ์ €์žฅ 

2.2 
chat ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์„ค์ • - io.of('/chat')
์ฑ„ํŒ…์— ์—ฐ๊ฒฐ๋˜๋ฉด > ํด๋ผ์ด์–ธํŠธ๋งˆ๋‹ค ์†Œ์ผ“ ์ƒ์„ฑ > ์†Œ์ผ“์— ๋Œ€ํ•˜์—ฌ ๋ฃธ์ƒ์„ฑ, ์ ‘์†ํ•ด์ œ, chat์ด๋ฒคํŠธ ์ง€์ •
chat.on('connection', (socket)=>{} //์—ฐ๊ฒฐ์ด ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์†Œ์ผ“ ์ƒ์„ฑ๋จ
์ƒ์„ฑ๋œ ์†Œ์ผ“์—์„œ ์ฃผ์†Œ ๊ฐ€์ ธ์™€์„œ roomid๋ฅผ ๊บผ๋‚ด...
socket.join(roomid) => ๋ฃธ ์ƒ์„ฑ
socket.on('disconnect') => ์ ‘์† ํ•ด์ œ 
socket.on('chat' (data)=>{socket.to(roomid).emit(data) => chat ์ด๋ฒคํŠธ : roomid์— 

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

chat.html - ํด๋ผ์ด์–ธํŠธ๋‹จ


    <script src="https://unpkg.com/axios/dist/axios.min.js"></script> //axios ํ†ต์‹ 
    <script src="/socket.io/socket.io.js"></script> //socket ํ†ต์‹ 

ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“ ๊ฐ์ฒด ์ƒ์„ฑํ•˜์—ฌ ์—ฐ๊ฒฐ - io.connect(http://localhost:8888/chat) => ์—ฌ๊ธฐ๋„ ๋“ค์–ด์˜ค๋ฉด ์†Œ์ผ“ ์ƒ์„ฑ
socket.on('chat', function(data)}{

๋ฒ„ํŠผ ๋ˆŒ๋ €์„ ๋•Œ ์ด๋ฒคํŠธ 
= > axios.post (chat/{{roomid}}/insert)๋กœ chat ๋‚ด์šฉ ์ „์†ก
}} //chat ์ด๋ฒคํŠธ - ์„œ๋ฒ„๋‹จ ์†Œ์ผ“์—์„œ emitํ•œ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉ 

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

app.js socket ์‚ฌ์šฉ ์„ค์ • 

const webSocket = require('./socket') //์†Œ์ผ“ ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ

//์†Œ์ผ“์„ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก app์„ ํ•จ๊ป˜ ์ „๋‹ฌ
//app์— ๋ณ€์ˆ˜ ์ €์žฅํ•˜๋ฉด ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
webSocket(server, app)









๋ฐ˜์‘ํ˜•