** 6-1๋จ๊ณ: Ajax ์์ฒญ ๋๋ฒ๊น ๊ธฐ๋ฒ ์์ ์ ๋ณต๐ **
Ajax ์์ฒญ์ด ์ ๋๊ฑฐ๋ ๋๋ฆด ๋, ๋๋์ฒด ์ด๋๊ฐ ๋ฌธ์ ์ธ์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๐ ํฌ๋กฌ์ Network ํจ๋์ ํ์ฉํด์ ์ ํํ ๋ถ์ํ๊ณ ํด๊ฒฐํ ์ ์์ด์.
โ 1. ์ Ajax ๋๋ฒ๊น ์ด ์ด๋ ค์ธ๊น?
- ์์ฒญ์ ๋์ ์ ๋ณด์ด๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ผ์ด๋จ
- ์๋ฌ ๋ฉ์์ง๋ ์๊ณ ํ๋ฉด์ ์ ๋ธ
- ๋คํธ์ํฌ ์๋, ์๋ฒ ์๋ต, JS ์ฝ๋ ์ค ์ด๋๊ฐ ๋ฌธ์ ์ธ์ง ์๊ธฐ ์ด๋ ค์
โ ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ๊ฑด?
์์ฒญ์ด ์ด๋ป๊ฒ ์งํ๋๊ณ , ์ด๋์ ์ค๋ ๊ฑธ๋ฆฌ๋์ง ์ง์ ๋ค์ฌ๋ค๋ณด๊ธฐ! ๐
โ 2. ๋๊ตฌ: Chrome DevTools์ Network ํจ๋
๐ ์์ํ๋ ๋ฐฉ๋ฒ
- ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์์ F12 ๋๋ Ctrl+Shift+I ๋๋ฅด๊ธฐ
- ์๋จ ํญ์์ Network ํด๋ฆญ
- ํ์ด์ง ์๋ก๊ณ ์นจ (Ctrl+R)
- ์๋์ ๊ฐ์ ์์ฒญ ๋ชฉ๋ก์ด ๋ธ
โ 3. Ajax ์์ฒญ ์ฐพ๊ธฐ
๐ ํํฐ๋งํ๋ ๋ฐฉ๋ฒ
-
์๋จ ํํฐ์์ XHR ๋๋ fetch ํด๋ฆญ
โ Ajax ๊ด๋ จ ์์ฒญ๋ง ๋ณด์
๐ฆ๐ป ์ฌ์ด ์
๋ณต์ฌํธ์ง
fetch("/api/user")
โ Network ํจ๋์์ /api/user
์์ฒญ์ด ๋ณด์
โ ํด๋ฆญํ๋ฉด ๋ชจ๋ ์ ๋ณด๊ฐ ๋ถ์ ๊ฐ๋ฅ!
โ 4. ์์ฒญ ์์ธ ๋ถ์
์์ฒญ์ ํด๋ฆญํ๋ฉด 6๊ฐ์ง ํญ์ด ๋ณด์ ๋๋ค:
ํญ ์ด๋ฆ | ๋ด์ฉ |
---|---|
Headers | ์์ฒญ URL, ๋ฉ์๋, ํค๋ ์ ๋ณด (์์ฒญ ์ ์ค๋น ์ํ) |
Payload | ์ ์กํ ๋ฐ์ดํฐ (POST, JSON ๋ฑ) |
Response | ์๋ฒ์์ ๋ฐ์ ๋ฐ์ดํฐ |
Preview | JSON/XML ๊ตฌ์กฐ๋ก ์์๊ฒ ๋ฏธ๋ฆฌ๋ณด๊ธฐ |
Timing | ์ค์ ์๋ ๋ถ์ |
Initiator | ์ด๋ค JS ์ฝ๋๊ฐ ์ด ์์ฒญ์ ๋ณด๋๋์ง ์ถ์ |
โ 5. Timing ํญ: ์ฑ๋ฅ ๋๋ฒ๊น ํต์ฌ
๐ Timing ๊ตฌ๊ฐ ์ค๋ช (๐ฆ๐ป๋ ์ดํด ๊ฐ๋ฅํ๊ฒ!)
ํญ๋ชฉ | ์ค๋ช | ์ฌ์ด ์ |
---|---|---|
Queued | ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ๋๊ธฐ ์๊ฐ | โ์์ ๊ธฐ๋ค๋ฆฌ๋ ์คโ |
Stalled | ๋ธ๋ผ์ฐ์ ๊ฐ ์ค์ ์์ฒญ ๋ณด๋ด๊ธฐ ์ ์ค๋น ์๊ฐ | ์ธํฐ๋ท ์ผ๋ ์ค |
DNS Lookup | ๋๋ฉ์ธ ์ด๋ฆ์ IP๋ก ๋ฐ๊พธ๋ ์๊ฐ | ์ฃผ์ โ ์์น ์ฐพ๊ธฐ |
Initial Connection | ์๋ฒ์ ์ฐ๊ฒฐํ๋ ์๊ฐ | ์ ํ๋ฅผ ๊ฑฐ๋ ๊ณผ์ |
SSL | HTTPS ๋ณด์ ์ฐ๊ฒฐํ๋ ์๊ฐ | ํตํ ์ ์ํธํ ์ค์ |
TTFB (Time to First Byte) | ์๋ฒ์์ ์๋ต ์์๊น์ง ๊ฑธ๋ฆฐ ์๊ฐ | ์๋๋ฐฉ์ด โ์ฌ๋ณด์ธ์โ ํ๊ธฐ๊น์ง ์๊ฐ |
Content Download | ์๋ต ๋ณธ๋ฌธ์ ๋ค ๋ฐ๋ ์๊ฐ | ๋ง ๋ค ๋ฃ๊ธฐ๊น์ง ์๊ฐ |
โ ์์ ํด์
ํญ๋ชฉ | ๊ฐ |
---|---|
Queued | 0.5ms |
DNS Lookup | 10ms |
Initial Connection | 20ms |
TTFB | ๐ฅ 1200ms โ ๋ฌธ์ ์์ธ! |
Content Download | 12ms |
โ ์๋ฒ์์ ์๋ต์ด ๋๋ฌด ๋๋ฆผ (TTFB 1200ms)
โ ๋ฐฑ์๋๋ DB ์ฑ๋ฅ ๊ฐ์ ํ์
โ 6. ์์ฃผ ๋ณด๋ ๋ฌธ์ ์ํฉ๊ณผ ํด์
์ฆ์ | ํด์ | ์กฐ์น |
---|---|---|
TTFB ๊ธธ๋ค | ์๋ฒ๊ฐ ์๋ต ๋ฆ์ | DB ์ฟผ๋ฆฌ ์ต์ ํ, ์บ์ฑ |
DNS ์ค๋ ๊ฑธ๋ฆผ | ๋๋ฉ์ธ ์ค์ ๋๋ฆผ | DNS ์บ์ฑ, CDN ๋์ |
Content Download ๋๋ฆผ | ๋ฐ์ดํฐ ํฌ๊ธฐ ํผ | Gzip ์์ถ, ์๋ต ์ต์ํ |
Stalled ๊ธธ๋ค | ๋ธ๋ผ์ฐ์ ๊ฐ ๋๊ธฐ์ค | ์์ฒญ ๋ณ๋ชฉ, Keep-Alive ์ ๊ฒ |
โ 7. JavaScript ์ฝ๋์์ ๋ฌธ์ ์ถ์
๐ง ์์ ์ฝ๋
fetch("/api/data")
.then(res => {
if (!res.ok) throw new Error("์๋ฒ ์ค๋ฅ");
return res.json();
})
.then(data => console.log(data))
.catch(err => console.error("Ajax ์คํจ:", err));
- ์คํจ ์ catch๋ก ์ก๊ณ ์ฝ์๋ก ํ์ธ ๊ฐ๋ฅ
- Network ํจ๋๊ณผ ํจ๊ป ๋ณด๋ฉด โ์ธ์ , ์ด๋์โ ๋ฌธ์ ๊ฐ ์๊ฒผ๋์ง ์ ํํ ํ์ ๊ฐ๋ฅ
โ 8. ๋ฉด์ ์ง๋ฌธ ์์ + ํด์ค
โ Q. Ajax ์์ฒญ์ด ๋๋ฆด ๋, ์ด๋ป๊ฒ ์์ธ์ ์ฐพ๊ณ ๋ถ์ํ์๋์?
โ A.
- Chrome DevTools์ Network โ Timing ํญ์ ํตํด ์์ฒญ์ ๊ฐ ๋จ๊ณ ์๋๋ฅผ ํ์ธํฉ๋๋ค.
- *TTFB(Time To First Byte)**๊ฐ ๊ธธ๋ค๋ฉด ์๋ฒ ์๋ต ์ง์ฐ์ด๊ณ ,
- Content Download๊ฐ ๊ธธ๋ค๋ฉด ์๋ต ๋ฐ์ดํฐ๊ฐ ๋๋ฌด ํฌ๋ค๋ ๋ป์ ๋๋ค.
- DNS๋ Stalled ์๊ฐ๋ ์ฐธ๊ณ ํ์ฌ ๋คํธ์ํฌ, ๋ธ๋ผ์ฐ์ , ์๋ฒ ์ค ์ด๋๊ฐ ๋ฌธ์ ์ธ์ง ์ ํํ ํ์ ํ ์ ์์ต๋๋ค.
โ ์ ์ฒด ์์ฝ ์นด๋
ํญ๋ชฉ | ์ค๋ช |
---|---|
DevTools Network | Ajax ์์ฒญ ์ ์ฒด ์ถ์ ๊ฐ๋ฅ |
XHR, fetch ํํฐ | Ajax ์์ฒญ๋ง ๋ณด๊ธฐ |
Headers | ์์ฒญ ์ ๋ณด |
Payload | ๋ณด๋ธ ๋ฐ์ดํฐ |
Response | ์๋ฒ ์๋ต |
Timing | ์๋ ๋ฌธ์ ์ฐพ๊ธฐ ํต์ฌ |
TTFB | ์๋ฒ ์๋ต ์์๊น์ง ๊ฑธ๋ฆฐ ์๊ฐ (์ฑ๋ฅ ํต์ฌ) |
Stalled | ๋ธ๋ผ์ฐ์ ๋๊ธฐ ์๊ฐ |
ํด๊ฒฐ ๋ฐฉ๋ฒ | Gzip, CDN, DB ํ๋, ๋ฐฑ์คํ ๋ฑ |
โ 6-2๋จ๊ณ: Ajax ํต์ ํ ์คํธ ์ ๋ต ์์ ์ ๋ณต
Ajax ์์ฒญ์ ๋คํธ์ํฌ๊ฐ ํ์ํ๋ ํ ์คํธ๊ฐ ์ด๋ ต์ต๋๋ค.
์ด๊ฑธ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ง ์๋ฒ(Mock Server)๋ฅผ ์ฌ์ฉํด์
๋คํธ์ํฌ ์์ด๋ ์์ฒญ์ ํ ์คํธํ ์ ์์ต๋๋ค!
โ 1. ์ Ajax ํ ์คํธ๋ ์ด๋ ต๊ณ ์ค์ํ๊ฐ?
์ด์ | ์ค๋ช |
---|---|
โ ํ ์คํธํ ๋๋ง๋ค ์๋ฒ๊ฐ ํ์ํจ | ์ค์๋ฒ ์์กด๋ ๋๋ฌด ๋์ |
โ ๋คํธ์ํฌ ๋๋ฆผ/์ค๋ฅ ๋๋ฌธ์ ํ ์คํธ ์คํจ | ๊ฒฐ๊ณผ๊ฐ ๋ถ์์ ํด์ง |
โ ํ ์คํธ ์๋ํํ๋ ค๋ฉด ์๋ฒ ์์ด๋ ๋์๊ฐ์ผ ํจ | Mock(๊ฐ์ง ์๋ฒ) ํ์! |
โ 2. Mock Server๋?
๐ฆ ์ ์
์ค์ ์๋ฒ์ฒ๋ผ ์๋ํ์ง๋ง, ์ค์ ๋ก๋ ํ ์คํธ์ฉ ๊ฐ์ง ์๋ต์ ์ฃผ๋ ์๋ฒ
๐ฆ๐ป ์ฌ์ด ์ค๋ช
์ง์ง ํ๋ฒ๊ฑฐ ๊ฐ๊ฒ์ ๊ฐ๋ ๋์ , ์ข ์ด๋ก ๋ ๋ชจํ ํ๋ฒ๊ฑฐ๋ฅผ ์ฐ์ต์ฉ์ผ๋ก ๋ฐ๋ ๊ฒ!
์ง์ง์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ก ๋จน์ง ์์์ โ ํ ์คํธ ์ ์ฉ!
โ 3. ๋ก์ปฌ Mock Server ์ข ๋ฅ
โ JSON Server (Node.js ๊ธฐ๋ฐ)
db.json ํ์ผ ํ๋๋ก REST API์ฒ๋ผ ์๋ต์ ๋ง๋ค์ด์ฃผ๋ ๋๊ตฌ
๐ฆ ์ค์น & ์ฌ์ฉ๋ฒ
npm install -g json-server
json-server --watch db.json --port 3001
๐ ์์ db.json
{
"users": [
{ "id": 1, "name": "ํ๊ธธ๋" },
{ "id": 2, "name": "์ด๋ชฝ๋ฃก" }
]
}
โ GET /users
์์ฒญ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์๋ตํด์ค
โ ์ค์๋ฒ ์์ด๋ GET/POST/PUT/DELETE ํ ์คํธ ๊ฐ๋ฅ!
โ Mirage.js (๋ธ๋ผ์ฐ์ ๋ด Mock ์๋ฒ)
์ค์ ์๋ฒ ์์ด ๋ธ๋ผ์ฐ์ ๋ด์์ Mock API๋ฅผ ๋ง๋ฆ
์ฃผ๋ก SPA, React/Vue ๊ฐ๋ฐ์ ์ ํฉ
๐ฆ ์์ ์ฝ๋
import { createServer } from "miragejs";
createServer({
routes() {
this.get("/api/users", () => [
{ id: 1, name: "ํ๊ธธ๋" },
{ id: 2, name: "์ฑ์ถํฅ" }
]);
}
});
โ fetch(โ/api/usersโ)๋ก ์์ฒญํด๋ Mirage๊ฐ ์๋ต!
โ 4. ์ ๋ ํ ์คํธ์์ Mockํ๊ธฐ (Jest + axios/fetch)
โ Jest + axios-mock-adapter
axios ์์ฒญ์ ๊ฐ์ง๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ฆ ์ค์น
npm install --save-dev jest axios-mock-adapter
๐ ์์ ์ฝ๋
import axios from "axios";
import MockAdapter from "axios-mock-adapter";
test("์ฌ์ฉ์ ๋ถ๋ฌ์ค๊ธฐ", async () => {
const mock = new MockAdapter(axios);
mock.onGet("/users").reply(200, [{ id: 1, name: "ํ๊ธธ๋" }]);
const res = await axios.get("/users");
expect(res.data[0].name).toBe("ํ๊ธธ๋");
});
โ ์ง์ง ์๋ฒ ์์ด๋ axios ํ ์คํธ ์๋ฃ!
โ Jest + fetch-mock
fetch() ๊ธฐ๋ฐ Ajax๋ฅผ ํ ์คํธํ ๋ ์ฌ์ฉ
๐ฆ ์ค์น
npm install --save-dev jest fetch-mock
๐ ์์ ์ฝ๋
import fetchMock from "fetch-mock";
test("์ฌ์ฉ์ ๋ชฉ๋ก ๋ฐ์์ค๊ธฐ", async () => {
fetchMock.get("/api/users", [{ id: 1, name: "์ฑ์ถํฅ" }]);
const res = await fetch("/api/users");
const data = await res.json();
expect(data[0].name).toBe("์ฑ์ถํฅ");
fetchMock.restore(); // ํ
์คํธ ํ ์ด๊ธฐํ
});
โ 5. ํตํฉ ํ ์คํธ ์ ๋ต ์ค๊ณ ์์ฝ
ํ ์คํธ ๋ฒ์ | ๋๊ตฌ | ํน์ง |
---|---|---|
API ์ ๋ ํ ์คํธ | Jest + axios-mock / fetch-mock | ์๋ฒ ์์ด ๋น ๋ฅด๊ฒ ํ ์คํธ |
ํ๋ก ํธ ์๋ Mock API | Mirage.js | ๋ธ๋ผ์ฐ์ ์์ ๊ฐ๋ฐ+๋๋ฒ๊น ๊ฐ๋ฅ |
๋ก์ปฌ ํ ์คํธ ์๋ฒ | JSON Server | ์ค์ ์ฒ๋ผ ์๋ํ๋ ๊ฐ์ง ์๋ฒ |
E2E ํตํฉ ํ ์คํธ | Cypress + Stub | ์ ์ฒด ํ๋ฆ ๊ฒ์ฆ, ๋๋ฆผ |
โ ๋ฉด์ ์ง๋ฌธ ์์ + ํด์ค
โ Q. Ajax ์์ฒญ์ ํ ์คํธํ ๋ ์๋ฒ ์์ด ์ด๋ป๊ฒ ์ฒ๋ฆฌํ์๋์?
โ A.
axios-mock-adapter
๋๋fetch-mock
์ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ์์ฒญ์ Mock ์ฒ๋ฆฌํ๊ณ ,Jest
์์ ์ค์ ์๋ฒ ์์ด๋ ์๋ต์ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค.- ํ๋ก ํธ ๊ฐ๋ฐ ์ค์๋
Mirage.js
๋JSON Server
๋ฅผ ์ฌ์ฉํ์ฌ Mock API๋ฅผ ๊ตฌ์ฑํด ๋คํธ์ํฌ ์์ด ๊ฐ๋ฐ๊ณผ ํ ์คํธ๋ฅผ ๋ณํํฉ๋๋ค.
โ ์ ์ฒด ์์ฝ ์นด๋
๊ธฐ์ | ์ค๋ช |
---|---|
JSON Server | ํ์ผ ๊ธฐ๋ฐ Mock API (REST ์ง์) |
Mirage.js | ๋ธ๋ผ์ฐ์ ๋ด ๊ฐ์ ์๋ฒ (SPA ์ ์ฉ) |
axios-mock-adapter | axios๋ฅผ ์ํ ์์ฒญ ๊ฐ์ง ์ฒ๋ฆฌ ๋๊ตฌ |
fetch-mock | fetch API ๊ฐ์ง ์๋ต ์ ๊ณต |
Jest | JS ์ ๋ ํ ์คํธ ํ๋ ์์ํฌ |
Mock์ ๋ชฉ์ | ์๋ฒ ์์ด ํ ์คํธ, ์คํจ์จ ๊ฐ์, ์๋ ํฅ์ |
โ 6-3๋จ๊ณ: Ajax ์คํจ ์ฌ์๋ ์ ๋ต (Retry Pattern) ์์ ์ ๋ณต
๋คํธ์ํฌ ๋ฌธ์ ๋ ์๋ฒ ์ง์ฐ ๋๋ฌธ์ Ajax๊ฐ ์คํจํ ์ ์์ด์.
์ฌ์ฉ์๋ ์ฌ์๋ ๋ฒํผ์ ๋๋ฅด๊ธฐ ์ซ์ดํ๊ณ ,
์๋น์ค๋ ์๋์ผ๋ก ๋๋ํ๊ฒ ๋ค์ ์๋ํ ์ ์์ด์ผ ํฉ๋๋ค.
โ 1. ์ Ajax ์คํจ๋ฅผ ๋ค์ ์๋ํด์ผ ํ ๊น?
โ ์คํจํ ์ ์๋ ์ํฉ
์ํฉ | ์์ |
---|---|
์ผ์์ ์ธ ๋คํธ์ํฌ ๋๊น | ์งํ์ฒ , ํฐ๋, ์์ดํ์ด ๋ถ์์ |
์๋ฒ ์ผ์ ๊ณผ๋ถํ | ๋๋ฌด ๋ง์ ์์ฒญ์ผ๋ก ์๋ฒ ์๋ต ์ง์ฐ |
CDN ๋ฌธ์ | ์บ์ ์๋ฒ ์ผ์ ๋ค์ด |
โ ํด๊ฒฐ ์ ๋ต: ์๋ ์ฌ์๋(Retry)
- ์คํจํ๋ค๊ณ ๊ทธ๋ฅ ํฌ๊ธฐ โ
- ์๋์ผ๋ก ์ ์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์์ฒญํ๊ธฐ โญ
โ 2. ์ง์ ๋ฐฑ์คํ (Exponential Backoff)
๐ ๊ฐ๋
์์ฒญ์ด ์คํจํ ์๋ก ์ฌ์๋ ๊ฐ๊ฒฉ์ ์ ์ ๋๋ฆฌ๋ ๋ฐฉ์
๐ฆ๐ป ์ฌ์ด ์ค๋ช
๋ฒจ์ ๋๋ ๋๋ฐ ์ฌ๋์ด ์ ๋์์
โ 1์ด ๋ค ๋ค์ ๋๋ฆ โ ๊ทธ๋๋ ์์ โ 2์ด ๋ค โ 4์ด ๋คโฆ
์ ์ ์ฒ์ฒํ ์๋ํด์!
๐ฆ ์์
delay = baseDelay ร (2 ^ retryCount)
์๋ ํ์ | ๋๊ธฐ ์๊ฐ (์ด) |
---|---|
1ํ์ฐจ | 1s |
2ํ์ฐจ | 2s |
3ํ์ฐจ | 4s |
4ํ์ฐจ | 8s |
โ ๋๋ฌด ์์ฃผ ๋๋ฆฌ์ง ์์ผ๋ ์๋ฒ๋ ์์ ๋จ
โ ์ผ์์ ์ค๋ฅ๋ฉด ๋ค์์ ์ฑ๊ณตํ ๊ฐ๋ฅ์ฑ โ
โ 3. ์ต๋ ์ฌ์๋ ํ์ ์ ํ
โ ๋ฌดํ ๋ฐ๋ณตํ๋ฉด ์ ๋ผ์. ์๋ฒ๋ ํ๋ค๊ณ ๋ก๊ทธ๋ ๋์ณ์.
โ ๊ถ์ฅ ์ ๋ต
ํญ๋ชฉ | ์ค์ ์์ |
---|---|
์ต๋ ์ฌ์๋ ํ์ | 3~5๋ฒ |
์ด ์๊ฐ ์ ํ | 20์ด ์ดํ |
์คํจ ์ fallback ์ฒ๋ฆฌ | ์๋ฌ ๋ฉ์์ง or ๋ก์ปฌ ์บ์ ์ฌ์ฉ |
โ 4. ์ค์ ์์ (JavaScript)
async function fetchWithRetry(url, maxAttempts = 4, baseDelay = 1000) {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
try {
const res = await fetch(url);
if (!res.ok) throw new Error("์๋ต ์ค๋ฅ");
return await res.json(); // ์ฑ๊ณต ์ ๋ฆฌํด
} catch (err) {
if (attempt === maxAttempts - 1) throw err; // ๋ง์ง๋ง ์คํจ๋ฉด ๊ทธ๋๋ก ์๋ฌ
const delay = baseDelay * 2 ** attempt;
console.warn(`์ฌ์๋ ${attempt + 1}ํ์ฐจ... ${delay}ms ๋๊ธฐ`);
await new Promise(res => setTimeout(res, delay));
}
}
}
โ ์ฌ์๋ ์คํจ ์ ์๋ ๋ก๊ทธ
โ ์ ์ ๋์ด๋๋ ๋๊ธฐ์๊ฐ
โ ์ต๋ ํ์ ๋๊ธฐ๋ฉด ์๋ฌ ๋ฐ์
โ 5. ์คํจ ๊ธฐ๋ก + ๋ก๊น ์ ๋ต
์คํจ๊ฐ ์์๋ค๋ฉด ๋ก์ปฌ ๋ก๊ทธ ์ ์ฅ / ์๋ฒ๋ก ๋ณด๊ณ ๋ ํ์ํด์.
๐ฆ ๋ก๊น ์ ๋ต ์์
function logError(endpoint, message, status) {
fetch("/log-error", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
time: new Date().toISOString(),
endpoint,
message,
status
})
});
}
โ ์ฌ์๋ ์คํจ ํ โ ์๋ฒ๋ก ์ค๋ฅ ์ ๋ณด ์ ์ก
โ ์ด์ ์ค ๋ชจ๋ํฐ๋ง/ํต๊ณ์ ์ฌ์ฉ ๊ฐ๋ฅ
โ 6. UI/UX๋ ๊ณ ๋ คํ์
์ํฉ | ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ๊ฒ |
---|---|
์ฌ์๋ ์ค | โ์์ฒญ ์ฌ์๋ ์คโฆโ ๋ก๋ฉ ํ์ |
๊ณ์ ์คํจ | โ์ ์ ํ ๋ค์ ์๋ํด์ฃผ์ธ์.โ ๋ฉ์์ง |
์ฑ๊ณต ์ | ํ์์ฒ๋ผ ๊ฒฐ๊ณผ ์ถ๋ ฅ |
โ 7. ๋ฉด์ ์ง๋ฌธ ์์ + ํด์ค
โ Q. Ajax ์์ฒญ์ด ์คํจํ ๊ฒฝ์ฐ, ์ด๋ป๊ฒ ์ฌ์๋ ์ฒ๋ฆฌํ์๋์?
โ A.
- ์ผ์์ ์ธ ๋คํธ์ํฌ/์๋ฒ ์ค๋ฅ์ ๋๋นํด ์ง์ ๋ฐฑ์คํ ๋ฐฉ์์ผ๋ก ์ฌ์๋ํฉ๋๋ค.
- ์:
1์ด โ 2์ด โ 4์ด โ 8์ด
๋๊ธฐ ๊ฐ๊ฒฉ ์ ์ฉ - ์ต๋ 3~5ํ๋ก ์ฌ์๋ ํ์๋ฅผ ์ ํํ๊ณ , ์คํจ ์์๋ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ณ ์ฌ์ฉ์์๊ฒ ์๋ด ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
โ ์ ์ฒด ์์ฝ ์นด๋
ํญ๋ชฉ | ์ค๋ช |
---|---|
์ง์ ๋ฐฑ์คํ | ์ฌ์๋๋ง๋ค 2๋ฐฐ์ฉ ๊ธฐ๋ค๋ฆฌ๊ธฐ |
์ต๋ ํ์ ์ ํ | 3~5ํ ๊ถ์ฅ, ๋ฌดํ ๋ฃจํ ๋ฐฉ์ง |
์คํจ ๋ก๊น | ์๋ฒ์ ๊ธฐ๋ก or ์ฝ์ ์ถ๋ ฅ |
์ฌ์ฉ์ ์๋ฆผ | ์ฌ์๋ ์ํ/์คํจ ๋ฉ์์ง UI ํ์ |
์ค๋ฌด ์ ์ฉ | fetch, axios ๋ชจ๋ ์ง์ ๊ฐ๋ฅ |