๋จผ์ ์คํ๋ฆฐํธ ์งํ์ ์ํด Server, API, HTTP, Ajax, fetch ๋ฑ์ ๊ฒ์ํ์ฌ ๋ณด๊ณ ๊ฐ๋
์ ๋ํด ํ์ตํ๋ค. ๋๋์ด Server์ ๋ํด ๋ฐฐ์๋ณธ๋ค๋ ๋ง์์ ์ค๋ ๊ธฐ๋ ํ๋ค.
Pre Course์์ ์งํํ๋ Twittler ์คํ๋ฆฐํธ์์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ ๋ฐ์ชฝ์ง๋ฆฌ ์น ์ฑ์ ๋ถ๊ณผํ๋ค (๋ฌผ๋ก , localStorage๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ถ๋ถ๊น์ง ๊ตฌํํด๋ณด๊ธด ํ๋ค). ์ด๋ฒ ์คํ๋ฆฐํธ๋ ์ด๋ฏธ ์ ์๋ํ๋ ์๋ฒ๋ฅผ ์ด์ฉํด์ ์ฑํ
์ฑ์ ๋ง๋๋ ๊ฒ์ด๋ค.
ํ์ด ๋ถ๊ณผ ์ด๋ป๊ฒ ์งํํด์ผํ ์ง ์์๋ฅผ ํ๋ค. ํ์ง๋ง ์ฌ๊ธฐ์์ ํ์ต ๋ฐฉ์์ด ๊ทธ๋ ๋ฏ, '๋๋์ฒด ๋ญ ์ด๋ป๊ฒ ํ๋ผ๋๊ฑฐ์ง?' ์ถ์๋ค. ์๋ฒ๋ก๋ถํฐ ๋ฐ์์จ ๋ฉ์์ง๋ค์ ๋ณด์ฌ์ค ์ ์์ด์ผ ํ๋ค. ๋ด๊ฐ ์์ฑํ ๋ฉ์์ง๋ฅผ ์๋ฒ๋ก ๋ณด๋ผ์๋ ์์ด์ผ ํ๊ณ , chatterbox-server API ๋ฌธ์๋ฅผ ์ด์ฉํด ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌํํด์ผํ๋ค.
์ผ๋จ, ํด๋ผ์ด์ธํธ ๊ตฌํ์ ์ํด html ํ์ผ์ ์์ ํ๋ค. API ๋ฌธ์๋ฅผ ๋ณด๋ฉด์ ๋น๊ต์ ๊ฐ๋จํ GET ์์ฒญ๋ถํฐ ๋ณด๋ด๋ณด๊ธฐ๋ก ํ๊ณ , fetch๋ฅผ ์ด์ฉํด GET ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฌด์์ ๊ณ์ ์ฝ์์ ์ฐ์ด๋ณด๋ฉฐ ์๊ตฌ์ฌํญ๋ค์ ๊ตฌํํด๋ณด๋ ค๊ณ ๋
ธ๋ ฅํ๋ค. ์ด๋ ค์ ๋ค.

GET ์์ฒญ์ ์๋ต์ console์ ์ฐ์ด๋ดค๋ค.
let message = {
username: 'Assiduous',
text: 'Hello',
roomname: 'Im24'
};
// This is the url you should use to communicate with the AWS server.
const serverURL = 'http://52.78.206.149:3000/messages'
window.fetch(serverURL, {
method: 'POST',
body: JSON.stringify(message),
headers: {
"Content-Type": "application/json",
}
}).then(response => {
return response.json();
}).then(json => {
console.log(json);
// message sent!
});
์๋ฒ์ ๋ฉ์ธ์ง๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์ POST ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ด๋ค. ์ด ๊ณผ์ ์ ์ดํดํด๋ณด์. ์, ์๋ฒ URL์ fetch API๋ฅผ ํตํด method๋ POST, ํฌ์คํธ ์์ฒญ์ด๊ตฌ๋, body๋ ๋ด meesage ๊ฐ์ฒด๋ฅผ JSON.stringify()์ ํํ๋ก ๋ณด๋ด๋๊ตฌ๋, HTTP ์์ฒญ์ headers๋ json ํํ๋ผ๋ ๊ฒ์ ์๋ ค์ฃผ๋๊ตฌ๋, .then()์ผ๋ก ์๋ต์ ๋ฐ๊ณ .json()์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ด๊ฐ ์์๋ณด๊ธฐ ์ฝ๊ฒ ๊ฐ์ฒด๋ก ๋ฐ๊พธ๋๊ตฌ๋.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>chatterbox</title>
<link rel="stylesheet" href="styles/styles.css" />
</head>
<body>
<div id="main">
<h1>chatterbox</h1>
<span>Room : </span>
<select name="room" class="filter-room"></select>
<form>
<input type="text" class="message-input" />
<button class="submit-button" type="submit">submit</button>
</form>
</div>
<div id="chats"></div>
<script src="scripts/app.js"></script>
</body>
</html>
const app = {
server: 'http://52.78.206.149:3000/messages',
init: () => {
// ๋ฒํผ ํด๋ฆญ์ clickSubmit ๋ฉ์๋ ํธ์ถ
const submit = document.querySelector('#main .submit-button');
if (submit) submit.addEventListener('click', app.clickSubmit);
// fetch(GET)๋ฅผ ํตํด ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ renderํ๋ค
app.fetch((result) => {
for (let i = result.length - 1; i >= 0; i--) {
app.renderMessage(result[i]);
}
});
app.makeRoomsList();
},
// GET
fetch: (callback) => {
window
.fetch(app.server)
.then((response) => response.json())
.then((response) => response.results)
.then(callback); // ์ต์ข
๋ฆฌํด๋ ํ๋ก๋ฏธ์ค๊ฐ์ฒด์์ ๋ฐฐ์ด์ ๊บผ๋ด callback ํจ์๋ฅผ ์คํ
},
// POST
send: (message, callback) => {
window
.fetch(app.server, {
method: 'POST',
body: JSON.stringify(message),
headers: {
'Content-Type': 'application/json',
},
})
.then((response) => response.json())
.then((response) => response.results)
.then(callback);
},
// ๊ฐ์ ธ์จ ๋ฐ์ดํฐ์ roomname์ update
makeRoomsList: () => {
const rooms = document.querySelector('.filter-room');
const valueObj = {};
let value = 1;
app.fetch((result) => {
for (let message of result) {
if (valueObj[message.roomname] === undefined) {
const roomname = document.createElement('option');
roomname.classList.add('roomName');
roomname.innerText = message.roomname;
roomname.value = value;
if (rooms) rooms.appendChild(roomname);
valueObj[message.roomname] = value++;
}
}
});
},
clearMessages: () => {
document.querySelector('#chats').innerHTML = '';
// const chats = document.querySelector('#chats');
// while (chats.hasChildNodes()) {
// chats.removeChild(chats.firstChild);
// }
},
renderMessage: (messageObj) => {
const message = document.createElement('div');
message.innerText = `${messageObj.username} :\n${messageObj.text}`;
message.classList.add('chat');
document.querySelector('#chats').appendChild(message);
},
// submit ๋ฒํผ ํด๋ฆญ์ ๋ค ์ง์ฐ๊ณ ๋ฉ์ธ์ง POST ์์ฒญ์ ๋ณด๋ด๊ณ ๋ค์ renderํ๋ ํจ์
clickSubmit: (e) => {
e.preventDefault();
const input = document.querySelector('.message-input');
const message = {
username: 'Assiduous',
text: input.value,
roomname: 'StudyCafe',
};
app.clearMessages();
app.send(message, () => {
app.fetch((result) => {
for (let i = result.length - 1; i >= 0; i--) {
app.renderMessage(result[i]);
}
});
});
input.value = '';
},
};
app.init();

ChatterBox Client Sprint ์์ฑํ๋ค. Reference Code๋ฅผ ๋ณด๊ณ ๋ฆฌํฉํ ๋ง๊น์ง ๋ง์ณค๋ค. fetch API๋ฅผ ํ์ฉํ์ฌ ์ค์ ๊ตฌ๋ํ๋ ์๋ฒ์ GET, POST ์์ฒญ์ ํ๊ณ ์๋ต์ ๋ฐ์๋ณด๋ ๊ฒฝํ์ ํ ์ ์์๊ณ , ์ ๋ง ์ฌ๋ฐ์ด์ ์ดํ๋์ ๋ฐค ๋ฆ๊ฒ๊น์ง ์๊ฐ๊ฐ๋์ค ๋ชจ๋ฅด๊ณ ์ฝ๋ฉ ํ๋ ๊ฒ ๊ฐ๋ค. ์ด์ ์ ์งํํ๋ ๋น๋๊ธฐ ์คํ๋ฆฐํธ์์ fetch API๋ฅผ ์ ํ์๋์ง ์ด์ ์ผ ์๊ฑฐ ๊ฐ๋ค. ์ด๋ ๊ฒ ๋ด๊ฐ ๊ณต๋ถํ๋ ๊ฒ๋ค์ด ์ฐ๊ฒฐ๋๋ ์ ์ด ์ฐธ ์ข์ ๊ฒ ๊ฐ๋ค.