๐ ์ธํฐํ์ด์ค ํต์ ๊ธฐ์ : AJAX, Fetch, WebSocket, GraphQL | ๐์ ์ฒ๊ธฐ ์ค๊ธฐ ๋๋น ๋ฌธ์ ํฌํจ
์์ฝ
์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ ์ค๊ธฐ ์ํ์ ํต์ฌ ์ฃผ์ ์ธ ์ธํฐํ์ด์ค ํต์ ๊ธฐ์ ์ ์๋ฒฝํ ์ ๋ฆฌํฉ๋๋ค. ๋น๋๊ธฐ ํต์ ์ ๊ทผ๊ฐ์ธ AJAX๋ถํฐ ํ๋์ ์ธ Fetch API, ์ค์๊ฐ ํต์ ์ ์ํ WebSocket, ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์์ฒญ์ ์ํ GraphQL๊น์ง ๊ฐ ๊ธฐ์ ์ ํน์ง๊ณผ ์ฐจ์ด์ ์ ์์๋ด ๋๋ค.
๐ก ์ธํฐํ์ด์ค ํต์ ๊ธฐ์ ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ํธ์์ฉํ๋ ๋ฐฉ์์ ์ ์ํ๋ฉฐ, ์ ์ฒ๊ธฐ ์ค๊ธฐ ์ํ์์ ๊ฐ ๊ธฐ์ ์ ๋ชฉ์ ๊ณผ ํน์ง์ ๋น๊ตํ๋ ๋ฌธ์ ๊ฐ ์์ฃผ ๋์ต๋๋ค.
๐ ์ธํฐํ์ด์ค ํต์ ๊ธฐ์
ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ค์ํ ํต์ ๊ธฐ์ ๋ค์ ๋๋ค. ๊ฐ ๊ธฐ์ ์ ์ฌ์ฉ ๋ชฉ์ ๊ณผ ํน์ง์ด ๋ค๋ฆ ๋๋ค.
1. AJAX (Asynchronous JavaScript and XML)
AJAX๋ ์นํ์ด์ง ์ ์ฒด๋ฅผ ์๋ก๊ณ ์นจํ์ง ์๊ณ ๋, ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๊ตํํ์ฌ ๋์ ์ผ๋ก ํ๋ฉด์ ๊ฐฑ์ ํ๋ ๊ฐ๋ฐ ๊ธฐ๋ฒ์ ๋๋ค.
- ํต์ฌ ์ญํ :
XMLHttpRequest
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ์ต๋๋ค. - ํน์ง:
- ํ์ด์ง ๊น๋นก์ ์์ด ํ์ํ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ(UX)์ ํฅ์์ํด.
- ์ด๋ฆ์๋ XML์ด ํฌํจ๋์ด ์์ง๋ง, ํ์ฌ๋ ์ฃผ๋ก ๊ฐ๋ฒผ์ด JSON ํ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ตํํจ.
- AJAX๋ ํน์ ๊ธฐ์ ์ด ์๋, ์ฌ๋ฌ ๊ธฐ์ (JavaScript, DOM, Fetch/XHR ๋ฑ)์ ์ฌ์ฉํ๋ ํจ๋ฌ๋ค์์ ๊ฐ๊น์ต๋๋ค.
2. Fetch API
Fetch API๋ XMLHttpRequest
๊ฐ์ฒด๋ฅผ ๋์ฒดํ๋ ํ๋์ ์ธ ๋ธ๋ผ์ฐ์ ๋ด์ฅ API์
๋๋ค. Promise ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋์ด ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋
์ฑ์ด ๋์ต๋๋ค.
-
ํน์ง:
- ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ์์ด ์ฌ์ฉ ๊ฐ๋ฅ.
- Promise ๊ธฐ๋ฐ์ผ๋ก
async/await
๋ฌธ๋ฒ๊ณผ ํจ๊ป ์ฌ์ฉ๋์ด ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์. - ํ์ฌ ์น ํ์ค์ผ๋ก ์๋ฆฌ ์ก์ AJAX๋ณด๋ค ๋ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
-
JavaScript ์์ (
async/await
์ฌ์ฉ):javascriptasync function getUser(id) { try { // API์ GET ์์ฒญ์ ๋ณด๋ ๋๋ค.(**fetch** ์ฌ์ฉ) const response = await fetch(`https://api.example.com/users/${id}`); // ์๋ต์ด ์ฑ๊ณต์ ์ด์ง ์์ผ๋ฉด ์๋ฌ๋ฅผ ๋ฐ์์ํต๋๋ค. if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } // ์๋ต ๋ณธ๋ฌธ์ JSON์ผ๋ก ํ์ฑํฉ๋๋ค. const user = await response.json(); console.log(user); return user; } catch (error) { console.error("Fetch error:", error); } } // ํจ์ ํธ์ถ getUser(1);
3. WebSockets
์น์์ผ(WebSockets) ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์๋ฐฉํฅ ์ค์๊ฐ ํต์ ์ ์ง์ํ๋ ํ๋กํ ์ฝ์ ๋๋ค.
- ํน์ง:
- ํ ๋ฒ ์ฐ๊ฒฐ์ด ์๋ฆฝ๋๋ฉด ๊ณ์ ์ ์ง(Persistent Connection)๋์ด ๋ฐ์ดํฐ ๊ตํ์ด ์์ ๋ก์.
- ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ ์์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๋ **์๋ฒ ํธ์(Server-Push)**๊ฐ ๊ฐ๋ฅ.
- ๋งค์ฐ ๋ฎ์ ์ง์ฐ ์๊ฐ(latency)์ผ๋ก ์ค์๊ฐ ์ฑํ , ์จ๋ผ์ธ ๊ฒ์, ์ฃผ์ ์์ธ ์๋ฆผ ๋ฑ์ ์ฌ์ฉ๋จ.
4. GraphQL
GraphQL์ API๋ฅผ ์ํ **์ฟผ๋ฆฌ ์ธ์ด(Query Language)**์ด์, ํด๋น ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฐํ์์ ๋๋ค. REST ์ํคํ ์ฒ์ ๋์์ผ๋ก ๋ฑ์ฅํ์ต๋๋ค.
- ํน์ง:
- Over-fetching/Under-fetching ํด๊ฒฐ: ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ์ง์ ์ ์ํ์ฌ ์์ฒญํ๋ฏ๋ก, ๋ถํ์ํ ๋ฐ์ดํฐ ์ ์ก์ด ์์.
- ํ๋์ ์๋ํฌ์ธํธ(Endpoint)๋ก ์ฌ๋ฌ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฐํ๊ฒ ์์ฒญ ๊ฐ๋ฅ.
- ๊ฐ๋ ฅํ ํ์ ์์คํ ์ ๊ธฐ๋ฐ์ผ๋ก API ๋ช ์ธ๋ฅผ ๊ด๋ฆฌ.
- JavaScript ์์ (
fetch
์ฌ์ฉ):
async function getProduct(id) {
// ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ GraphQL ์ฟผ๋ฆฌ๋ก ์ ์ํฉ๋๋ค.
const query = `
query GetProductById($id: ID!) {
product(id: $id) {
id
name
price
description
}
}
`;
try {
const response = await fetch("https://api.example.com/graphql", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
// ์ฟผ๋ฆฌ์ ๋ณ์๋ฅผ body์ ๋ด์ ๋ณด๋
๋๋ค.
body: JSON.stringify({
query: query,
variables: { id: id },
}),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
console.log(result.data.product);
return result.data.product;
} catch (error) {
console.error("GraphQL request error:", error);
}
}
// ํจ์ ํธ์ถ
getProduct("prod-123");
๐ ์ ์ฒ๊ธฐ ์ค๊ธฐ ๋๋น ๋ฌธ์
๋ฌธ์ | ์นํ์ด์ง ์ ์ฒด๋ฅผ ์๋ก๊ณ ์นจํ์ง ์๊ณ , ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋ฒ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตํํ์ฌ ํ๋ฉด ์ผ๋ถ๋ง ๋์ ์ผ๋ก ๊ฐฑ์ ํ๋ ๊ฐ๋ฐ ๊ธฐ๋ฒ์ ๋ฌด์์ธ๊ฐ? |
๋ต๋ณ | |
์ ๋ต | ์ ๋ต ๋ณด๊ธฐ |
๋ฌธ์ | XMLHttpRequest๋ฅผ ๋์ฒดํ๋ Promise ๊ธฐ๋ฐ์ ํ๋์ ์ธ ์น ํ์ค API๋ก, HTTP ์์ฒญ/์๋ต์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ฌด์์ธ๊ฐ? |
๋ต๋ณ | |
์ ๋ต | ์ ๋ต ๋ณด๊ธฐ |
๋ฌธ์ | ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์๋ฐฉํฅ ์ค์๊ฐ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ, ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ ์์ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๋(Server-Push) ํ๋กํ ์ฝ์ ๋ฌด์์ธ๊ฐ? |
๋ต๋ณ | |
์ ๋ต | ์ ๋ต ๋ณด๊ธฐ |
๋ฌธ์ | ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ง ์ ํํ๊ฒ ์์ฒญํ์ฌ Over-fetching ๋ฐ Under-fetching ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ API๋ฅผ ์ํ ์ฟผ๋ฆฌ ์ธ์ด๋ ๋ฌด์์ธ๊ฐ? |
๋ต๋ณ | |
์ ๋ต | ์ ๋ต ๋ณด๊ธฐ |