๋จผ์ ์คํ๋ฆฐํธ ์งํ์ ์ํด 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
๋ฅผ ์ ํ์๋์ง ์ด์ ์ผ ์๊ฑฐ ๊ฐ๋ค. ์ด๋ ๊ฒ ๋ด๊ฐ ๊ณต๋ถํ๋ ๊ฒ๋ค์ด ์ฐ๊ฒฐ๋๋ ์ ์ด ์ฐธ ์ข์ ๊ฒ ๊ฐ๋ค.