** ๐8-1๋จ๊ณ: Ajax + SPA ์ํคํ ์ฒ ์ค๊ณ ์ ๋ต ์์ ์ ๋ณต **
๋จ์ํ ์นํ์ด์ง๊ฐ ์๋๋ผ, ์์ญ ๊ฐ ํ๋ฉด / ๋ณต์กํ ์ํ / SEO๊น์ง ๊ณ ๋ คํด์ผ ํ๋ ๋ํ ์๋น์ค๋ผ๋ฉด
Ajax์ SPA๋ฅผ ์ด๋ป๊ฒ ์ฐ๊ฒฐํ๊ณ ๊ด๋ฆฌํ ์ง์ ๋ํ ์ ๋ต์ด ๊ผญ ํ์ํฉ๋๋ค.
โ 1. SPA์ Ajax๋ ์ ํญ์ ๊ฐ์ด ๋ค๋๊น?
๐ฆ SPA (Single Page Application)
HTML ์ ์ฒด๋ฅผ ๋งค๋ฒ ๋ค์ ๋ฐ์ง ์๊ณ ,
ํ์ํ ๋ฐ์ดํฐ๋ง Ajax๋ก ๊ฐ์ ธ์์ ํ๋ฉด์ ๊ตฌ์ฑํ๋ ๋ฐฉ์
๐ฆ๐ป ์ฌ์ด ์ค๋ช
์๋๋ ํ์ด์ง ์ด๋๋ง๋ค ์ ์ฒด ๊ฐ์์๊ธฐ (MPA)
โ SPA๋ ํ๋ฉด์ ๊ทธ๋๋ก ๋๊ณ ํ์ํ ๋ถ๋ถ๋ง Ajax๋ก ๊ฐฑ์ !
โ 2. Ajax ๋ฐ์ดํฐ๋ ์ด๋์ ์ ์ฅํ ๊น?
โ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
๋ผ์ด๋ธ๋ฌ๋ฆฌ | ์ฌ์ฉ ํ๊ฒฝ |
---|---|
Redux | React + ๋ณต์กํ ์ํ |
Vuex | Vue ์ ์ฉ ์ ์ญ ์ํ๊ด๋ฆฌ |
Recoil | React + ๊ฐ๋จํ ์ํ / ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋ ์ฝ๊ฒ |
Zustand / Pinia | ์ ์ธ๋ ๊ฒฝ๋ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
๐ฆ ์์ ๊ตฌ์กฐ (React + Redux)
๐ฆ store
โฃ ๐ userSlice.js โ ์ฌ์ฉ์ ๊ด๋ จ Ajax + ์ํ
โฃ ๐ productSlice.js โ ์ํ ๊ด๋ จ Ajax + ์ํ
โ Redux + Ajax ์ฐ๋ ์์ (Thunk ์ฌ์ฉ)
// userSlice.js
export const fetchUser = createAsyncThunk("user/fetch", async () => {
const res = await fetch("/api/user");
return await res.json();
});
โ Ajax ์์ฒญ์ dispatch(fetchUser())
โ ๊ฒฐ๊ณผ๋ ์๋์ผ๋ก state.user.data
์ ๋ค์ด๊ฐ
โ ์ปดํฌ๋ํธ์์ useSelector
๋ก ์ฌ์ฉ
โ 3. SSR๊ณผ CSR์ ์กฐํ ์ ๋ต
๋ฐฉ์ | ํน์ง | Ajax ์์น |
---|---|---|
CSR (Client Side Rendering) | ๋ธ๋ผ์ฐ์ ์์ ๋ชจ๋ ๋ ๋๋ง | Ajax๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์คํ๋จ |
SSR (Server Side Rendering) | ์๋ฒ์์ HTML ์์ฑ ํ ์ ๋ฌ | ์๋ฒ๊ฐ Ajax ์์ฒญ ๋ฏธ๋ฆฌ ์ฒ๋ฆฌํด์ ๊ฒฐ๊ณผ๋ง ์ ์ก |
Hybrid (Next.js ๋ฑ) | ๋ ๋ค ์ฌ์ฉ (์ด๊ธฐ SSR + ์ดํ CSR) | ์ด๋ฐ์ ์๋ฒ, ์ดํ์ ํด๋ผ์ด์ธํธ Ajax ์ฌ์ฉ |
๐ฆ๐ป ์ฌ์ด ์ค๋ช
๐ฆ CSR = โ๋น ๊ป๋ฐ๊ธฐ ๋จผ์ ๋ณด์ฌ์ฃผ๊ณ , Ajax๋ก ๋ด์ฉ ์ฑ์ฐ๊ธฐโ
๐ฆ SSR = โ์๋ฒ์์ ๋ด์ฉ๊น์ง ๋ค ๋ง๋ค์ด์ ๋ฐ๋ก ๋ณด์ฌ์ฃผ๊ธฐโ
๐ง Hybrid = โ์ฒ์๋ง ๋น ๋ฅด๊ฒ ๋ณด์ฌ์ฃผ๊ณ , ์ดํ์ SPA์ฒ๋ผ ํ๋โ
โ ์ถ์ฒ ์ ๋ต
ํ์ด์ง ์ฑ๊ฒฉ | SSR ๊ถ์ฅ? | Ajax ์์น |
---|---|---|
๊ฒ์ ์์ง ์ต์ ํ ํ์ | โ SSR | ์๋ฒ์์ ๋ฏธ๋ฆฌ Ajax |
๋ก๊ทธ์ธ ํ ๊ฐ์ธํ UI | โ CSR | ๋ธ๋ผ์ฐ์ ์์ Ajax |
์๋ + SEO ๋ ๋ค ์ค์ | โ Hybrid (Next.js) | getServerSideProps + ํด๋ผ์ด์ธํธ Fetch ๋ณํ |
โ 4. Ajax ์ํ๊ด๋ฆฌ ์ ๋ต ์์ฝ
์ํฉ | ์ถ์ฒ ์ ๋ต |
---|---|
๋ก๊ทธ์ธ/์ฌ์ฉ์ ์ ๋ณด | Redux / Vuex ์ ์ญ ์ ์ฅ |
๊ธ์ฐ๊ธฐ/๋๊ธ์ฐ๊ธฐ | ์ปดํฌ๋ํธ ๋จ ๋ก์ปฌ ์ํ ๊ด๋ฆฌ |
์ํ ๋ชฉ๋ก + ํํฐ | ์ํ๊ด๋ฆฌ + Ajax ์บ์ฑ |
๋น ๋ฅธ ํ์/ํญ ์ด๋ | SWR / React Query (์๋ ์บ์ฑ, ์คํจ ์ฌ์๋ ๋ฑ) |
โ 5. ์ค๋ฌด ์ํคํ ์ฒ ์์ (Next.js + Recoil + SSR)
๐ฆ pages
โฃ ๐ index.tsx โ SSR ์ด๊ธฐ ๋ ๋๋ง
๐ฆ recoil
โฃ ๐ userAtom.ts โ ๋ก๊ทธ์ธ ์ํ ์ ์ญ ์ ์ฅ
โฃ ๐ useUserFetch.ts โ Ajax ํ
(CSR ์ ์ฉ)
๐ฆ lib
โฃ ๐ api.ts โ fetch wrapper + ๋ก๊น
ํ๋ฆ ์ค๋ช
- SSR๋ก ๊ธฐ๋ณธ ๋ฐ์ดํฐ ๋ฏธ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ
- ํด๋ผ์ด์ธํธ ์ ํ ์, Recoil๋ก ์ํ ์ ์ง
- ์ถ๊ฐ Ajax ์์ฒญ์
useFetch
ํ ์ผ๋ก ๊ด๋ฆฌ - ์๋ฌ/๋ก๋ฉ/์ฑ๋ฅ์ Sentry + Web Vitals๋ก ๊ฐ์
โ 6. ๋ฉด์ ์ง๋ฌธ ์์ + ํด์ค
โ Q. SPA ๊ธฐ๋ฐ ๋ํ ์๋น์ค์์ Ajax ์์ฒญ์ ์ด๋ป๊ฒ ๊ตฌ์กฐํํ์ญ๋๊น?
โ A.
- ์ด๊ธฐ ๋ฐ์ดํฐ๋ SSR์์ ์ฒ๋ฆฌํด SEO์ ์ด๊ธฐ์๋๋ฅผ ๋ณด์ฅํ๊ณ ,
- ์ดํ ์ธํฐ๋์ ์ ํด๋ผ์ด์ธํธ ์ธก Ajax๋ก ์ฒ๋ฆฌํฉ๋๋ค.
-
Ajax๋ก ๋ฐ์์จ ๋ฐ์ดํฐ๋ Redux/Vuex์ ๊ฐ์ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฅํ์ฌ
์ ์ญ ๊ณต์ + UI ์ผ๊ด์ฑ์ ์ ์งํฉ๋๋ค.
- React Query/SWR์ ์ฌ์ฉํ๋ฉด ์บ์ฑ + ์ฌ์๋๊น์ง ์๋ํ๋์ด ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค.
โ ์ ์ฒด ์์ฝ ์นด๋
๊ฐ๋ | ์ค๋ช |
---|---|
SPA + Ajax | ํ์ํ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์์ ํ๋ฉด ๊ตฌ์ฑ |
์ํ๊ด๋ฆฌ | Redux, Vuex, Recoil ๋ฑ๊ณผ ์ฐ๊ณ |
CSR | ๋น ํ๋ฉด ๋จผ์ , Ajax๋ก ๋ด์ฉ ์ฑ์ |
SSR | ์๋ฒ์์ Ajax ํธ์ถ โ ์์ฑ๋ HTML ์ ์ก |
Hybrid | ์ฒซ ํ๋ฉด์ SSR, ์ดํ๋ CSR Ajax |
๋ผ์ด๋ธ๋ฌ๋ฆฌ | React Query / SWR: Ajax ์บ์ฑ + ์คํจ์ฒ๋ฆฌ ์๋ํ |
โ 8-2๋จ๊ณ: Micro Frontend ํ๊ฒฝ์์์ Ajax ํต์ ๊ตฌ์กฐ ์์ ์ ๋ณต
ํ๋์ ์น์ฑ์ด ์ฌ๋ฌ ํ/๋ชจ๋๋ก ๋๋ โMicro Frontendโ ๊ตฌ์กฐ์์๋
Ajax ํต์ ๋ ๋ชจ๋๋ณ๋ก ๋ถ๋ฆฌ, ๋ณด์, ์ฑ๋ฅ ๋ถ์ฐ๊น์ง ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
โ 1. Micro Frontend๋?
๐ฆ ์ ์
ํ๋์ ์น ํ๋ก ํธ์๋๋ฅผ ์ฌ๋ฌ ๊ฐ์ ์์ ๋ ๋ฆฝ ๋ชจ๋(์ฑ)๋ก ๋๋ ์
์๋ก ๋ค๋ฅธ ํ์ด ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ/๋ฐฐํฌํ ์ ์๊ฒ ๋ง๋ ๊ตฌ์กฐ
๐ฆ๐ป ์ฌ์ด ๋น์
ํฌํธ ๋ฉ์ธ ํ๋ฉด์ ์์ํด๋ณด์ธ์:
- ์ผ์ชฝ ๋ ์จ: โ๏ธ ๋ ์จํ
- ๊ฐ์ด๋ฐ ๋ด์ค: ๐ฐ ๋ด์คํ
- ์ค๋ฅธ์ชฝ ์ผํ: ๐ ์ผํํ
โ ํ๋์ ํ์ด์ง์ง๋ง ๊ฐ ๊ธฐ๋ฅ์ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํจ
โ 2. Micro Frontend์์์ Ajax ํต์ ์ด ์ ์ด๋ ค์ธ๊น?
๋ฌธ์ | ์ค๋ช |
---|---|
์์ฒญ ์ถฉ๋ | ์ฌ๋ฌ ๋ชจ๋์ด ๊ฐ์ API์ ์ ๊ทผํ๋ฉด ์ถฉ๋ ๊ฐ๋ฅ |
์ธ์ฆ ํผ์ | ์ผ๋ถ ๋ชจ๋์ ๊ด๋ฆฌ์ ๊ถํ, ์ผ๋ถ๋ ์ฌ์ฉ์๋ง ์ ๊ทผํด์ผ ํจ |
์๋ต ์ค๋ณต | ๋์ผ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๋ชจ๋์์ ๋ฐ๋ณต ์์ฒญ ๊ฐ๋ฅ |
์บ์ ๊ณต์ ๋ฌธ์ | ๋ค๋ฅธ ๋ชจ๋์ ์๋ต์ด ๋ฎ์ด์ฐ๊ธฐ ๋ ์ ์์ |
โ ๊ทธ๋์ ๋ชจ๋ ๊ฐ ๋ถ๋ฆฌ + ๊ถํ ์ ์ด + ์บ์ ๋ ๋ฆฝ์ด ์ค์ํด์ง๋๋ค.
โ 3. ๋ชจ๋๋ณ Ajax ๊ตฌ์กฐ ์ค๊ณ ์ ๋ต
โ ํต์ฌ ์์น โ : ๊ฐ ๋ชจ๋์ ์๊ธฐ๋ง์ API Wrapper๋ฅผ ๊ฐ์ ธ์ผ ํจ
๐ฆ weather-app
โฃ ๐ api.js โ fetchWeather()
๐ฆ news-app
โฃ ๐ api.js โ fetchNews()
๐ฆ shop-app
โฃ ๐ api.js โ fetchProducts()
โ ์๋ก์ ์์ฒญ/๋ฐ์ดํฐ๋ฅผ ์นจ๋ฒํ์ง ์์
โ ์ ์ง๋ณด์ + ๋ ๋ฆฝ ๋ฐฐํฌ๋ ์ฌ์
โ ํต์ฌ ์์น โก: API ์ ๊ทผ ๊ถํ์ ์ค์ ๊ฒ์ดํธ์จ์ด or ์ธ์ฆ ์๋น์ค๋ก ๊ด๋ฆฌ
- ๊ฐ ๋ชจ๋์ ๋ก๊ทธ์ธ ํ ํฐ๋ง ๊ฐ๊ณ ์์
- ์ค์ API ๊ถํ์ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์๋ฒ์์ ๊ฒ์ฌ
- ๋ฏผ๊ฐ API์๋ ์ ๊ทผ ์ ํ (์:
/admin
,/internal
๋ฑ)
๐ ์์: ๋ชจ๋ A์์ ๊ด๋ฆฌ์ ์ ์ฉ API ์์ฒญ
fetch("/api/admin/user", {
headers: { Authorization: "Bearer userToken" }
})
โ 403 Forbidden (๊ถํ ์์)
โ ์ด๋ ๊ฒ ์ค์ ์ธ์ฆ ์์คํ ์์ ๊ถํ์ ๋ถ๋ฆฌํด์ค๋๋ค.
โ 4. Service Worker๋ก Ajax ๋ฐฑ๊ทธ๋ผ์ด๋ ๊ด๋ฆฌ
๐ฆ Service Worker๋?
๋ธ๋ผ์ฐ์ ์ ๋ฑ๋ก๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋ JS ํ๋ก๊ทธ๋จ
Ajax ์์ฒญ์ ๊ฐ๋ก์ฑ๊ฑฐ๋, ์บ์ํ๊ฑฐ๋, ์คํ๋ผ์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํจ
๐ฆ๐ป ์ฌ์ด ์ค๋ช
โ์น์ฑ์ ํ๋ฐฐ๊ธฐ์ฌโ์ฒ๋ผ, ์ฌ์ฉ์๊ฐ ์ง์ ํ๋ฉด์ ๋ณด์ง ์์๋
๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์ฒญ์ ๋์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ , ์บ์๋ ํด์ค๋๋ค.
โ Micro Frontend์์ ํ์ฉ ์์
๊ธฐ๋ฅ | ์ค๋ช |
---|---|
๊ณตํต ์์ฒญ ์บ์ฑ | /api/config , /api/user/me ๊ฐ์ ์์ฒญ์ ๊ณตํต Service Worker๊ฐ ์บ์ |
๋ชจ๋ ๊ฐ ์คํ๋ผ์ธ Ajax ๋์ | ๋ชจ๋์ด ์คํ๋ผ์ธ ์ํ์ผ ๋ ๋ฐฑ์ ์๋ต ์ ๋ฌ |
์์ฒญ ์ค๋ณต ๋ฐฉ์ง | ๋์ผํ ์์ฒญ์ Service Worker๊ฐ ํ ๋ฒ๋ง ์ฒ๋ฆฌ |
๐ฆ Ajax ์บ์ ์์ ์ฝ๋
self.addEventListener("fetch", event => {
if (event.request.url.includes("/api/")) {
event.respondWith(
caches.match(event.request).then(cached => {
return cached || fetch(event.request).then(res => {
return caches.open("ajax-cache").then(cache => {
cache.put(event.request, res.clone());
return res;
});
});
})
);
}
});
โ ๋ชจ๋๋ณ API๋ ๊ณตํต์ ์ผ๋ก ์บ์/๊ด๋ฆฌ ๊ฐ๋ฅ
โ 5. ๊ถํ ์ ์ด ์ ๋ต ์ ๋ฆฌ
์ ๋ต | ์ค๋ช |
---|---|
๋ชจ๋ ์์ฒด์์๋ ์ธ์ฆ ์ ๋ณด๋ง ์์ | ํ ํฐ ์ ์ฅ์ ๋ก์ปฌ but ๊ฒ์ฆ์ ์ค์ ์๋ฒ |
๋ฏผ๊ฐ API๋ ๋ฐฑ์๋์์ ๊ถํ ์ฌ๊ฒ์ฌ | ํ๋ก ํธ์์๋ง ๋ฏฟ์ง ๋ง๊ธฐ |
๊ฐ ๋ชจ๋์ ์ธ์ฆ ์ํ๋ฅผ ์ค์ ์ํ๋ก ๊ณต์ | ์: window.Auth ๋๋ ์ ์ญ ์ํ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ |
โ 6. ๋ฉด์ ์ง๋ฌธ ์์ + ํด์ค
โ Q. Micro Frontend ๊ตฌ์กฐ์์ Ajax ์์ฒญ์ ์ด๋ป๊ฒ ๋ถ๋ฆฌํ๊ณ ์ ์ดํ์๋์?
โ A.
- ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ ๋ ๋ฆฝ์ ์ธ API ๋ํผ๋ฅผ ๊ฐ๊ณ ,
- ์์ฒญ์ ์ค์ ์ธ์ฆ ์์คํ ์์ ํ ํฐ ๊ธฐ๋ฐ์ผ๋ก ๊ถํ ๊ฒ์ฆํฉ๋๋ค.
- ๊ณตํต์ ์ธ ์๋ต ์บ์ฑ์ด๋ ์์ฒญ ํต์ ๋ Service Worker๋ฅผ ํตํด ๋ถ์ฐ ๊ด๋ฆฌํ๋ฉฐ,
- ์์ฒญ ์ถฉ๋์ด๋ ๊ถํ ํผ์ ์ ์ค์ API Gateway์ ์ ์ฑ ์ผ๋ก ๋ฐฉ์งํฉ๋๋ค.
โ ์ ์ฒด ์์ฝ ์นด๋
๊ฐ๋ | ์ค๋ช |
---|---|
Micro Frontend | ์น์ฑ์ ์ฌ๋ฌ ๋ ๋ฆฝ ์ฑ์ผ๋ก ๋ถ๋ฆฌ |
API ๊ฒฉ๋ฆฌ | ๊ฐ ์ฑ๋ง๋ค ๊ณ ์ API Wrapper ์ด์ |
๊ถํ ๋ถ๋ฆฌ | ์ธ์ฆ์ ์ค์ ์๋ฒ์์ ์ผ๊ด ์ฒ๋ฆฌ |
Service Worker | Ajax ์์ฒญ ์บ์ฑ, ์ค๋ณต ์ ๊ฑฐ, ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฒ๋ฆฌ |
์์ฒญ ์ ์ด | ์บ์ / ๊ถํ / ์คํจ ์ fallback ์ฒ๋ฆฌ ๊ฐ๋ฅ |