February 09, 2021
broadcast ๋ผ๋ ๊ฐ ์ด๋ฐ ๋ถ๋ถ์ ์ผ๋จ ์๋ต, 2๋ถ์์๋ ํด๋ผ์ด์ธํธ ์์ ๋ณด์ฌ์ง๊ฒ ํ๊ณ Mysql ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ฐ๋ํด์ CRUD ๋ฅผ ์ค์ฒํด๋ณผ ๊ฒ์ด๋ค.
(๋ฌผ๋ก UD ๋ ๋ค์์)
1ํธ์์ form ํ๊ทธ๋ฅผ ๋ง๋ค์ด ๋ฃ์๊ณ onsubmit ์ด๋ฒคํธ๋ฅผ form ์ ๊ฑธ์๋ค.
sendMessage() ํจ์๋ฅผ ์ด์ ์ ์ํด ์ฃผ์.
์๋์ ๊ฐ์ด ์์ , ๊ธฐ์กด socket.emit ์ฝ๋๋ฅผ ํจ์ ๋ด๋ก ์์น์์ผ์ ๋ณ๊ฒฝ ํ๋๋ก ํ๋ค.
<script>
const socket = io("http://localhost:3000");
function sendMessage() {
let message = document.querySelector("#message");
// ! ์ฐ์ตํ๋ฏ์ด ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฉ์์ง๋ฅผ ๋ ๋ฆด๋๋ ๋ญ๋ค? emit!
console.log(message.value);
socket.emit("new_message", message.value);
// ๋ค์ ์๋ฒ ์ชฝ์ผ๋ก ๋์๊ฐ์ ํด๋ผ์ด์ธํธ์ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ค๋น๋ฅผ ํด์ผ ํ๋ค.
return false;
// this is prevent the form from submitting, ๋ฆฌ์กํธ์์๋ e.preventDefault ๊ฐ ์๋ฏ์ด
}
// client will listen from server
socket.on("new_message", (data) => {
// localhost:3000 ํ์ด์ง ๋ด ๊ฐ๋ฐ์ ๋๊ตฌ ์ฐฝ์์ ํ์ธํด ๋ณผ ๊ฒ
console.log("Server says", data);
}
</script>
// To send same message back to all users
io.emit('new_message', 'Hello, Client๐')
server.js ๋ด ์์ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ์์ ํ๋ค.
io.emit('new_message', data)
ํด๋ผ์ด์ธํธ์์ ์ธํ ์ฐฝ์ ์ ๋ ฅํ ์ฑํ ์ด data ๋ณ์ ํ๋ผ๋ฏธํฐ์ ๋ด๊ฒจ ์๋ฒ๋ก ์์ฒญ์ด ๋ค์ด๊ฐ์ผ๋,
์ด์ ์ด data ๋ฅผ socket ์ ์ ์ํ ๋ชจ๋ ํด๋ผ์ด์ธํธ ๋ค์๊ฒ ๋ฟ๋ ค์ฃผ๋ ๊ฑฐ๋ค.
ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ ) ๊ฐ๋ฐ์๋๊ตฌ๋ฅผ ๊ฐ์ ํ์ธํด ๋ณด๋ฉด ์ฑํ ์ด ์ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
index.html ์์
<script src="/socket.io/socket.io.js"></script>
<form onsubmit="return sendMessage()">
<input id="message" placeholder="Enter message" />
<input type="submit" value="Send" />
</form>
<!-- List where all messages will be displayed -->
<ul id="messages"></ul>
<script>
...์ดํ ์๋ต...
// client will listen from server
socket.on("new_message", (data) => {
// localhost:3000 ํ์ด์ง ๋ด ๊ฐ๋ฐ์ ๋๊ตฌ ์ฐฝ์์ ํ์ธํด ๋ณผ ๊ฒ
console.log("Server says", data);
// display messages
let li = document.createElement("li");
li.innerHTML = data; // ๋ง๋ค์ด์ง li ๋ด ํ
์คํธ๊ฐ server ์์ ๋ฐ์ data ๋ฅผ ๋ฃ๋๋ค.
const messages = document.querySelector("#messages");
messages.appendChild(li); // ul ์ ์์์ผ๋ก li ์ถ๊ฐํ๊ธฐ
});
</script>
๋ธ๋ผ์ฐ์ ํญ์ ๋๊ฐ ์ ๋ ์ด์ด์ ์ธํ์ ์ฑํ ์ ์ ๋ ฅํ๊ณ submit ์ ํจ๊ณผ ๋์์ ์ค์๊ฐ์ผ๋ก ๋ฐ์๋๋ ๋ชจ์ต์ ํ์ธํด ๋ณด์.
๋จผ์ mysql ์ ์ ์ํด์ โsocketio_testโ ๋ผ๋ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๋ค. (๋ง์๋๋ก ์ง์ผ์ธ์)
create database socketio_test;
๊ทธ๋ฆฌ๊ณ use socketio_test ๋ก ๋ค์ด๊ฐ ํ, ํ ์ด๋ธ์ ์์ฑํ๋๋ก ํ๋ค.
create table messages
(id INT(10) NOT NULL AUTO_INCREMENT,
message VARCHAR(1024),
PRIMARY KEY(id));
npm install mysql
nodemon ์ผ๋ก ์๋ฒ๋ ์ผ๋๊ฒ
io ๋ณ์๋ฅผ ์ ์ธํ ๋ถ๋ถ ์๋ ์ฏค์๋ค ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
// use mysql
const mysql = require('mysql')
// create connection
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '1234',
database: 'socketio_test',
})
connection.connect(error => {
// show error, if any
})
์ด์ ์๋ ์ฝ๋์์ ๋ง์ง๋ง ๋ถ๋ถ์ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํด์ค data (์ฑ) ๋ถ๋ถ์ ๋ด์ผ ํ๋ค.
์ฌ๊ธฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก ๋ฟ๋ง ์๋๋ผ, database ์ ์ ์ฅ์ ํด์ผ๊ฒ ์ง?
socket.on('new_message', data => {
console.log('Client says', data)
// send same message back to all users
io.emit('new_message', data)
// ! save message in DATABASE
connection.query(
"INSERT INTO messages (message) VALUES ('" + data + "')",
function(error, result) {
//
}
)
})
์ ์ด์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ก๊ณ ์นจํด๋ณด์. ๊ทธ๋ฆฌ๊ณ ์ธํ์ฐฝ์ ์ ๋ ฅํ ์ํฐ ์ณ๋ณด์.
๊ทธ ๋ค์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ํ์ธํด ๋ณด์. ๋ค์ด๊ฐ๊ณ ์๋ค.
๋จผ์ index.html ๋ก ๊ฐ์ ๋ ๋ฒ์งธ ์คํฌ๋ฆฝํธ ํ๊ทธ ๋ด sendMessage ํจ์ ์ฝ๋์ ์๋ ์ฏค์ ajax ์์ฒญ์ ๋ฃ์ ์ฐจ๋ก๋ค.
๋ฆฌ์กํธ์์ componentDidMount, useEffect ์ ๋ฃ์ ๋น๋๊ธฐ ์์ฒญ (fetch) ๋ฑ์ด ์๊ฒ ๋ค.
์์ฒญ์ ํ๋ ค๋ฉด? ๋ฐฑ์๋์์์ ์๋ํฌ์ธํธ๋ฅผ ํ์๋ก ํ๋ค.
์ผ๋จ, fetch(โhttp://localhost:3000/get_messagesโ) ์ ๋๋ก ์์ฑํด์ฃผ๊ณ ๋ค์ server.js ๋ก ๋์๊ฐ์ผ ํ๋ค.
์ฒ์์ ์์ฑํ ์ฌํ get request ์ฝ๋ ์์ฏค์ ์์ฑํ๋ค.
// ! create API for get_message
app.get('/get_messages', (req, res) => {
connection.query('SELECT * FROM messages', (error, messages) => {
// return data will be in JSON format
res.end(JSON.stringify(messages))
// ์ด๊ฑฐ ํ๊ธฐ ์ซ์ผ๋ฉด app.use(express.json()); ๋ฅผ ์ ์ฉํด์ผ ํ ๊ฒ์ด๋ค.
})
})
๊ทธ๋ผ ์ด์ index.html ๋ก ๋์๊ฐ์ ํด๋ผ์ด์ธํธ์ fetch ์์ฒญ์ ๋ง์ ์์ฑํ๋ค.
fetch('http://localhost:3000/get_messages')
.then(res => res.json())
.then(data => {
const messages = document.querySelector('#messages')
for (let i = 0; i < data.length; i++) {
// display message, creates new DOM element
let li = document.createElement('li')
// give it unique id (in order to delete message)
li.id = data[i].id
// add message content as HTML
li.innerHTML = data[i].message
// append at the end of list
messages.appendChild(li)
}
})
๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ก๊ณ ์นจ ํด๋ณด์.
์ด์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ก ์ด์ด๋ ํด๋น ์ฑํ ์ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ณ ์ค๋ํ ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋๋ค.
๋ํ ๋ณต์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ด ํ ์คํธ๋ฅผ ํด ๋ณด๋ฉด ์ค์๊ฐ์ผ๋ก ๋์ ์ฑํ ์ด ๋ค๋ฅธ ์ ์ ๋ค์๊ฒ (ํด๋ผ์ด์ธํธ) ๋ฐ์๋๋ ๊ฒ ๋ํ ํ์ธํ ์ ์๋ค.
์ถ๊ฐ๋ก delete ํ๋ ๊ฒ๋ ๋ฃ์ผ๋ ค ํ์ผ๋ ์ด๊ฑด ๋์ค์ ๋ฃ๊ฒ ๋ค.
์ผ๋จ ์ด๊ฑธ ์ดํดํ๋ฉด socket.io ์ ์ฉ๊ธฐ์ด ์ ๋๋ ๋ง์ ๋ดค๋ค ์ ๋๊ฐ ๋์ง ์์๊น ์ถ๋ค.
๐คก๐คก๐คก๐คก๐คก๐คก๐คก๐คก๐คก๐คก๐คก๐คก๐คก๐คก๐คก๐คก๐คก๐คก๐คก