์น์ ํตํด์ ์๋ฒ์ ์ ์ํ์ฌ ํด๋น ์น์ ์ ์ํ ์ฌ๋๋ผ๋ฆฌ ์ต๋ช ์ผ๋ก ๋ํ๋ฅผ ๋๋ ์ ์๋ ์์คํ .
USERS
- ์น ์ฌ์ดํธ ์ ์
- ์ฌ์ฉ์๋ช ์ ๋ ฅ (์ ๋ ฅํ์ง ์์ ์ ์์์ ์ต๋ช ๋๋ค์์ผ๋ก ์ค์ ๋จ)
- ์ฑํ ํ ์คํธ ์นธ์ ํ ์คํธ ์ ๋ ฅ ํ, ์ ์ก ๋ฒํผ์ ๋๋ฅด๋ฉด ํด๋ผ์ด์ธํธ์ ๋ฉ์ธ์ง ์ ์ก
SERVER
- ์์์ ํด๋ผ์ด์ธํธ A ์ ์์ A์๊ฒ ์ด๋ฆ์ ๋ฐ์์ ์น์ ์ ์ํ ๋ชจ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ฅ ๋ฉ์ธ์ง ํ์
- ์์์ ํด๋ผ์ด์ธํธ A๊ฐ ๋ฉ์ธ์ง ์ ์ก ์ ๋ชจ๋ ํด๋ผ์ด์ธํธ์๊ฒ ํด๋น ๋ฉ์ธ์ง์ ํด๋น ํด๋ผ์ด์ธํธ์ ์ด๋ฆ ํ์
- ์์์ ํด๋ผ์ด์ธํธ A ํด์ฅ์ ์น์ ์ ์ํ ๋ชจ๋ ํด๋ผ์ด์ธํธ์๊ฒ ํด์ฅ ๋ฉ์ธ์ง ํ์
์ก์ง์ฐ
- ๋ฐฑ์๋ ์๋ฒ ๊ตฌ์ถ
- ํ๋ก ํธ์๋ ์ฝ๋ ์ผ๋ถ ์์
- ๋ณด๊ณ ์, ํ์๋ก
๊น๋์ฑ
- ํ๋ก ํธ HTML ํ ํ๋ฆฟ ๊ฒ์ ํ ์ ๋ก๋
- HTML ํ ํ๋ฆฟ์์ ํ์์๋ ๋ถ๋ถ ์ ๊ฑฐ ๋ฐ ์ฝ๊ฐ์ ์์
- ๋ฐํ ์๋ฃ ํ๋ฆฌ์ ํ ์ด์ ์ ์
์ ๋ฏผ์ฐ
- HTML ํ ํ๋ฆฟ์ ํ์ํ ์ฝ๋๋ฅผ ์ถ๊ฐ ๋ฐ ์์
- CSS ์ผ๋ถ ์์
- ๋ฐํ ์๋ฃ ํ๋ฆฌ์ ํ ์ด์ ์ ์
BACK
FRONT
- HTML
- CSS
- javascript
Backend
Frontend
node.js ์ socket.io์ ๋ผ์ด์ ์ค์ ๋์ผํ MIT License ์ ์ฉ.
html/css ๋ถ๋ถ์ด K์ฌ์ SNS ์ฑ์ ์๊ฐ๊ณผ ๋น์ทํ์ง๋ง '์๊ฐ'์ ๋ํ ์ ์๊ถ์ ๋ฐ๋ก ์กด์ฌํ์ง ์์.
์ฐธ๊ณ ์๋ฃ: ์๊ฐ
์ผ๋ฐ์ ์ผ๋ก ์
๋ฐ์ดํธ ํ ์ฝ๋๋ฅผ ๊นํ๋ธ ์๊ฒฉ์ ์ฅ์์ ์
๋ก๋ ํ๊ธฐ์ํด์ ํด๋น ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์
๋ก๋ํจ.
ํ๋ก์ ํธ์ ์ฐธ๊ฐํ๋ ์ธ์ ๋ชจ๋ ํด๋น ํ๋ก์ ํธ๋ฅผ forkํด์ ๋ณธ์ธ ์ ์ฅ์์ ๋ ํ, branch๋ก ์์ ์ ๋ช๋ฒ์งธ ํจ์น์ธ์ง ๊ตฌ๋ถ,
ํจ์น ํ ์ดํ์ PR์ ๋ณด๋ด์ mergeํด์ฃผ๋ ์์ผ๋ก ํ์
์ ์งํํจ.
๊นํ๋ธ์ ์ฅ์ ์ธ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉ์๋ค๋ ๋๋ ์ ์๋๋ก ํ๊ธฐ ์ํด์ ํฐ ๊ธฐ๋ฅ์ด ์
๋ฐ์ดํธ ๋ ๋ ๋ง๋ค ๋ฒ์ ์ ๊ตฌ๋ถํ์ฌ release ์ํด
pre-release, lateset-release ์ฌ์ฉ์ ์ฝ๋๊ฐ ๋จ์ํ์ฌ ์ฌ๊ฐํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ผ์ด ์๊ณ , ์ฌ์ฉํ๋ ์ ์ ๊ฐ ํ์ ๋์ด์์ผ๋,
stable version, latese version๊ฐ์๊ฒ์ ๊ตฌ๋ถํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ.
์ฝ๋์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋๋ฐ, ํ ํ๋ก์ ํธ๋ฅผ ๊ฐ์ด ํ๋ ํ์๋ค๋ผ๋ฆฌ์ ๋ฉ์ ์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฐพ์๋ด๊ณ ์์ ํด๋ ์ข์๊ฒ ์ง๋ง,
๊นํ๋ธ์ issue๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด,
ํด๋น issue๊ฐ ๋ฐ์ํ๋ค๋ ์ฌ์ค, ์ด๋ป๊ฒ ํน์ ์ธ์ ๊ณ ์ณ์ก๋ ํ๋ ์ฌ์ค, ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ฒจ๊ฐํ์ฌ ํ๋์ ๋ณผ ์ ์๋ค๋ ์
์ด๋ฐ ์ด์ ๋ค ๋๋ฌธ์ github์ issue ๊ธฐ๋ฅ์ ํ ํ๋ก์ ํธ์ ์ฌ์ฉํ๊ฒ ๋์๋ค.
// getting express module
const express = require('express')
// getting socket.io module
const socket = require('socket.io')
// getting node.js standard module
const path = require('path')
const http = require('http')
const fs = require('fs')
const app = express() // construct express object
const server = http.createServer(app) // construct http server
const io = socket(server) // binding the server
์จ์ผ ํ ๋ชจ๋์ ๋ถ๋ฌ์ค๊ณ , http ์๋ฒ๋ฅผ ์์ฑํ๊ณ ์๋ฒ๋ฅผ ์์ผ์ ๋ฐ์ธ๋ฉ ํ๋ ๊ณผ์
io.on('connection', function(socket) {
socket.on('newUser', function(name){
console.log(name + " connect");
socket.name = name;
io.emit('announce', name + " ๊ฐ ์ ์ํ์ต๋๋ค.");
});
socket.on('chatting', function(data){
console.log(data);
const {name, msg} = data;
socket.name = name;
io.emit('chatting', data)
});
socket.on('disconnect', function(){
console.log(socket.name + " disconnect");
io.emit('announce', socket.name + " ๊ฐ ํด์ฅํ์ต๋๋ค.");
})
});
์ด๋ฒคํธ๋ฅผ ์ธ๊ฐ์ง๋ก ๋๋์ด์ ๊ตฌ๋ถํจ
- 'newUser'
- ํด๋ผ์ด์ธํธ๊ฐ ์ ์ํ์์ ๋ ์ค๋ ์ด๋ฒคํธ
- 'chatting'
- ํด๋ผ์ด์ธํธ๊ฐ ์ฑํ ํ ๋ ์ค๋ ์ด๋ฒคํธ
- 'disconnect'
- ํด๋ผ์ด์ธํธ๊ฐ ์ ์์ ๋์์ ๋ ์ค๋ ์ด๋ฒคํธ
const socket = io();
const nickname = document.querySelector('#nickname');
const chatList = document.querySelector('.chatting-list');
const chatInput = document.querySelector('.chatting-input');
const sendButton = document.querySelector('.send-button');
const displayContainer = document.querySelector('.display-container');
html์ ์ฟผ๋ฆฌ๋ฅผ ๋ด์์, ํด๋น ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์์๋ก ์ ์ธํด์ฃผ๋ ๊ณผ์
socket.on('connect',function(){
var name = prompt('ํ์ํฉ๋๋ค! ๋น์ ์ ๋ญ๋ผ๊ณ ์๊ฐํ๋์: ', '');
if(!name){
name = '์ต๋ช
์ ๋๊ตฐ๊ฐ'+ Math.floor(Math.random()*100);
}
nickname.defaultValue = name;
socket.emit('newUser', name);
});
socket.on('chatting', function(data){
const { name, msg } = data;
const item = new Li(name, msg);
item.makeLi();
displayContainer.scrollTo(0, displayContainer.scrollHeight);
});
socket.on('announce', function(msg){
const item = new announement(msg);
item.makeAn();
displayContainer.scrollTo(0, displayContainer.scrollHeight);
});
- 'connect'
- ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋์ด์๋ ์ด๋ฒคํธ, ํด๋ผ์ด์ธํธ๊ฐ ์ ์ํ๋ฉด ์๋ ์คํ ๋จ, ์ด๋ฆ์ ์ค์ ํด์ฃผ๊ณ ๊ทธ ๋ค์ ์๋ฒ๋ก ๋๊ฒจ์ newUser ์ด๋ฒคํธ ์คํ์ํด.
- 'chatting'
- ์ฑํ
์ด๋ฒคํธ, HTML ์ฝ๋์ ์ฑํ
๋ถ๋ถ
<li>
์ฟผ๋ฆฌ์ ์ผ๋ถ ์ฝ๋๋ฅผ ์ฝ์ ํ์ฌ์(์ฑํ ) ์ ์ ์ฑํ ์ ๋ง๋ค์ด ๋ด์ฃผ๋ ์ด๋ฒคํธ.
- ์ฑํ
์ด๋ฒคํธ, HTML ์ฝ๋์ ์ฑํ
๋ถ๋ถ
- 'announce'
- ๊ณต์ง ์ด๋ฒคํธ, HTML ์ฝ๋์ ์ฑํ
๋ถ๋ถ
<li>
์ฟผ๋ฆฌ์ ์ผ๋ถ ์ฝ๋๋ฅผ ์ฝ์ ํ์ฌ์(๊ณต์ง) ๊ณต์ง๋ฅผ ๋ง๋ค์ด ๋ด๋ ์ด๋ฒคํธ.
- ๊ณต์ง ์ด๋ฒคํธ, HTML ์ฝ๋์ ์ฑํ
๋ถ๋ถ
chatInput.addEventListener('keypress', function(e){
if (e.keyCode === 13) {
send();
}
});
function send() {
const param = {
name: nickname.value,
msg: chatInput.value,
};
socket.emit('chatting', param);
}
sendButton.addEventListener('click', send);
์คํ๋ ๋ ์๋ฒ๋ก chatting ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด๋ send ํจ์๋ฅผ ์ ์ํ์ฌ sendButton์ ๋๋ ธ์ ๋ send ํจ์๋ฅผ ์คํ์ํค๋๋ก ํ๊ณ keypress, 13๋ฒ, ์ํฐ๋ฅผ ๋๋ ์ ๋ send ํจ์๋ฅผ ์คํ์ํค๋๋ก ํจ.