๐ฌ ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ๊ฐ๋ ์ ๋ฆฌ ๋ฐ ์ฌํ ๋ถ์
1๏ธโฃ ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ๊ฐ๋ ์ ๋ฆฌ
๐ ์ ์์ ๋ชฉ์ :
๋ง์ดํฌ๋กํ๋ก ํธ์๋(Micro Frontend)๋ ์ฌ๋ฌ ๊ฐ์ ์๊ณ ๋ ๋ฆฝ์ ์ธ ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ์ ํ๋์ ๊ฑฐ๋ํ ์ฑ์ฒ๋ผ ๊ตฌ์ฑํ๋ ์ํคํ ์ฒ ์คํ์ผ์ ๋งํฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ).
๋ค์ ๋งํด, ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ๋ ์ ํ๋ก ํธ์๋์ ์ ์ฉํ์ฌ ํ๋ก ํธ์๋ ์ ์ฒด๋ฅผ ๋ถ๋ฆฌ๋ ์์ ๋จ์๋ก ๊ฐ๋ฐ/ํ ์คํธ/๋ฐฐํฌํ๋ ํจํด์ ๋๋ค.
๊ฐ๊ฐ์ ๋จ์ ์ ํ๋ฆฌ์ผ์ด์ (๋ง์ดํฌ๋ก ์ฑ)์ด ๋ ๋ฆฝ์ ์ผ๋ก ์ ๊ณต๋๊ณ , ์ด๋ฌํ ๋ง์ดํฌ๋ก ์ฑ “์กฐ๊ฐ(fragment)” ๋ค์ ์กฐํฉํ์ฌ ์ต์ข ์ฌ์ฉ์์๊ฒ๋ ํ๋์ ์ผ๊ด๋ ์น ์ฑ์ผ๋ก ๋ณด์ด๊ฒ ๋ง๋๋ ๊ฒ์ด ๋ชฉํ์ ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ) (๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ก ํ์ด์ง ๋ฐ ๋ทฐ ์์ฑ - AWS ๊ท๋ฒ์ ์ง์นจ).
์ด ๋ฐฉ์์ ํตํด ๊ฐ ํ์ ์์ ์ ๊ธฐ๋ฅ ์์ญ(feature)์ ๋-๋(end-to-end)์ผ๋ก ์ฑ
์์ง๊ณ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
์๋ก ๋ค๋ฅธ ํ์ด ๋ ๋ฆฝ์ ์ธ ์์ญ(์: ํ์ด์ง๋ ๋๋ฉ์ธ ๊ธฐ๋ฅ)์ ๋งก์, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ถํฐ UI๊น์ง ํด๋น ๋ถ๋ถ์ ์ ๋ดํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ต๋๋ค (MicroโFrontends - extending the microservice idea to frontend development).
๐ ๋ชจ๋๋ฆฌ์ ํ๋ก ํธ์๋์์ ์ฐจ์ด:
๊ธฐ์กด ๋ชจ๋๋ฆฌ์(monolithic) ํ๋ก ํธ์๋๋ ํ๋์ ๊ฑฐ๋ํ ํ๋ก ํธ์๋ ์ฝ๋๋ฒ ์ด์ค์ ๋ฐฐํฌ ๋จ์๋ฅผ ๊ฐ์ง๋ฉฐ, ์์ ๋ณ๊ฒฝ๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ฌ๋ฐฐํฌ๋ก ์ด์ด์ง๋๋ค.
๋ฐ๋ฉด ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ ๊ธฐ๋ฅ๋ณ๋ก ํ๋ก ํธ์๋๋ฅผ ์ชผ๊ฐ์ด ๊ฐ ๋ถ๋ถ์ ๊ฐ๋ณ์ ์ผ๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ์ด๋ ๊ฐ ๋ถ๋ถ๋ง๋ค ๋ค๋ฅธ ํ๋ ์์ํฌ๋ ์คํ์ ์ฌ์ฉํ๋๋ผ๋ ํ๋ฐ ๋ชจ์ ๋์์ํฌ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ์ ์ฒด ์ฑ์ ๊ตฌ์ฑํ๋ ๋ฐฉ์ ์์ฒด๋ ํ์ค ์น ๊ธฐ์ (HTML/CSS/JS)์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ).
์๋ฅผ ๋ค์ด, ํ ํ์ด์ง์ ํค๋, ์ํ ๋ชฉ๋ก, ์ฅ๋ฐ๊ตฌ๋, ์ถ์ฒ ์ํ ์น์ ๋ฑ์ ๊ฐ๊ฐ ๋ค๋ฅธ ํ์ด ๋ณ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๊ฐ๋ฐํ๊ณ , ์ต์ข ํ์ด์ง์์ ํตํฉํด๋ ์ฌ์ฉ์์๊ฒ๋ ํ๋์ ์นํ์ด์ง๋ก ๋ณด์ ๋๋ค.
๐ ์ฃผ์ ์ํคํ ์ฒ ํจํด:
๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ๊ตฌํํ๊ณ ํตํฉํ๋ ๋ฐ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ํคํ ์ฒ ํจํด์ด ์์ต๋๋ค. ํ์ด์ง ๊ตฌ์ฑ(composition) ๋ฐฉ์์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ์ ํจํด์ ๋ค ์ ์์ต๋๋ค:
- ๋น๋ ํ์ ํตํฉ: ๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก ์ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํจํค์ง๋ก ๋ง๋ ํ, ์ต์ข ์ปจํ ์ด๋(container) ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋น๋ ์์ ์ ์ด๋ค์ ๋ชจ๋ ํฌํจํ์ฌ ํ๋์ ๋ฒ๋ค๋ก ๋ง๋ ๋ ๋ฐฉ์์ ๋๋ค. ๊ตฌํ์ด ๋น๊ต์ ๋จ์ํ์ง๋ง, ์ด ์ ๊ทผ์ ๊ฐ ๋ถ๋ถ์ ์์ ํ ๋๋ง๋ค ๋ชจ๋ ๋ง์ดํฌ๋ก ์ฑ์ ๋ค์ ์ปดํ์ผ/๋ฐฐํฌํด์ผ ํ๋ ๋จ์ ์ด ์์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ๊ฒฐ๊ตญ ๋ ๋ฆฝ ๋ฐฐํฌ์ ์ด์ ์ ์ด๋ฆฌ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์, ๋ง์ดํฌ๋กํ๋ก ํธ์๋์ ์ทจ์ง์ ๋ง์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- ์๋ฒ ์ฌ์ด๋ ํ ํ๋ฆฟ ๊ตฌ์ฑ: ์๋ฒ์์ ํ์ด์ง๋ฅผ ์กฐ๋ฆฝํ๋ ๋ฐฉ์์ผ๋ก, ์ ํต์ ์ธ SSI(์๋ฒ์ฌ์ด๋ ์ธํด๋ฃจ๋)๋ ํ ํ๋ฆฟ ์์ง์ ํ์ฉํด ์ฌ๋ฌ ํ๋๊ทธ๋จผํธ(fragment) HTML์ ํฉ์ณ ์ต์ข ํ์ด์ง๋ฅผ ์์ฑํฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ด ์๋ฒ์์ HTML ์กฐ๊ฐ์ SSR(์๋ฒ์ฌ์ด๋ ๋ ๋๋ง)๋ก ์ ๊ณตํ๊ณ , ์ด๋ฅผ ์น ์๋ฒ(Nginx ๋ฑ)๋ BFF(Backend For Frontend) ๋ ์ด์ด์์ ํ๋์ HTML๋ก ํฉ์น๋ ๊ฒ์ ๋๋ค. ์ด๊ธฐ ๋ก๋ ์ ์์ฑ๋ HTML์ ๋ณด๋ด์ค ์ ์์ด SEO๋ ์ด๊ธฐ ์ฑ๋ฅ์ด ์ข์ง๋ง, ๊ตฌํ ๋ณต์ก๋๊ฐ ๋๊ณ ์๋ฒ์์์ ์กฐ๋ฆฝ ๋ก์ง์ด ํ์ํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ํตํฉ: ๋ธ๋ผ์ฐ์ ์์ ๋ฐํ์์ ๋ง์ดํฌ๋ก ์ฑ์ ๋์ ์ผ๋ก ๋ถ๋ฌ์ ์กฐํฉํ๋ ๋ฐฉ์์
๋๋ค (๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ก ํ์ด์ง ๋ฐ ๋ทฐ ์์ฑ - AWS ๊ท๋ฒ์ ์ง์นจ). ํํ ์ปจํ
์ด๋ ์
ธ(shell) ์ ํ๋ฆฌ์ผ์ด์
์ด ์กด์ฌํ์ฌ, ๊ฐ ๋ง์ดํฌ๋กํ๋ก ํธ์๋์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ์ ธ์ ์คํํ๊ณ ํด๋น DOM ์์ญ์ ๋ง์ดํธํฉ๋๋ค. ์ด๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ ๋ค์ ๋ ๊ฐ์ง๊ฐ ๋ํ์ ์
๋๋ค:
- ์์ดํ๋ ์(iframe) ํ์ฉ: ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ ์์ดํ๋ ์์ผ๋ก ๋ถ๋ฆฌํ์ฌ ์ฝ์ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ ๋ฆฝ๋ ํ์ ํ์ด์ง๋ค์ ๋ชจ์์ ํ๋์ ํ์ด์ง๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ณ , ์ ์ญ ๋ณ์๋ CSS ๊ฒฉ๋ฆฌ๋ ์๋์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ์์ดํ๋ ์์ ์ค๋ซ๋์ ์กด์ฌํด ์จ ํ์ค ๊ธฐ์ ๋ก ๊ฒฉ๋ฆฌ๋ ์๋๋ฐ์ค ํ๊ฒฝ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์, ์๋ก ๊ฐ์ญ ์์ด ์ฌ๋ฌ ์ฑ์ ํ ํ๋ฉด์ ๋ฐฐ์นํ ์ ์์ต๋๋ค (Iframes and micro-frontends).
- ์๋ฐ์คํฌ๋ฆฝํธ/์น์ปดํฌ๋ํธ ํ์ฉ: ์์ดํ๋ ์ ๋์ ์ปจํ
์ด๋๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ง์ดํฌ๋ก ์ฑ์ ๋ถ๋ฌ์ ์ง์ ์คํํ๊ฑฐ๋, ์น ์ปดํฌ๋ํธ(Custom Elements)๋ฅผ ์ฌ์ฉํด ํตํฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด Webpack 5์ Module Federation์ด๋ SystemJS๋ฅผ ์ฌ์ฉํด ๋ฐํ์์ ์๊ฒฉ ๋ชจ๋์ ๊ฐ์ ธ์ค๊ฑฐ๋, ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ ์น ์ปดํฌ๋ํธ ํํ๋ก ๋ฑ๋กํด
<micro-app>
ํ๊ทธ์ฒ๋ผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ์ด ๊ฒฝ์ฐ ์์ดํ๋ ์ ์์ด ํ๋์ DOM์์ ์ฌ๋ฌ ์ฑ์ด ๋์ํ๋ฏ๋ก, ๋ ๋งค๋๋ฌ์ด ํตํฉ๊ณผ ๋น ๋ฅธ ์ํธ์์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
๐ ์ฅ์ :
๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ ๋๊ท๋ชจ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ฌ๋ฌ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ํ ๋จ์ ๋ ๋ฆฝ ๊ฐ๋ฐ: ๊ฐ ํ์ด ํ๋ก ํธ์๋ ์ผ๋ถ๋ฅผ ์์ ํ ์์จ์ ์ผ๋ก ์์ ํ๊ณ ๊ฐ๋ฐํ ์ ์์ด, ์กฐ์ง์ ๊ธฐ๋ฅ๋ณ๋ก ์ค์ผ์ผ๋งํ๊ธฐ ์ข์ต๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies) (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ์๋ฅผ ๋ค์ด ํ ํ์ ์ํ ๋ฆฌ์คํธ, ๋ค๋ฅธ ํ์ ๊ฒฐ์ ๋ชจ๋์ ๋งก์ ๋์ ๊ฐ๋ฐํด๋ ์ถฉ๋์ด ์์ต๋๋ค. ์ด๋ ํ ์์จ์ฑ๊ณผ ์ฑ ์์ ๋์ฌ์ฃผ๋ฉฐ, ๋ฐฐํฌ ์ฃผ๊ธฐ๋ ํ๋ณ๋ก ๋นจ๋ผ์ง๋๋ค (๋ ๋ฆฝ ๋ฐฐํฌ) (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ).
- ๋ ๋ฆฝ์ ๋ฐฐํฌ ๋ฐ ๋น ๋ฅธ ๋ฆด๋ฆฌ์ค: ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งค๋ฒ ๋ฐฐํฌํ์ง ์๊ณ ๋, ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๋ฐฐํฌํ ์ ์์ผ๋ฏ๋ก ๋ฐฐํฌ ๋ฆฌ์คํฌ์ ๋ค์ดํ์์ ์ค์ ๋๋ค. ์ค์ ๋ก ์ด๋ฅผ ๋์ ํ ์ฌ๋ก์์๋ ๋ฐฐํฌ ๋น๋๊ฐ ์ 12ํ์์ ์ผ์ผ ์์ญํ๋ก ํฌ๊ฒ ์ฆ๊ฐํ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
- ๊ธฐ์ ์คํ ์์ ๋: ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ ์์ ์๊ฒ ์ต์ ์ธ ํ๋ ์์ํฌ์ ์คํ์ ์ ํํ ์ ์์ต๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies). ํ ํ์ด์ง๋ React, ๋ค๋ฅธ ํ์ด์ง๋ Vue๋ก ๊ฐ๋ฐํ๋ ์์ผ๋ก, ์ ์ฒด์ ์ผ๋ก ์ด์ง์ ์ธ ๊ธฐ์ ๋ ๊ณต์กด ๊ฐ๋ฅํฉ๋๋ค (๋ฌผ๋ก ํ ๊ฐ ํ์๋ฅผ ํตํด ์ ํํ๋ ๊ฒฝ์ฐ๋ ๋ง์ต๋๋ค). ์ด๋ฌํ ๊ธฐ์ ์ด์ข ์ฑ(heterogeneity)์ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ชจ๋ ๋ฏ์ด๊ณ ์น์ง ์๊ณ ๋ ์๋ก์ด ๊ธฐ์ ์ ๋์ ํ๊ฑฐ๋ ์คํํด๋ณผ ์ ์๊ฒ ํฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ).
- ์ ์ง์ ์ ๊ทธ๋ ์ด๋์ ์ ์ง๋ณด์ ์ฉ์ด: ๊ฑฐ๋ํ ๋จ์ผ ํ๋ก ํธ์๋๋ฅผ ๋ถ๋ถ๋ถ๋ถ ์ ์ง์ ์ผ๋ก ๊ฐํธ(migrate)ํ ์ ์์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ์๋ฅผ ๋ค์ด ๋ ๊ฑฐ์ AngularJS ํ๋ฉด์ ํ๋์ฉ React๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ์ ๋ต์ ์ทจํ ์ ์์ต๋๋ค. ๋ฉ์ธ ํ๋ ์์ํฌ๋ฅผ ํ๊บผ๋ฒ์ ๋ณ๊ฒฝํ ํ์ ์์ด ๋ถ๋ถ๋ณ ๋ฆฌํฉํ ๋ง์ด ๊ฐ๋ฅํด์ง๋ฏ๋ก, ๊ธฐ์ ๋ถ์ฑ๋ฅผ ๋จ๊ณ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ข์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ๋ํ ๊ฐ ์ฝ๋๋ฒ ์ด์ค๊ฐ ์๊ณ ์ง์ค๋์ด ์์ด ์ดํดํ๊ธฐ ์ฝ๊ณ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํฉ๋๋ค.
- ์ฑ๋ฅ์์ ์ด์ : ์ ์ค๊ณํ๋ฉด ๊ฐ ํ์ด์ง์ ํ์ํ ์ฝ๋๋ง ๋ก๋๋๋ฏ๋ก ์คํ๋ ค ์ด๊ธฐ ๋ก๋ ์ฑ๋ฅ์ด ๊ฐ์ ๋ ์ ์์ต๋๋ค (Micro Frontends). ๋ชจ๋๋ฆฌ์ SPA์์๋ ๋ชจ๋ ๊ธฐ๋ฅ์ JS๋ฅผ ํ ๋ฒ์ ๋ฐ์ง๋ง, ๋ง์ดํฌ๋กํ๋ก ํธ์๋์์๋ ํ์ด์ง๋ณ๋ก ์ฝ๋ ์คํ๋ฆฌํ ์ด ์์ฐ์ค๋ฝ๊ฒ ์ด๋ฃจ์ด์ ธ ํ์ ์ต์ํ๋ง ๋ก๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. (๋ค๋ง ์ฌ๋ฌ ๋ง์ดํฌ๋ก ์ฑ๋ค์ด ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค๋ณต์ผ๋ก ๊ฐ์ ธ์จ๋ค๋ฉด ์คํ๋ ค ๋ถ๋ฆฌํ ์ ์์ผ๋ฏ๋ก, ์ด ๋ถ๋ถ์ ์กฐ์ ์ด ํ์ํฉ๋๋ค.)
๐ ๋จ์ :
์ด๋ฌํ ์ ์ฐ์ฑ๊ณผ ๋ ๋ฆฝ์ฑ์๋ ๋๊ฐ๋ ๋ฐ๋ฆ ๋๋ค:
- ํ ๋จ์ ๋ฐ ์ค๋ณต ํฌ์: ํ๋ณ ์์จ์ฑ์ด ๋์์ง ๋๋จธ์ง ๊ฐ๊ธฐ ๋ฐฉ์์ด ๋ฌ๋ผ์ ธ ์กฐ์ง ์ ์ฒด์ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ์๋ฅผ ๋ค์ด ์๋ก ๋ค๋ฅธ ํ์ด ๊ฐ์ ๋น์ทํ ์ ํธ๋ฆฌํฐ๋ ์ปดํฌ๋ํธ๋ฅผ ์ค๋ณต ๊ตฌํํ๊ฑฐ๋, ์คํ์ผ ๊ฐ์ด๋๊ฐ ์ด๊ธ๋ ์ํ์ด ์์ต๋๋ค. ๊ณตํต๋ ๊ฐ์ด๋๋ ์ปดํฌ๋ํธ ๊ณต์ ์ ๋ต์ด ์์ผ๋ฉด ์์ ๋ฐฉ์์ ๋จํธํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ).
- ๋ฒ๋ค ํฌ๊ธฐ ์ฆ๊ฐ: ๋ ๋ฆฝ์ ์ผ๋ก ๋น๋๋ ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ ๊ณตํต ์์กด์ฑ(์: React, lodash ๋ฑ)์ด ์ค๋ณต ํฌํจ๋ ์ ์์ด ์ ์ฒด ๋ค์ด๋ก๋ ํฌ๊ธฐ(payload)๊ฐ ์ปค์ง ์ ์์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ์์ปจ๋ ๋ชจ๋ ๋ง์ดํฌ๋ก ์ฑ์ด React๋ฅผ ํฌํจํ๋ฉด ์ฌ์ฉ์๋ React๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋คํธ์ํฌ ๋น์ฉ์ ๋๋ฆฌ๊ณ ์ฑ๋ฅ์ ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค (Micro Frontends). ์ค๋ณต ์์กด์ฑ์ ์ค์ด๊ธฐ ์ํด CDN์ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Module Federation์ ๊ณต์ ๊ธฐ๋ฅ ๋ฑ์ ํ์ฉํด ๊ณตํต ๋ถ๋ถ์ ์ธ๋ถํํ๋ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ).
- ํ๊ฒฝ ๋ณต์ก๋ ๋ฐ ํตํฉ ๋น์ฉ: ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ด ๊ฐ๊ธฐ ๋ค๋ฅธ ํ๊ฒฝ์์ ๊ฐ๋ฐ๋๋ฏ๋ก, ์ ์ฒด๋ฅผ ํตํฉํ ๋ ๊ฐ๋ฐ ํ๊ฒฝ ์ฐจ์ด๋ก ์ธํ ์ด์๊ฐ ์์ ์ ์์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ๋ก์ปฌ์์ ๋ชจ๋ ๋ง์ดํฌ๋ก ์ฑ์ ๋์๋ณด๋ ๊ฒ๋ ๋ณต์กํ๋ฉฐ, ํตํฉ ํ ์คํธ, e2e ํ ์คํธ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ตฌ์ถํด์ผ ํฉ๋๋ค. ์ด์ ๋จ๊ณ์์๋ ๋ชจ๋ํฐ๋ง, ๋ฐฐํฌ ํ์ดํ๋ผ์ธ ๋ฑ์ด ์ฌ๋ฌ ๊ฐ๋ก ๋์ด๋ ์ด์/๊ฑฐ๋ฒ๋์ค ๋ณต์ก๋๊ฐ ์ฆ๊ฐํฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ์ด๋ ๊ด๋ฆฌ ์ค๋ฒํค๋๋ก ๋ํ๋๋ฏ๋ก, ์กฐ์ง์ ์ฑ์ํ DevOps ๋ฌธํ์ ์๋ํ๊ฐ ํ์ํฉ๋๋ค.
- ๋ฐํ์ ์ฑ๋ฅ ์ด์: ์๋ชป ์ค๊ณํ๋ฉด ์ด๊ธฐ ๋ก๋ ์ ์ฌ๋ฌ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๊บผ๋ฒ์ ๋ถ๋ฅด๋ ๋ฐ๋์ ์คํ๋ ค ์ฑ๋ฅ์ด ๋๋น ์ง ์ ์์ต๋๋ค. ํนํ ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ด ์๋ก ๋ค๋ฅธ ํ๋ ์์ํฌ(์: React, Angular ๋ฑ)๋ฅผ ์ด๋ค๋ฉด ํ๋ ์์ํฌ๋ณ ๋ฐํ์์ด ๋ชจ๋ ๋ก๋๋์ด ๋ฉ๋ชจ๋ฆฌ์ CPU ๋ถ๋ด์ด ์ปค์ง๋๋ค. ๋ฐ๋ผ์ ํ์ ์ด์์ผ๋ก ๊ธฐ์ ์คํ์ด ํํธํ๋์ง ์๋๋ก ์ผ์ ์์ค ์กฐ์จํ๊ฑฐ๋, ๊ณตํต ๋ฐํ์(์: Web Components ๊ธฐ๋ฐ ๋ฑ)์ ํ์ฉํ๋ ์ ๋ต๋ ๊ณ ๋ฏผํด์ผ ํฉ๋๋ค.
- ์ฌ์ฉ์ ๊ฒฝํ ํต์ผ์ฑ: ์ฌ๋ฌ ํ์ด ๋ง๋ ํ๋ฉด ์กฐ๊ฐ๋ค์ ๋ถ์ด๋ค ๋ณด๋ฉด, ๋์์ธ๊ณผ UX์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๊ฐ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๊ฐ ๋ ๋ฆฝ ๋ฐฐํฌ๋๋ฏ๋ก ์คํ์ผ ๋ณ๊ฒฝ์ด๋ ๊ณตํต UI ์์ ์ฌํญ์ด ์ ์ฒด์ ๋ฐ์๋๋ ค๋ฉด ๊ฐ ํ์ ํ์ ์ด ํ์ํฉ๋๋ค. ์ด๋ฅผ ์ํด์ ๋์์ธ ์์คํ ๊ตฌ์ถ์ด๋ ๊ณต์ฉ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ผ๊ด๋ UX๋ฅผ ๊ฐ์ ํ๋ ๋ ธ๋ ฅ์ด ์๊ตฌ๋ฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). (์: ๊ณตํต์ ๋ฒํผ, ํฐํธ, ์์ ํ๋ ํธ๋ฅผ ๋ชจ๋ ํ์ด ๊ณต์ ํ๋๋ก ํจ.)
โป ์ฐธ๊ณ : ์ ๋จ์ ๋ค์ ๊ท๋ชจ์ ์ํฉ์ ๋ฐ๋ผ ์ถฉ๋ถํ ๊ด๋ฆฌํ ์ ์๋ ์ฌํญ์ด๋ฉฐ, ์ ์ ํ ๊ด๋ฆฌ ํ์ ์ป๋ ์ด์ ์ด ๋ ํฌ๋ค๋ฉด ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ๋์ ํ๋ ๊ฒ์ด ๋ง์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ์์ ์กฐ์ง์ด๋ ๋จ์ผ ํ์์ ๊ด๋ฆฌํ ์ ์๋ ์๋น์ค๋ผ๋ฉด ๊ตณ์ด ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ก ๋ณต์ก์ฑ์ ๋์ผ ํ์๊ฐ ์์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ํ์ง๋ง ์๋น์ค๊ฐ ๋ฐฉ๋ํด ์ฌ๋ฌ ํ์ด ๋ณ๋ ฌ ๊ฐ๋ฐํด์ผ ํ๊ณ , ๋ถ๋ถ๋ณ๋ก ๋ฆด๋ฆฌ์ฆ ์ฃผ๊ธฐ๊ฐ ๋ฌ๋ผ์ผ ํ๋ ๋ฑ์ ์๊ตฌ๊ฐ ์๋ค๋ฉด ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ ํฐ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
2๏ธโฃ ์ฌํ ๋ด์ฉ
๐ ๋ง์ดํฌ๋ก์ฑ ํ๋๊ทธ๋จผํธ์ ๋ผ์ดํธ DOM, ๊ทธ๋ฆฌ๊ณ ์์ผ๋๋ ์ํคํ ์ฒ
๐งฉ ๋ง์ดํฌ๋ก์ฑ ํ๋๊ทธ๋จผํธ๋?
๊ฐ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๊ฐ ์ต์ข ํ์ด์ง์ ์ ๊ณตํ๋ ์ผ๋ถ๋ถ์ DOM ์กฐ๊ฐ์ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ํ๋์ ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ ํค๋, ๋ณธ๋ฌธ, ์ฌ์ด๋๋ฐ๊ฐ ๊ฐ๊ฐ ๋ณ๊ฐ์ ๋ง์ดํฌ๋ก ์ฑ์ด๋ผ๋ฉด, ์ต์ข HTML์์๋ ์ด๋ค์ด ๊ฐ๊ฐ ์์ ์ ์์น์ ์ฝ์ ๋ DOM ํ๋๊ทธ๋จผํธ(fragment) ๋ก ์กด์ฌํ๊ฒ ๋ฉ๋๋ค (๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ก ํ์ด์ง ๋ฐ ๋ทฐ ์์ฑ - AWS ๊ท๋ฒ์ ์ง์นจ).
์ด๋ฌํ ํ๋๊ทธ๋จผํธ๋ค์ ์ปจํ ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ๋์ ์ผ๋ก ๋ก๋๋์ด ์ฝ์ ๋๊ฑฐ๋(ํด๋ผ์ด์ธํธ ํตํฉ), ์๋ฒ์์ ๋ฏธ๋ฆฌ ์กฐํฉ๋ ์๋ ์์ต๋๋ค. ๊ฐ ๋ง์ดํฌ๋ก ์ฑ ํ๋๊ทธ๋จผํธ๋ ์๊ธฐ ์๊ฒฐ์ ์ธ UI์ ๊ธฐ๋ฅ์ ์ง๋๋ฉฐ, ๋ค๋ฅธ ํ๋๊ทธ๋จผํธ์๋ ๋์จํ๊ฒ ๊ฒฐํฉ๋ฉ๋๋ค.
๐งฉ ๋ผ์ดํธ DOM(Light DOM) ์ด๋?
Web Component ์ฉ์ด์์ ๋์ค๋ ๊ฐ๋ ์ผ๋ก, ๊ธฐ๋ณธ ๋ฌธ์ DOM ํธ๋ฆฌ์ ์ํ๋ ์์๋ค์ ๋งํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ปค์คํ
์น ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๋ฉด ๋ด๋ถ์ Shadow DOM์ ๋ถ์ฌ์ ์คํ์ผ๊ณผ ๊ตฌํ์ ์บก์ํํ ์ ์๋๋ฐ, Shadow DOM์ ์ฐ์ง ์๊ณ ๊ณง๋ฐ๋ก ๋ฌธ์์ ์ผ๋ฐ DOM์ ๋ด์ฉ์ด ๋ ๋๋ง๋๋๋ก ํ๋ฉด ๊ทธ๊ฒ์ “Light DOM” ๋ฐฉ์์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค (5 Client-side Composition - Micro Frontends in Action).
๋ง์ดํฌ๋กํ๋ก ํธ์๋์์ Web Component๋ฅผ ํ์ฉํ ๋, Shadow DOM์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ํด๋น ๋ง์ดํฌ๋ก ์ฑ์ ์์๋ค์ด ์ ์ญ DOM์ ๊ทธ๋๋ก ํฌํจ๋๋ฏ๋ก(= Light DOM), ๋ค๋ฅธ ๋ง์ดํฌ๋ก ์ฑ๋ค๊ณผ ํ ๋ฌธ์ ํธ๋ฆฌ ์์์ ์์ด๊ฒ ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด <micro-app-header>
๋ผ๋ ์ปค์คํ
์๋ฆฌ๋จผํธ๋ฅผ Shadow DOM ์์ด ๊ตฌํํ๋ฉด, ๊ทธ ๋ด๋ถ HTML์ด ๋ฉ์ธ ํ์ด์ง DOM์ ํ๋ฒํ ์ผ๋ถ๋ถ์ผ๋ก ๋ค์ด๊ฐ๋๋ค. Light DOM์ ์ฌ์ฉํ๋ฉด ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ด ์ ์ญ ์คํ์ผ์ ํจ๊ป ๊ณต์ ํ๊ฑฐ๋ SSR๋ ์ฝํ
์ธ ๋ฅผ ๊ทธ๋๋ก ํ์ฉํ ์ ์์ง๋ง, ๋ฐ๋๋ก ์ ์ญ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ๋์์ง๋ฏ๋ก ์ ํ์ ์ผ๋ก ํ์ฉํฉ๋๋ค (Building a Micro-frontend Framework | Toptal®).
๐งฉ ์์ผ๋๋ ์ํคํ ์ฒ(Island Architecture) ๋?
์ต๊ทผ ์ฃผ๋ชฉ๋ฐ๋ ํ๋ก ํธ์๋ ์ฑ๋ฅ ์ต์ ํ ํจํด์ผ๋ก, ํ์ด์ง ๋๋ถ๋ถ์ ์ ์ HTML๋ก ๋ ๋๋งํ๊ณ ์ผ๋ถ ์ํธ์์ฉ์ด ํ์ํ ์์ญ๋ง ์ ํ์ ์ผ๋ก JS๋ฅผ ๋ก๋ํ๋ ๋ฐฉ์์ ๋๋ค.
์๋ฒ์์ ์์ ํ HTML์ ์์ฑํ๋, ๋์ ์ผ๋ก ๋์ํด์ผ ํ๋ ์์ ฏ ์๋ฆฌ์ placeholder๋ ์ฌ๋กฏ์ ์ฝ์ ํด ๋ก๋๋ค (Islands Architecture). ๊ทธ๋ฐ ๋ค์ ํด๋ผ์ด์ธํธ์์๋ ํด๋น ์์ญ์ ๋์๋๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ก๋ํ์ฌ ๊ธฐ์กด ์๋ฒ ์ถ๋ ฅ HTML์ ๋ฐ๋ก “ํ์ด๋๋ ์ด์ (ํ์ฑํ)” ํจ์ผ๋ก์จ ์ ์ฒด ํ์ด์ง ์ค ์ผ๋ถ๋ง ์ธํฐ๋ํฐ๋ธํ๊ฒ ๋ง๋ญ๋๋ค (Islands Architecture). ์ฌ๋ฌ ๊ฐ์ ์์ ๋ ๋ฆฝํ ์์ ฏ(์ฌ๋ค)์ด ์ ์ ํ์ด์ง ์์ ๋ฐํ ์๋ ํํ์ฌ์ “์์ผ๋๋”(์ฌ)๋ผ๋ ์ด๋ฆ์ด ๋ถ์์ต๋๋ค.
ํ๋ฉด์ ์ผ๋ก ๋ณด๋ฉด ์์ผ๋๋ ์ํคํ
์ฒ๋ ๋ง์ดํฌ๋กํ๋ก ํธ์๋์ ์ ์ฌํ๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค.
๋ ๋ค ์ ํ๋ฆฌ์ผ์ด์
์ ์ชผ๊ฐ ๋
๋ฆฝ์ ๋จ์๋ก ๋๋๋ค๋ ์ ์ ๊ณตํต์ผ๋ก ๊ฐ๊ธฐ ๋๋ฌธ์
๋๋ค (Islands Architecture). ๊ทธ๋ฌ๋ ๊ทผ๋ณธ ๋ชฉ์ ๊ณผ ๊ตฌ์ฑ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ ํ๋ณ ๋
๋ฆฝ ๋ฐฐํฌ์ ์ฝ๋ ๋ชจ๋ํ์ ์ด์ ์ ๋ ์ํคํ
์ฒ ์คํ์ผ์ด๊ณ , HTML์ ํตํ ๊ตฌ์ฑ์ ํ์๋ ์๋๋๋ค (Islands Architecture).
์ฆ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ CSR์ด๋ SSR์ด๋ ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ์กฐํฉ์ด ๊ฐ๋ฅํ๋ฉฐ, ์ฃผ๋ก ์ํคํ ์ฒ์ ๋ถ๋ฆฌ์ ๊ฐ์น๋ฅผ ๋ก๋๋ค. ๋ฐ๋ฉด ์์ผ๋๋ ์ํคํ ์ฒ๋ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๊ณ ์๋ ํจํด์ผ๋ก, SSR๋ ์ ์ ์ฝํ ์ธ + ๋ถ๋ถ์ ํ์ด๋๋ ์ด์ ์ด๋ผ๋ ํน์ ๊ธฐ๋ฒ์ ์ง์นญํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ผ๋๋ ํจํด์ ํ๋์ ํ์ด ๋ง๋ SPA์์๋ ์ฌ์ฉํ ์ ์๋ ๋ ๋๋ง ๊ธฐ๋ฒ์ ๋๋ค.
๐งฉ ๋ ์ ๊ทผ ๋ฐฉ์์ ์ฐ๊ด์ฑ:
๋ง์ดํฌ๋กํ๋ก ํธ์๋์ ์์ผ๋๋ ์ํคํ ์ฒ๋ ์ํธ ๋ฐฐํ์ ์ธ ๊ฒ์ด ์๋๋ผ, ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ณด์์ ์ผ๋ก ๊ฒฐํฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ฐ ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์์ฒด๋ฅผ ์์ผ๋๋ ํจํด์ผ๋ก ๊ตฌํํ๋ฉด, ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ด SSR๋ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๊ณ ํ์ํ ๊ฒฝ์ฐ์๋ง ํด๋ผ์ด์ธํธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ก๋ํ๋๋ก ๋ง๋ค์ด ์ฑ๋ฅ์ ๊ทน๋ํํ ์ ์์ต๋๋ค.
์ค์ ๋ก Cloudflare Workers ๋ฑ์ ํ์ฉํ์ฌ ๋ ๊ฑฐ์ SPA์ ์ผ๋ถ ํ๋ฉด์ SSR ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์กฐ๊ฐ์ผ๋ก ๊ต์ฒดํจ์ผ๋ก์จ, ์ด๊ธฐ ๋ก๋ ์ฑ๋ฅ๊ณผ SEO๋ฅผ ๊ฐ์ ํ ์ฌ๋ก๊ฐ ์์ต๋๋ค (Incremental adoption of micro-frontends with Cloudflare Workers).
์์ฝํ๋ฉด, ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ ์กฐ์ง์ /๊ธฐ๋ฅ์ ๋ถํ ๊ฐ๋ ์ด๊ณ , ์์ผ๋๋ ์ํคํ ์ฒ๋ ํ์ด์ง ๋ ๋๋ง ์ต์ ํ ๊ธฐ๋ฒ์ด์ง๋ง ๋ชจ๋ “ํ์ด์ง๋ฅผ ์กฐ๊ฐ๋ค์ ๋ชจ์”์ผ๋ก ๋ณธ๋ค๋ ์ฒ ํ์ ๊ณต์ ํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค. ์ ์ ํ ๊ฒฐํฉํ๋ฉด ๋ ๋ฆฝ ๋ฐฐํฌ์ ์ด์ ๊ณผ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ๋์์ ์ถ๊ตฌํ ์ ์์ต๋๋ค.
๐ ์์ดํ๋ ์ vs ์น ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ ๋จ๊ณ๋ณ ํตํฉ
๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ์ค์ ๋ก ๋์ ํ ์ด๊ธฐ์ ์์ดํ๋ ์ ๊ธฐ๋ฐ ํตํฉ(1๋จ๊ณ) ์ ์ฌ์ฉํ๊ณ , ์ดํ ์น ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ํตํฉ(2๋จ๊ณ) ์ผ๋ก ์ ํํ ์ฌ๋ก๊ฐ ๋ง์ต๋๋ค. ๋ ์ ๊ทผ์ ์ฐจ์ด์ ๋จ๊ณ๋ณ ์ฅ๋จ์ ์ ๋น๊ตํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๐งฉ 1๋จ๊ณ – ์์ดํ๋ ์ ํ์ฉ: ์์ดํ๋ ์์ ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ ์์ ํ ๊ฒฉ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ์ปจํ ์คํธ์์ ์คํ์ํต๋๋ค.
- ์ฅ์ : ์์ดํ๋ ์์ ๊ฒฉ๋ฆฌ๋ ์๋๋ฐ์ค์ด๋ฏ๋ก, ๋ค๋ฅธ ๋ง์ดํฌ๋ก ์ฑ๊ณผ ์ ์ญ JS/CSS ์ถฉ๋ ์์ด ๋์ํฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ
์ณ). ์๋ก ๋ค๋ฅธ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์จ๋ ๋ฌธ์ ๊ฐ ์๊ณ , ๋ง์ฝ ํ ๋ง์ดํฌ๋ก์ฑ์ด ์น๋ช
์ ์ค๋ฅ๋ก ์ฃฝ์ด๋ ๋ค๋ฅธ ๋ถ๋ถ์ ์ง์ ์ํฅ์ด ๋ ๊ฐ ๋งํผ ์์ ์ฑ์ด ๋์ต๋๋ค. ๋ํ ๋ง์ดํฌ๋ก ์ฑ์ ๋ฐฐํฌํ ๋ ๊ทธ๋ฅ ์๋ก์ด URL์ ์ฌ๋ฆฌ๋ฉด ๋๋ฏ๋ก ๋ฐฐํฌ์ ์ด์์ด ๋จ์ํฉ๋๋ค. ์ปจํ
์ด๋๋ ํด๋น URL์ ์์ดํ๋ ์
src
๋ก ๊ฐ๋ฆฌํค๊ธฐ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์, ํด๋ฆฌ๊ธ๋ ๊ธฐ์ ์คํ๋ ์์ฉํ๊ธฐ ์ฝ์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ด๊ธฐ ๋ง์ด๊ทธ๋ ์ด์ ์ฉ์ด์ฑ์ด ๋์, ๊ธฐ์กด ๋ชจ๋๋ฆฌ์ ์ผ๋ถ ํ์ด์ง๋ฅผ ์์ดํ๋ ์์ผ๋ก ์๋ก ๊ฐ๋ฐํ ๋ง์ดํฌ๋ก์ฑ์ผ๋ก ๊ต์ฒดํ๋ ์์ผ๋ก ์ ์ง์ ๋์ ์ ํ ๋ ์ ํฉํฉ๋๋ค. - ๋จ์ : ์์ดํ๋ ์์ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๊ณ ํตํฉ์ด ์ด์ํ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ
์ณ). ์ฐ์ ๋ผ์ฐํ
์ฐ๊ณ๊ฐ ์ด๋ ต์ต๋๋ค. ๋ฉ์ธ ํ์ด์ง์ URL๊ณผ ์์ดํ๋ ์ ๋ด๋ถ์ URL ์ํ๊ฐ ๋ถ๋ฆฌ๋๋ฏ๋ก, ๊น์ ๋งํฌ(deep-link)๋ ์๋ก๊ณ ์นจ ์ ์ํ ์ ์ง ๋ฑ์ ์ถ๊ฐ ์์
์ด ํ์ํฉ๋๋ค (Building a Micro-frontend Framework | Toptal®). ๋ธ๋ผ์ฐ์ ์ ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ผ๋ก ์ด์ ์ํ๋ฅผ ๊ฐ๋ ค๋ฉด ์์ดํ๋ ์ ๋ด๋ถ์์ postMessage๋ก ๋ถ๋ชจ์๊ฒ ์๋ ค์ฃผ๋ ๋ฑ์ ๋ณต์กํ ๋ก์ง์ด ํ์ํ๊ณ , history ๊ด๋ฆฌ๊ฐ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ
์ณ). ๋ํ ์์ดํ๋ ์ ํฌ๊ธฐ ์กฐ์ ๋ฐ ๋ฐ์ํ ๋์์ธ ๋์์ด ๊น๋ค๋กญ์ต๋๋ค (Iframes and micro-frontends) (Building a Micro-frontend Framework | Toptal®). ๋ถ๋ชจ ๋ฌธ์์ CSS๊ฐ ๊ฒฉ๋ฆฌ๋์ด ์์ด ๋ ์ด์์์ ๋ง์ถ๋ ค๋ฉด ๋ฉ์์ง ์ ๋ฌ์ด๋
window.resize
์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฑ ๋ณ๋์ ์กฐ์จ์ด ํ์ํฉ๋๋ค. ์ฑ๋ฅ ์ธก๋ฉด์์๋ ์์ดํ๋ ์์ ๊ฐ๊ฐ ๋ณ๋์ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, ์์ดํ๋ ์ ๊ฐ์๊ฐ ๋ง์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฌ์ฉ์ด ์ฆ๊ฐํฉ๋๋ค. ์ด๊ธฐ ๋ก๋ ์ ๋คํธ์ํฌ ์์ฒญ๋ ์์ดํ๋ ์๋ณ๋ก ๋ณ๋๋ก ๋ฐ์ํ๋ฏ๋ก ๋ค์ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก, ๋๋ฉ์ธ์ด ๋ค๋ฅผ ๊ฒฝ์ฐ ๋ก๊ทธ์ธ ์ธ์ ์ด๋ ์ฟ ํค ๊ณต์ ๊ฐ ๋ฐ๋ก ์ ๋๊ณ CORS ์ ์ฝ์ผ๋ก ๋ง์ดํฌ๋ก์ฑ ๊ฐ ํต์ ์ด ์ ํ๋ฉ๋๋ค (Building a Micro-frontend Framework | Toptal®). ์ด๋ฌํ ํต์ ์postMessage
API ๊ฐ์ ๊ฒ์ ํตํด ์ฐํํด์ผ ํ๋ฏ๋ก ๊ตฌํ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํฉ๋๋ค (Iframes and micro-frontends).
๐งฉ 2๋จ๊ณ – ์น ์ปดํฌ๋ํธ/์๋ฐ์คํฌ๋ฆฝํธ ํ์ฉ: ์์ดํ๋ ์ ๋ฐฉ์์ ํ๊ณ๋ฅผ ๋๋ ํ์๋, ๋ณดํต Shadow DOM ์๋ Web Component(๋๋ Light DOM ์ํ์ Custom Element) ๊ธฐ๋ฐ ํตํฉ์ด๋ Module Federation ๋ฑ์ ํ์ฉํ ์ง์ ํตํฉ์ผ๋ก ๋ฐ์ ํ๊ฒ ๋ฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ).
- ์ฅ์ : ์์ดํ๋ ์์ ์ ๊ฑฐํ๊ณ ํ๋์ ํ์ด์ง์์ ํตํฉํ๋ฉด, ์ฌ์ฉ์ ๊ฒฝํ์ด ๋งค๋๋ฌ์์ง๊ณ ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค. ๋์ผํ ํ์ด์ง์์ ๋ง์ดํฌ๋ก ์ฑ๋ค์ ๋ก๋ํ๋ฏ๋ก ๋คํธ์ํฌ ์์ฒญ ์๊ฐ ์ค๊ณ , ์์๋ ๊ณต์ ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ ์ ์ ํ์ผ๋ค์ ํ๋์ ๋๋ฉ์ธ CDN์์ ์ ๊ณตํ๋ฉด ๋ธ๋ผ์ฐ์ ์บ์๋ฅผ ๊ณต์ ํด ์ค๋ณต ๋ก๋๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. ๋ํ UI ์ํธ์์ฉ๋ ๋ถ๋ชจ-์์ ๊ฐ ์ง์ ํจ์ ํธ์ถ์ด๋ ์ปค์คํ
์ด๋ฒคํธ๋ก ๊ฐ๋ฅํด์ ธ, ์์ดํ๋ ์๋ณด๋ค ๋ง์ดํฌ๋ก ์ฑ ๊ฐ ์ํต์ด ์ฌ์์ง๋๋ค. ์น ์ปดํฌ๋ํธ๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ, ๋ธ๋ผ์ฐ์ ๋ค์ดํฐ๋ธ ๊ธฐ์ ๋ก ์บก์ํ๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ๋น๊ต์ ํ์คํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํตํฉ์ด ์ด๋ค์ง๋๋ค (Micro Frontends). ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ด ์์ ์ Custom Element๋ฅผ ์ ์ํด๋๋ฉด, ์ปจํ
์ด๋๋ ๋จ์ํ
<micro-app-foo></micro-app-foo>
ํ๊ทธ๋ฅผ ์ฝ์ ํ๋ ๊ฒ๋ง์ผ๋ก ํด๋น ์ฑ์ ๋ ๋๋งํ ์ ์์ต๋๋ค. Shadow DOM์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ ์คํ์ผ๊ณผ ๋งํฌ์ ์ ์บก์ํํ์ฌ ๋ค๋ฅธ ์ฑ๊ณผ ์คํ์ผ ์ถฉ๋์ ์์ฒ ์ฐจ๋จํ ์ ์๊ณ , ์ฌ์ฉํ์ง ์๋๋ผ๋ ์ ์ ํ ๋ค์ด๋ฐ ๋ฐ CSS ์ค์ฝํ์ผ๋ก ์ถฉ๋์ ํผํ๋ฉด์ ์ ์ญ ์คํ์ผ ์ํธ๋ฅผ ๊ณต์ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ์ข ํฉํ๋ฉด, ์ด ๋จ๊ณ์์๋ ํ๋์ SPA์ ๊ฐ๊น์ด ์ผ์ฒด๊ฐ์ ์ฃผ๋ฉด์๋ ์ฝ๋ ๊ตฌ์กฐ๋ ๋ถ๋ฆฌ๋ ์ด์์ ์ธ ํํ๋ฅผ ์ถ๊ตฌํ๊ฒ ๋ฉ๋๋ค. - ๋จ์ : ์น ์ปดํฌ๋ํธ/์ง์ ํตํฉ ๋ฐฉ์์ ์์ดํ๋ ์์ ๋นํด ๊ฒฉ๋ฆฌ ์์ค์ด ๋ฎ์ ๊ทธ๋งํผ ํ ๊ฐ ์กฐ์จ์ด ํ์ํฉ๋๋ค. ์ ์ญ ๋ค์์คํ์ด์ค ์ถฉ๋์ ํผํ๊ธฐ ์ํด ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ ์ ์ญ ๋ณ์, CSS ํด๋์ค ๋ค์ด๋ฐ ๋ฑ์ ์ฝ์์ด ํ์ํ๊ณ (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ), ๋น๋ ํ๊ฒฝ๋ ์๋ก ํธํ๋๊ฒ ๋ง์ถฐ์ผ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋ ๋ง์ดํฌ๋ก ์ฑ์ด ๋์ผํ ๋ฒ์ ์ ํ๋ ์์ํฌ๋ฅผ ์จ์ผ ํ๊ฑฐ๋, ๊ณตํต์ผ๋ก ์ฌ์ฉํ ํจํค์ง๋ค์ ๋ฒ์ ์ ์กฐ์ ํ๋ ๋ฑ ์๋ฌต์ ๊ณ์ฝ์ด ์๊ธธ ์ ์์ต๋๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ด๋ฌํ ์์กด์ฑ ์กฐ์ ์ ์ํด ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๋์ ํ๊ฑฐ๋, Module Federation์ผ๋ก ๊ณต์ ๋ชจ๋์ ์ง์ ํ๋ ๋ฑ์ ์ถ๊ฐ ์์ ์ด ํ์ํฉ๋๋ค. ๋ํ ๊ตฌํ ๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฌธ์ ๊ฐ ์์ ์ ์๋๋ฐ, Custom Elements์ Module Federation์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ฃผ์ด๋ฏ๋ก IE11 ๊ฐ์ ๊ตฌ๋ฒ์ ์ ์ง์ํด์ผ ํ๋ฉด ํด๋ฆฌํ์ด๋ ๋ณ๋ ๋์์ด ํ์ํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก, ์น ์ปดํฌ๋ํธ ๋ฐฉ์์ผ๋ก ์ ํํ๋ ค๋ฉด ์ด๊ธฐ ์์ดํ๋ ์ ํตํฉ๋ณด๋ค ๊ตฌํ ๋์ด๋๊ฐ ๋์ ์ ์๊ณ , ๊ฐ ํ ๊ฐ๋ฐ์๋ค์ด ์น ์ปดํฌ๋ํธ๋ ์๋ก์ด ๋น๋ ๋๊ตฌ์ ๋ํ ํ์ต์ด ํ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ง์ ๊ธฐ์ ๋ค์ด ๊ฒฐ๊ตญ ์ด ๋ฐฉํฅ์ผ๋ก ์ ํํ์ฌ ์์ดํ๋ ์์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ ์์ต๋๋ค.
โป ๋ณด์ถฉ: ์ค์ ์ฌ๋ก๋ฅผ ๋ณด๋ฉด, Spotify๋ ๋ฐ์คํฌํ ์น ํ๋ ์ด์ด๋ฅผ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ก ๊ฐํธํ๋ฉด์ ์ด๊ธฐ์๋ ์์ดํ๋ ์+์ด๋ฒคํธ ๋ฒ์ค ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ต๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies). ์ด๋ ๋น ๋ฅธ ํ ๋ณ๋ ฌ์์ ์๋ ์ฑ๊ณต์ ์ด์์ง๋ง, ์ดํ ์ฑ๋ฅ๊ณผ ์ผ๊ด์ฑ์ ์ํด ์ ์ฐจ ํตํฉ์ ๊ฐ์ ํ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค. ๋ฐ๋ฉด Capital One ๋ฑ์ ์ฌ๋ก์์๋ ์ฒ์๋ถํฐ App Shell ๋ด์์ ๋ค์ค ๋ง์ดํฌ๋ก ์ฑ์ ๋์ ์ผ๋ก ๋ก๋ํ๋ ์ ๊ทผ(์ฌ์ค์ ์น ์ปดํฌ๋ํธ์ ๊ฐ๊น์ด ํตํฉ)์ ํํด ์ฑ๊ณต์ ์ผ๋ก ์์ญ ๊ฐ ํ์ด ๋์์ ์์ ํ๊ณ ์๋ฐฐ ๋นจ๋ผ์ง ๋ฆด๋ฆฌ์ค ์ฃผ๊ธฐ๋ฅผ ๋ฌ์ฑํ๊ธฐ๋ ํ์ต๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies).
๐ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ ํตํ CORS ๋ฌธ์ ํด๊ฒฐ
๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ๋์ ํ๋ฉด ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ด ๊ฐ๊ฐ์ ๋๋ฉ์ธ ๋๋ ๊ฒฝ๋ก์์ ์ ๊ณต๋ ์ ์๋๋ฐ, ์ด๋ ๋ธ๋ผ์ฐ์ ์ ๋์ผ ์ถ์ฒ ์ ์ฑ (SOP) ๋๋ฌธ์ CORS(Cross-Origin Resource Sharing) ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ฉ์ธ ์ฑ์ด example.com
์ด๊ณ , ์ด๋ค ๋ง์ดํฌ๋ก ์ฑ์ mf.examplecdn.com
์์ ๋ถ๋ฌ์จ๋ค๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ๊ต์ฐจ ์ถ์ฒ๋ก ๊ฐ์ฃผํ์ฌ ๋ฆฌ์์ค ๋ก๋๋ Ajax ํธ์ถ ์ ์ ํ์ ๊ฒ๋๋ค. ๊ฐ๊ฐ์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋ API๊ฐ ๋ค๋ฅธ ์๋ธ๋๋ฉ์ธ์ด๋ ํธ์คํธ์ ์๋ค๋ฉด ์ธ์ฆ ์ฟ ํค ์ ์ก์ด๋ ๋ฐ์ดํฐ ์์ฒญ์ ์ด๋ ค์์ด ์๊ธธ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ด ๋ฆฌ๋ฒ์ค ํ๋ก์(reverse proxy) ๊ตฌ์ฑ์ ๋๋ค. ๋ฆฌ๋ฒ์ค ํ๋ก์๋ ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ์ ๋ฐฑ์๋์ ๋ค๋ฅธ ์๋น์ค๋ก ์ ๋ฌํ๊ณ ์๋ต์ ๋ค์ ์ฌ์ฉ์์๊ฒ ๋๋ ค์ฃผ๋ ์ค๊ฐ ์๋ฒ์ ๋๋ค.
๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ
์ฒ์์๋ ์ปจํ
์ด๋ ๋๋ CDN ๋ ์ด์ด์์ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ ํ์ฉํ์ฌ ๋ชจ๋ ๋ง์ดํฌ๋ก ์ฑ์ ํ ๊ฐ์ง ์ฃผ ๋๋ฉ์ธ์ผ๋ก ๋
ธ์ถ์ํค๋ ์ ๋ต์ ์ทจํฉ๋๋ค. ์๋ฅผ ๋ค์ด, example.com/app1
๊ฒฝ๋ก๋ ์ค์ ๋ก๋ ๋ง์ดํฌ๋ก์ฑ1 ์๋ฒ๋ก ํ๋ก์ํ๊ณ , example.com/app2
๋ ๋ง์ดํฌ๋ก์ฑ2 ์๋ฒ๋ก ํ๋ก์ํ๋๋ก ์น ์๋ฒ๋ CDN๋ฅผ ์ค์ ํ๋ ๊ฒ์
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ธ๋ผ์ฐ์ ์
์ฅ์์๋ ๋ชจ๋ ์์์ด ๋์ผํ example.com
์ถ์ฒ์์ ์ค๋ ๊ฒ์ผ๋ก ์ธ์๋๊ธฐ ๋๋ฌธ์ CORS ํค๋๋ฅผ ๋ณ๋๋ก ๋ง์ถ์ง ์์๋ ๋ฌธ์ ๋ฅผ ์ฐํํ ์ ์์ต๋๋ค (Building a Micro-frontend Framework | Toptal®).
๊ตฌ์ฒด์ ์ผ๋ก, Nginx ์ค์ ์์ ๊ฐ ๊ฒฝ๋ก๋ณ๋ก proxy_pass
๋ฅผ ํด์ฃผ๊ฑฐ๋, ํด๋ผ์ฐ๋ ํ๊ฒฝ์์๋ AWS API Gateway/Lambda@Edge, Cloudflare Workers ๋ฑ์ ๋ ์ด์ด์์ host๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ ์์
๋๋ค.
Reverse proxy์ ํจ๊ณผ ๋ก ๋ง์ดํฌ๋ก ์ฑ๋ค์ด ์ด๋์์ ์๋น์ค๋๋์ง ๊ฐ์ถฐ์ง๊ณ , ๋ณด์์์ผ๋ก๋ ๋ด๋ถ ์ํคํ ์ฒ๊ฐ ๋ ธ์ถ๋์ง ์๋ ์ฅ์ ์ด ์์ต๋๋ค (Building a Micro-frontend Framework | Toptal®).
๋ํ ๋ชจ๋ ์์ฒญ์ ํ ๋๋ฉ์ธ์ผ๋ก ๋ชจ์ผ๋ฏ๋ก ์ธ์ ์ฟ ํค๋ ๊ณต์ ๋๋ฉฐ, Content Security Policy(CSP) ํค๋ ๊ด๋ฆฌ๋ ๋จ์ํ๋ฉ๋๋ค (Microfrontends in Depth: Part 3 of * | by Luis Atencio | Medium) (Building a Micro-frontend Framework | Toptal®).
๋ค๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ ๋ง์ดํฌ๋ก ์๋น์ค์์ CORS ํ์ฉ ํค๋(์: Access-Control-Allow-Origin: *
๋๋ ํน์ ๋๋ฉ์ธ)๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ์๋น์ค ์๊ฐ ๋ง์์ง๋ฉด ๊ด๋ฆฌ๊ฐ ๋ฒ๊ฑฐ๋กญ๊ณ ๋ณด์ ์ด์๊ฐ ์์ ์ ์์ต๋๋ค.
ํนํ ์ธ์ฆ ์ฟ ํค๋ SameSite
์ ์ฑ
๋ฑ์ผ๋ก ์ธํด ๋๋ฉ์ธ์ด ๋ค๋ฅด๋ฉด ์ ์ด์ ์ ์ก์ด ์ ๋๊ธฐ๋ ํ๋ฏ๋ก, ๊ทผ๋ณธ์ ์ผ๋ก ๋จ์ผ ๋๋ฉ์ธ์ผ๋ก ๋ณด์ด๋๋ก ํ๋ก์๋ฅผ ๊ตฌ์ฑํ๋ ํธ์ด ์ค๋ฌด์์ ๋๋ฆฌ ์ฐ์
๋๋ค. ๊ฐ๋ฐ ํ๊ฒฝ์์๋ webpack-dev-server์ ํ๋ก์ ์ค์ ์ด๋ http-proxy-middleware
๋ฑ์ ์ฌ์ฉํด ๋ก์ปฌ CORS๋ฅผ ์ฐํํ๊ณ , ์ด์ ํ๊ฒฝ์์๋ Nginx/Haproxy ๋๋ ํด๋ผ์ฐ๋ ์ฃ์ง ํ๋ก์๋ก ๋์ผํ ํจ๊ณผ๋ฅผ ๋
๋๋ค (Lightweight Microfrontend Development With a Local Proxy Server) (Webpack Module Federation for production environnement).
๐ Lambda@Edge๋ฅผ ํ์ฉํ ์ฑ๋ฅ ์ต์ ํ ๊ฐ๋ฅ์ฑ
Lambda@Edge๋ AWS CloudFront์ ์ฃ์ง ๋ก์ผ์ด์ (์ ์ธ๊ณ CDN ์๋ฒ)์์ ์คํ๋๋ ์๋ฒ๋ฆฌ์ค ํจ์์ ๋๋ค. ์ด๋ฅผ ์ ํ์ฉํ๋ฉด ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ฒ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ ์ฌ๋ฌ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ํต์ฌ ์์ด๋์ด๋ ์ฌ์ฉ์์ ๊ฐ๊น์ด ์์น(์ฃ์ง)์์ ์ผ๋ถ ์ฐ์ฐ์ด๋ ์กฐ๋ฆฝ์ ์ํํ์ฌ ์ง์ฐ์ ์ค์ด๋ ๊ฒ ์ ๋๋ค.
- ์ฃ์ง ์ฌ์ด๋ ๋ ๋๋ง ๋ฐ ์กฐํฉ: Lambda@Edge๋ฅผ ์ด์ฉํ๋ฉด ์ฌ์ฉ์์ ์์ฒญ์ด ์๋ณธ ์๋ฒ๊น์ง ๊ฐ์ง ์๊ณ ๋, ์ฃ์ง์์ ์ฌ๋ฌ ๋ง์ดํฌ๋ก ์ฑ์ ์ฝํ ์ธ ๋ฅผ ๋ชจ์ ์๋ตํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ฐ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๊ฐ S3๋ API Gateway ๋ฑ์ผ๋ก๋ถํฐ JSON/HTML ์กฐ๊ฐ์ ๊ฐ์ ธ์จ๋ค๋ฉด, Lambda@Edge ํจ์๊ฐ ์ด๋ฅผ ํธ์ถํด ํ ๋ฒ์ HTML๋ก ํฉ์ฑํ์ฌ ์๋ตํ๋๋ก ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ณธ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ๋ฌ ๋ฒ ํธ์ถํด์ผ ํ ๊ฒ์ ์ฃ์ง ์๋ฒ๊ฐ ๋ํํ๋ฏ๋ก RTT(Round Trip Time)๋ฅผ ์ค์ด๊ณ , ์ฌ์ฉ์๋ ๋ ๋น ๋ฅด๊ฒ ์์ฑ๋ ํ์ด์ง๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค. Cloudflare Workers ๊ธฐ๋ฐ์ ์ฌ๋ก์์๋, ์ฌ๋ฌ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ์๋ฒ๋ฆฌ์ค ์์ปค๋ค์ด ๋ณ๋ ฌ๋ก SSRํ์ฌ ์คํธ๋ฆฌ๋ฐํจ์ผ๋ก์จ ์ ํต์ ์ธ ํด๋ผ์ด์ธํธ ๋ ๋๋ง๋ณด๋ค ๋นจ๋ฆฌ ์ํธ์์ฉํ ์ ์๊ฒ ๋ง๋ ๋ฐ ์์ต๋๋ค (Incremental adoption of micro-frontends with Cloudflare Workers). Lambda@Edge ์ญ์ ๋น์ทํ๊ฒ, ์ฌ์ฉ์๊ฐ ์์นํ ์ง์ญ์ CloudFront ์ฃ์ง์์ ํ์ด์ง ์กฐ๋ฆฝ์ ์ํํ๋ฉด ์๊ฑฐ๋ฆฌ ์๋ฒ์ ๋นํด TTFB(Time To First Byte)๊ฐ ๊ฐ์ ๋ ์ ์์ต๋๋ค.
- ๋ง์ถคํ ์บ์ฑ๊ณผ ํผ์ค๋๋ผ์ด์ ์ด์ : ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ๊ตฌ์ฑ์์๋ ๊ณตํต ์ฝํ ์ธ ์ ์ฌ์ฉ์๋ณ ์ฝํ ์ธ ๊ฐ ์์ฌ ์์ ์ ์์ต๋๋ค. Lambda@Edge๋ฅผ ํ์ฉํ๋ฉด ๋ถ๋ถ์ ์ธ ํผ์ค๋๋ผ์ด์ ์ด์ ์ ์ฃ์ง์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ณตํต์ผ๋ก ์บ์๋ ์ ์ ํ์ด์ง์ ์ฌ์ฉ์์ ์ด๋ฆ์ด๋ ์ฅ๋ฐ๊ตฌ๋ ์๋ ๊ฐ์ ๋์ ๋ฐ์ดํฐ๋ง Lambda@Edge๊ฐ ์ด์ง ์ฃผ์ ํ์ฌ ์๋ตํ๊ฒ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ์ฒด ํ์ด์ง๋ฅผ ์ฌ์ฉ์๋ณ๋ก ๋ชจ๋ ์๋ฒ์์ ์์ฑํ์ง ์์๋ ๋์ด ์บ์ ํจ์จ์ ๋์ด๋ฉด์๋ ๊ฐ์ธํ๋ ๊ฒฝํ์ ์ค ์ ์์ต๋๋ค. ์ฆ, ๊ณตํต ๋ง์ดํฌ๋ก ์ฑ์ CDN ์บ์์์ ๊ฐ์ ธ์ค๊ณ , ์ฌ์ฉ์ ํน์ด ๋ฐ์ดํฐ๋ง Lambda@Edge์์ ํธ์ถ/์ฝ์ ํ๋ ์์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. Edge์์ ์คํ๋๋ฏ๋ก ์ง์ฐ์ด ๋งค์ฐ ์งง์์, ์ต์ข ์ฌ์ฉ์ ์ฒด๊ฐ ์ฑ๋ฅ์ ์๋ณธ ์๋ฒ๋ฅผ ์น ๋๋ณด๋ค ํจ์ฌ ์ข์์ง๋๋ค.
- ํธ๋ํฝ ๋ถ์ฐ ๋ฐ ์ฑ๋ฅ ์ ์ด: Lambda@Edge๋ ์์ฒญ๋ณ๋ก ์คํ๋๋ฏ๋ก, AB ํ ์คํ ์ด๋ ๋จ๊ณ์ ์ถ์์๋ ํ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ ๋ฒ์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ์ผ์ ๋น์จ๋ก๋ง ์๋ตํด์ฃผ๊ฑฐ๋, ์ฌ์ฉ์์ ์ง์ญ/๋๋ฐ์ด์ค ํน์ฑ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ๋ฒ์ ์ ์ ํ์ ์ผ๋ก ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ฐ ๋ก์ง์ ์๋ณธ ์๋ฒ๊ฐ ์๋๋ผ ์ฃ์ง์์ ์ฒ๋ฆฌํ๋ฉด ์ฌ์ฉ์๊น์ง ๊ฐ๋ ๊ฒฝ๋ก ์ค๊ฐ์์ ๊ฒฐ์ ๋๋ฏ๋ก ์ง์ฐ ์์ด ๋ถ๊ธฐ๊ฐ ์ผ์ด๋ฉ๋๋ค. ๋ํ ํธ๋ํฝ์ด ํน์ ์ง์ญ์ ๋ชฐ๋ฆด ๋ ์ฃ์ง ๋ ๋ฒจ์์ ๋ฏธ๋ฆฌ ์๋ต์ ์ค์ด๊ฑฐ๋ ํ๋ Rate Limiting๋ ๊ฐ๋ฅํฉ๋๋ค. ์์ฝํ๋ฉด, ์ฃ์ง ์ปดํจํ ์ ์ด์ฉํด ์ฌ์ฉ์ ๊ทผ์ ์ง์์ ๋๋ํ ๋ผ์ฐํ ๊ณผ ์ฝํ ์ธ ์์ฑ์ ํจ์ผ๋ก์จ ์ฑ๋ฅ๊ณผ ํจ์จ์ ๊ทน๋ํํ ์ ์์ต๋๋ค.
- Lambda@Edge ํ๊ณ: ๋ค๋ง Lambda@Edge์๋ ์คํ ์๊ฐ(์: 50ms~์ด๋จ์)์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ด ์๊ธฐ ๋๋ฌธ์, ๋๋ฌด ๋ณต์กํ๊ฑฐ๋ ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ ๋๋ง ๋ก์ง์ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค. ๋ํ ํจ์ ๋ฐฐํฌ/๊ด๋ฆฌ์ ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋๊ณ , ๋๋ฒ๊น ์ด ์ด๋ ค์ด ์ธก๋ฉด๋ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ AWS ํ๊ฒฝ์์ ์ฃ์ง ๋จ์์์ ์๋ฒ๋ฆฌ์ค ์กฐํฉ์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋์ ์ฑ๋ฅ์ ๋์ผ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. ์ค์ AWS ๊ณต์ ์์์์๋, ์ผ๋ถ ๋ง์ดํฌ๋กํ๋ก ํธ์๋(์: ์ฌ์ฉ์ ๋ฆฌ๋ทฐ ์ปดํฌ๋ํธ)๋ฅผ Lambda ํจ์๊ฐ SSRํ์ฌ HTML ํ๋๊ทธ๋จผํธ๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ์ต์ข ํ์ด์ง์ ํฌํจ์ํค๋ ๊ตฌ์ฑ์ ์๊ฐํ๊ณ ์์ต๋๋ค. ์ด์ฒ๋ผ Lambda@Edge๋ CloudFront Functions๋ก CDN ๋ ๋ฒจ์์์ ํ์ด์ง ์ต์ ํ๋ฅผ ์ ์ฉํ๋ฉด, ๋ฉํฐ ์ค๋ฆฌ์ง์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ํ๊ฒฝ์์๋ ์ฌ์ฉ์๊ฐ ์พ์ ํ ์๋๋ฅผ ๋๋ ์ ์๊ฒ ํด์ค ์ ์์ต๋๋ค.
3๏ธโฃ ์ค์ ์ฌ๋ก์ ์ถ๊ฐ์ ์ธ ๊ธฐ์ ์คํ
๐ ์ค์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ๋์ ์ฌ๋ก
- Capital One: ๋ฏธ๊ตญ์ Capital One ์ํ์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ก ์ ํํ์ฌ 100์ฌ ๊ฐ ์ด์์ ๋ง์ดํฌ๋ก ์ฑ์ผ๋ก ์น ์์ฐ์ ๊ตฌ์ฑํ์ต๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies). ๊ฐ ํ์ด ๋ค์ํ ๊ธฐ์ ์คํ(React, Vue ๋ฑ)์ผ๋ก ๋ ๋ฆฝ ๊ฐ๋ฐํ๊ณ Node ๊ธฐ๋ฐ์ ๋ง์ดํฌ๋ก์๋น์ค๋ก ํต์ ํ๋ฉด์, ์ด์ ๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ๋ฐฐํฌ ์ฃผ๊ธฐ๋ฅผ ๋ฌ์ฑํ์ต๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies). ์ด๋ค์ “์ฑ ์ ธ(App Shell)” ์ํคํ ์ฒ๋ฅผ ๋์ ํด ๋ค๋จ๊ณ ๋ผ์ฐํ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋๋ฐ, URL ์ธ๊ทธ๋จผํธ๋ณ๋ก ์ด๋ค ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ๋ก๋ํ ์ง JSON ์ค์ ์ผ๋ก ๊ด๋ฆฌํ๋ค๊ณ ํฉ๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies). ๊ทธ ๊ฒฐ๊ณผ ์ด์ ์๋ ํ๊บผ๋ฒ์ ๋ฐฐํฌํ๋๋ผ ๋ ๋ฌ์ฉ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ํ๋ฃจ์๋ ์ฌ๋ฌ ๋ฒ ๋ฐฐํฌํ ์ ์๊ฒ ๋์๊ณ , ์ฝ 50๊ฐ ํ์ด ์ถฉ๋ ์์ด ๋์ ์์ ํ ์ ์์๋ค๊ณ ํฉ๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies) (The Truth Behind Micro Frontends: Insights from Real Case Studies). ์ด ์ฌ๋ก๋ ๋๊ท๋ชจ ๊ธ์ต ์๋น์ค์์๋ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๊ฐ ์ ์ฐ์ฑ ๋ฐ ๊ฐ๋ฐ ์๋๋ฅผ ํฌ๊ฒ ๋์ผ ์ ์์์ ๋ณด์ฌ์ค๋๋ค.
- Spotify: ์คํฌํฐํ์ด๋ ์์ฌ ์น/๋ฐ์คํฌํฑ ํด๋ผ์ด์ธํธ์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ์ ์ฉํ์ต๋๋ค. ํนํ ๋ฐ์คํฌํฑ ์ฑ์ ์ฌ๋ฌ ๊ธฐ๋ฅ(์ฌ์ ํ๋ ์ด์ด, ๊ฒ์, ํ๋ ์ด๋ฆฌ์คํธ ๋ฑ)์ ๊ฐ๊ฐ ๋ณ๊ฐ ๋ชจ๋๋ก ๋ถ๋ฆฌํ๊ณ , ์ด๋ฅผ ์์ดํ๋ ์์ผ๋ก ํตํฉํ๋ ์ ๊ทผ์ ์ฌ์ฉํ์ต๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies). ๋ชจ๋ ๊ฐ ํต์ ์ ์ํด ์ด๋ฒคํธ ๋ฒ์ค(Event Bus)๋ฅผ ํ์ฉํ์ฌ ํ๋ ์ด์ด์์ ์ฌ์์ด ๋๋๋ฉด ๋ค๋ฅธ ๋ชจ๋์ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด๊ฑฐ๋ ํ๋ ์ฐ๋์ ํ์ต๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies). ๋ํ TypeScript ๊ธฐ๋ฐ ํ๋ซํผ API๋ฅผ ๋ง๋ค์ด, ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ด ๊ณตํต๋ ๋ฐฉ์์ผ๋ก ๋ฐฑ์๋ ๋ฐ์ดํฐ ์์ค๋ ์ฌ์ ์์ง์ ์ ๊ทผํ๋๋ก ์ถ์ํํ์ต๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies). ์ด๋ฅผ ํตํด ์น ํ๋ ์ด์ด์ ๋ฐ์คํฌํฑ ํด๋ผ์ด์ธํธ ๋ชจ๋์์ ๋์ผํ React UI๋ฅผ ๊ตฌ๋ํ๋ฉด์, ์๋ก ๋ค๋ฅธ ํ๋ซํผ(web vs desktop)์ ์ฐจ์ด๋ฅผ ์บก์ํํ๋ค๊ณ ํฉ๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies). ์ด์ฒ๋ผ Spotify๋ ๊ฑฐ๋ํ ํ๋ก ํธ์๋๋ฅผ ๊ธฐ๋ฅ๋ณ๋ก ๋๋ ๋ณ๋ ฌ ๊ฐ๋ฐํจ๊ณผ ๋์์, ๊ณตํต ํ๋ซํผ ๊ณ์ธต์ ๋์ด ์ผ๊ด๋ UX์ ๊ธฐ๋ฅ ๋๋ฑ์ฑ์ ํ๋ณดํ ์ฌ๋ก์ ๋๋ค.
- ๋ท์ปด ๋ฆฌํ ์ผ ์ฌ๋ก (์: Zalando ๋ฑ): ์ ๋ฝ์ ํจ์ ์ ์์๊ฑฐ๋์ฌ์ธ Zalando๋ ๋น๊ต์ ์ผ์ฐ(2010๋ ๋ ์ค๋ฐ)๋ถํฐ ํ๋ก ํธ์๋๋ฅผ ์๋น์ค๋ณ๋ก ๋ถ๋ฆฌํ๋ ์๋๋ฅผ ํ์ต๋๋ค. Zalando๋ ๊ฐ ์ํ ํ์ด์ง๋ ๋ฆฌ๋ทฐ, ์ถ์ฒ ๋ชจ๋ ๋ฑ์ ๋ณ๋ ํ์ด Self-contained System ํํ๋ก ๊ฐ๋ฐํ๊ณ , ์ด๋ฅผ ์๋ฒ ์ฌ์ด๋์์ ์กฐํฉํ๋ ์ ๋ต์ ์ทจํ์ต๋๋ค. ์ด๋ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ผ๋ ์ฉ์ด ๋ฑ์ฅ ์ด์ ์ด์ง๋ง ์ ์ฌํ ๊ฐ๋ ์ผ๋ก, ์ดํ ๋ง์ดํฌ๋กํ๋ก ํธ์๋์ ์ ๊ตฌ์ ์ฌ๋ก๋ก ์์ฃผ ์ธ๊ธ๋ฉ๋๋ค (MicroโFrontends - extending the microservice idea to frontend development). ์ด๋ฐ์ IKEA, Amazon ๋ฑ๋ ์ํ ์์ธ ํ์ด์ง์ ์ฌ๋ฌ ํ์ ์์ ฏ(๋ฆฌ๋ทฐ, ์ถ์ฒ, ๊ตฌ๋งค ํจ๋ ๋ฑ)์ ํฉ์น๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ์๊ณ , ๊ตญ๋ด์์๋ ์นด์นด์ค์ ์ผ๋ถ ์๋น์ค๋ ๋ค์ด๋ฒ ์ผ๋ถ ํ๋ซํผ์์ ์ ์ฌํ ์ ๊ทผ์ ์ฌ์ฉํ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค.
- ๊ตญ๋ด ์ฌ๋ก: NHN Doory, ์ฟ ํก ๋ฑ ๊ตญ๋ด ๋ํ ์๋น์ค๋ค๋ ์ ์ง์ ์ผ๋ก ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ๋์ ํ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด NHN Dooray!๋ ๊ฑฐ๋ํ ๋ชจ๋๋ฆฌ์ SPA๋ฅผ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ก ๋ถ๋ฆฌํด ํน์ ๋๋ฉ์ธ(์: ์บ๋ฆฐ๋, ๋ฉ์ผ) ๊ฐ๊ฐ์ ๋ ๋ฆฝ ๋ฐฐํฌํ๋๋ก ๊ฐ์ ํ ๋ฐ ์์ต๋๋ค ([NHN FORWARD 22] ๊ฑฐ๋ํ ์๋น์ค ์ชผ๊ฐ์ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ ...). ์ด๋ฅผ ํตํด ์ ๊ท ๋์์ธ ๊ฐํธ ์ ์ผ๋ถ ์๋น์ค๋ง ๋จผ์ ์ ์ฉํ๊ณ ํ ์คํธํ๋ ๋ฑ ์คํ์ ๊ธฐ๋ฅ ์ถ์๊ฐ ์ฌ์์ก๋ค๊ณ ํฉ๋๋ค. ์ฟ ํก๋ MSA ์ ํ ๊ณผ์ ์์ ํ๋ก ํธ์๋ ์ญ์ ๋๋ฉ์ธ๋ณ ๋ง์ดํฌ๋ก ์ฑ์ผ๋ก ๋๋๊ณ ๊ณตํต UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค. ์ด๋ฌํ ์ฌ๋ก๋ค์ ๋๊ท๋ชจ ์๋น์ค๋ฅผ ์ด์ํ๋ ์กฐ์ง์์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ํตํด ์ป๋ ๊ฐ๋ฐ ๋ฏผ์ฒฉ์ฑ์ ์ ๋ณด์ฌ์ค๋๋ค.
์ฑ๊ณต์ ์ธ ๋์ ์ ์ํ ํฌ์ธํธ: ์ค์ ์ฌ๋ก๋ค์ ๋ณด๋ฉด, ๊ธฐ์ ๋ณด๋ค๋ ์กฐ์ง ๊ตฌ์กฐ์ ๋ฌธํ๊ฐ ์ฑ๊ณต์ ์ด์ ์์ต๋๋ค. ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ๋์ ํ ๊ธฐ์ ๋ค์ ๋๋ถ๋ถ ๋๋ฉ์ธ ๊ธฐ๋ฐ์ผ๋ก ํ์ ์ฌํธํ๊ณ , ๊ฐ ํ์ ํ์ํ ๊ถํ๊ณผ ์ญ๋(API ๊ฐ๋ฐ ๋ฑ)์ ๋ถ์ฌํ์ต๋๋ค. ๋ํ ๊ณตํต ๋์์ธ ์์คํ ์ด๋ ํ๋ซํผ API๋ฅผ ๋ง๋ จํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ ค ๋ ธ๋ ฅํ์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก, ๋ชจ๋ํฐ๋ง/๋ก๊ทธ/๋ฐฐํฌ ํ์ดํ๋ผ์ธ ๋ฑ์ ํ์คํํด ๋ง์ ์๋น์ค ์กฐ๊ฐ์ด ์์ด๋ ์ด์ฉ์ ๋ฌด๋ฆฌ๊ฐ ์๋๋ก ํ ์ ์ด ๋๋ณด์ ๋๋ค.
๐ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ์ง์ํ๋ ์ฃผ์ ๊ธฐ์ ์คํ
๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๊ธฐ์ ์คํ๋ ๋ค์ํ๊ฒ ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ์ฃผ์ ๋๊ตฌ์ ๊ธฐ์ ๋ค์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ชจ๋ ๋ฒ๋ค๋ฌ & Module Federation: Webpack 5์์ ๋์ ๋ Module Federation์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ๊ตฌํ์ ํฌ๊ฒ ์ด์งํ ๊ธฐ์ ์ ๋๋ค. ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ์ ๋ฒ๋ค์ ๋น๋ํ๋ฉด์ ๋ ธ์ถ(expose)ํ๊ณ ์ ํ๋ ๋ชจ๋์ ์ ์ธํด๋๋ฉด, ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐํ์์ ์ด๋ฅผ ๋์ ์ผ๋ก ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ณ๊ฐ์ ๋ฐฐํฌ๋ฌผ์ด์ง๋ง ํจ์๋ ์ปดํฌ๋ํธ๋ฅผ ์ง์ ํธ์ถํ๋ฏ ์ฌ์ฉํ ์ ์์ด, ํ๋์ SPA์ฒ๋ผ ๋์ํ๋ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. Webpack ์ธ์๋ Rollup ๊ธฐ๋ฐ์ vite-plugin-federation ๋ฑ์ด ๋์ค๋ฉด์ Vite ํ๊ฒฝ์์๋ Module Federation์ ์ฌ์ฉํ ์ ์๊ณ (How to build scalable micro-frontends with Vike and Vite), SystemJS + import-map์ผ๋ก ๋น์ทํ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ์ฌ๋ก๋ ์์ต๋๋ค. ๋ฒ๋ค๋ฌ ๋ ๋ฒจ์ ์ง์ ๋๋ถ์ ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ด ๋ณ๋ ์ ์ฅ์์์ ๊ฐ๋ฐ๋์ด๋ ์ต์ข ํตํฉ์ด ๋น๊ต์ ๋ถ๋๋ฝ๊ฒ ์ด๋ค์ง๋๋ค.
- ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ํ๋ ์์ํฌ/๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์์ฑํ ํ๋ ์์ํฌ๋ก single-spa๊ฐ ๋ํ์ ์ ๋๋ค. single-spa๋ ์ฌ๋ฌ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ(React, Vue, Angular ๋ฑ)๋ก ์์ฑ๋ ์ฑ๋ค์ ํ ํ์ด์ง์์ ๊ตฌ๋ํ๊ธฐ ์ํ ๋ฌ๋ํ์์ ์ ๊ณตํฉ๋๋ค. ์ด์ธ์ ์คํ์์ค๋ก qiankun(single-spa ๊ธฐ๋ฐ ์ค๊ตญ๋ฐ ํ๋ ์์ํฌ), frint.js, piral ๋ฑ์ด ์์ผ๋ฉฐ, ๋๊ธฐ์ ๋ค์ ์์ฒด ์๋ฃจ์ ์ ๋ง๋ค๊ธฐ๋ ํฉ๋๋ค. ์ด๋ฌํ ํ๋ ์์ํฌ๋ค์ ์ฃผ๋ก ๋ผ์ฐํ , ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ, ํต์ ๋ฑ์ ์ง์ํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ง์ดํฌ๋ก ์ฑ๊ฐ ์ฐ๊ฒฐ๋ถ๋ฅผ ์ฝ๊ฒ ๊ตฌ์ถํ๊ฒ ๋์ต๋๋ค.
- ์น ์ปดํฌ๋ํธ ๋ฐ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: Web Component ํ์ค(Custom Elements, Shadow DOM ๋ฑ)์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋์ ์์ฐ์ค๋ฝ๊ฒ ์ด์ธ๋ฆฌ๋ ๊ธฐ์ ์
๋๋ค. ๊ฐ ํ์ด ์์ ๋ง์ ์ปค์คํ
ํ๊ทธ๋ฅผ ์ ์ํ๊ณ
<my-team-feature></my-team-feature>
์ฒ๋ผ HTML์ ๋ผ์ ๋ฃ๋ ์์ผ๋ก ํตํฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). Web Component๋ฅผ ์ง์ ์์ JS๋ก ์์ฑํ ์๋ ์์ง๋ง, Lit (๊ตฌ Polymer), Stencil, Angular Elements ๋ฑ Web Component ์์ฑ์ ํธํ๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ง์ด ์ฐ์ ๋๋ค (Micro-frontends and Web Components) (Building a Micro-frontend Framework | Toptal®). Web Component์ ์ฅ์ ์ ํ์คํ๋ ์ธํฐํ์ด์ค(์์ฑ, ์ด๋ฒคํธ)๋ก ํ ๊ฐ ๊ณ์ฝ์ ์ ํ ์ ์๋ค๋ ๊ฒ๊ณผ, Shadow DOM์ผ๋ก ์คํ์ผ ๊ฒฉ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ค๋ง ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์๋ฒฝํ ์ง์๋๋ ๊ฒ์ ์๋์ด์ ํด๋ฆฌํ์ด ํ์ํ ์ ์๊ณ , React/Vue ๊ฐ์ ํ๋ ์์ํฌ์ ํผ์ฉ ์์๋ wrapper๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๋ ๋ฑ ๊ณ ๋ ค๊ฐ ํ์ํฉ๋๋ค. - ๋น๋/๋ฐฐํฌ ํ์ดํ๋ผ์ธ ๋๊ตฌ: ๋ค์์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ด๋ฆฌํ๋ ค๋ฉด ๋น๋ ๋ฐ ๋ฐฐํฌ ํจ์จํ๊ฐ ์ค์ํฉ๋๋ค. ๋ชจ๋ ธ๋ ํฌ๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ Nx, Turborepo ๊ฐ์ ๋๊ตฌ๋ก ๋น๋ ์์ ๊ด๋ฆฌ์ ์บ์ฑ์ ํ์ฉํ๊ณ , ๋ฉํฐ๋ ํฌ์ธ ๊ฒฝ์ฐ CI/CD ํ์ดํ๋ผ์ธ์ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ณ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ค์ ํฉ๋๋ค. ๋ํ ์ปจํ ์ด๋ํ(Docker)๋ฅผ ํตํด ๊ฐ ์ฑ์ ๋ฐฐํฌํ๊ฑฐ๋, CDN์ ์ ์ ํ์ผ๋ก ์ฌ๋ฆฌ๋ ๋ฐฉ์์ ํํ ์๋ ์์ต๋๋ค. AWS ํ๊ฒฝ์์๋ ๊ฐ ์ฑ์ S3์ ์ฌ๋ฆฌ๊ณ CloudFront๋ก ์๋นํ๋ฉด์, ๋งค๋ํ์คํธ ํ์ผ์ ํตํด ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ๋ ๋ ํผ๋ฐ์ค ์ํคํ ์ฒ๋ ์๊ฐ๋์ด ์์ต๋๋ค (๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ก ํ์ด์ง ๋ฐ ๋ทฐ ์์ฑ - AWS ๊ท๋ฒ์ ์ง์นจ). ์ด๋ ๋ฏ ๋น๋/๋ฐฐํฌ ๋จ๊ณ์์๋ ๊ธฐ์กด MSA์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ๊ด๋ฆฌํ๊ณ ์๋ํํ๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค.
- ๊ณตํต ์์ฐ ๊ณต์ : ๋ง์ดํฌ๋กํ๋ก ํธ์๋์์ ๋์์ธ ์์คํ ์ด๋ ๊ณต์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด npm ํจํค์ง๋ฅผ ํ์ฉํ๊ธฐ๋ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ณตํต UI ์ปดํฌ๋ํธ๋ ์ ํธ ํจ์๋ค์ ๋ณ๋ ํจํค์ง๋ก ๋ง๋ค์ด ๋ชจ๋ ๋ง์ดํฌ๋ก ์ฑ์ด dependecy๋ก ์ถ๊ฐํ๋๋ก ํ๋ฉด, ์ผ๊ด๋ UX์ ๊ธฐ๋ฅ์ ์ ์งํ ์ ์์ต๋๋ค. ๋จ, ๊ฐ์ ๋ฒ์ ์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์๋ชปํ๋ฉด ๋ฒ์ ํํธํ๊ฐ ๋ฐ์ํ ์ ์์ด ์๊ฒฉํ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). Module Federation์ ์ฌ์ฉํ๋ฉด ๊ณตํต ๋ชจ๋์ ํธ์คํธ ์ฑ์ด ์ ๊ณตํ๊ณ ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ด ๊ทธ๊ฒ์ ์ฐธ์กฐํ๊ฒ ํด์ ๋์ผํ ์ธ์คํด์ค๋ฅผ ์ฐ๋๋ก ํ ์๋ ์์ต๋๋ค. ๋๋ ์์ ์ ์ญ ๋ณ์/์ฑ๊ธํค์ ํ์ฉํ์ฌ ์ฌ๋ฌ ์ฑ์ด ๊ฐ์ ๊ฐ์ฒด(window ๋ ๋ฒจ)๋ฅผ ๋ณด๋๋ก ์ค๊ณํ๊ธฐ๋ ํ์ง๋ง ์ด๋ ๊ถ์ฅ๋์ง ์์ต๋๋ค.
- ๊ธฐํ: ์ต๊ทผ์๋ Astro, Qwik ๋ฑ ์๋ก์ด ๋ฉํํ๋ ์์ํฌ๋ค์ด ๋ฑ์ฅํ๋ฉด์, ์์ผ๋๋ ์ํคํ ์ฒ๋ ๋ถ๋ถ์ ์ ์ ์ถ๋ ฅ ๋ฑ์ ๊ธฐ๋ฒ์ ์ง์ํ๊ณ ์์ต๋๋ค. ์ด๋ฐ ํด๋ค๋ ๋ง์ดํฌ๋กํ๋ก ํธ์๋์ ๊ฒฐํฉ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์๋ฅผ ๋ค์ด Astro๋ก ๊ฐ ํ์ ์์ ฏ์ ์์ฑํ๊ณ SSR ์ถ๋ ฅ๋ HTML์ ๋ชจ์ ์ต์ข ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ ์๋๋ ๊ฐ๋ฅํฉ๋๋ค. ๋ํ Edge Computing(Cloudflare Workers, Lambda@Edge)๊ณผ ์ฐ๋ํ ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์กฐํฉ, GraphQL Federation๊ณผ ๊ฒฐํฉํ์ฌ BFF ๊ณ์ธต์ ํตํฉ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ ๋ฑ ๋ค์ํ ๊ธฐ์ ์คํ ์คํ์ด ์ด๋ฃจ์ด์ง๊ณ ์์ต๋๋ค.
๐ ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ๋์ ์ ๊ณ ๋ คํด์ผ ํ ์ฌํญ
๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋์ ํ๋ ค๋ฉด ๊ธฐ์ ์ ์ธก๋ฉด๋ฟ ์๋๋ผ ์กฐ์ง์ ์ธก๋ฉด์ ๊ณ ๋ ค๊ฐ ํ์์ ๋๋ค. ๋ค์์ ๋์ ์ ๊ฒํ ํด์ผ ํ ์ฃผ์ ์ฌํญ๋ค์ ๋๋ค:
- ํ์์ฑ ํ๊ฐ: ์ฐ์ ์ฐ๋ฆฌ ์๋น์ค/์กฐ์ง์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๊ฐ ์ ๋ง ํ์ํ์ง ๋์ ํ๊ฒ ํ๋จํด์ผ ํฉ๋๋ค. ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ ๋ถ๋ช ๊ฐ๋ ฅํ ์ํคํ ์ฒ์ง๋ง, ์์ ๊ท๋ชจ ์๋น์ค๋ ํ ํ์ด ๋ชจ๋ ๊ฐ๋นํ ์ ์๋ ์์ค์ ์ ํ์ด๋ผ๋ฉด ๊ณผ๋ํ ๋ณต์ก์ฑ(over-engineering)์ด ๋ ์ ์์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ์ป๋ ์ด์ ๋๋น ์ถ๊ฐ๋๋ ๋ณต์ก๋๊ฐ ํฐ์ง, ํ์ฌ์ ๋ฌธ์ (๋ฐฐํฌ ์๋ ์ ํ, ํ ๊ฐ ์ถฉ๋ ๋ฑ)๋ฅผ ์ถฉ๋ถํ ํด๊ฒฐํ ์ ์์์ง๋ฅผ ๋ฐ์ ธ๋ด์ผ ํฉ๋๋ค. ๋น์ทํ ํจ๊ณผ๋ฅผ ๋ชจ๋ ธ๋ ํฌ๋ ์ ์ ํ ๋ชจ๋ํ๋ก ์ป์ ์ ์๋ค๋ฉด ๊ตณ์ด ๋์ ํ์ง ์๋ ํธ์ด ๋์ ์ ์์ต๋๋ค.
- ํ ๊ตฌ์กฐ ๋ฐ ์ ๋ฌด ๋ถ๋ด: ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ๋์ ์ ์กฐ์ง ๊ตฌ์กฐ์ ๋ณํ๋ฅผ ๋๋ฐํฉ๋๋ค. ๋๋ฉ์ธ ๋๋ ๊ธฐ๋ฅ๋ณ๋ก ํ์ ์ฌํธ์ฑํ๊ณ , ๊ฐ ํ์ด ์์ ์ ์์ญ์ end-to-end๋ก ์ฑ ์์ง๋ ๋ฐฉ์์ผ๋ก ์ผํ๊ฒ ๋ฉ๋๋ค (MicroโFrontends - extending the microservice idea to frontend development). ๋ฐ๋ผ์ ํ๋ณ ์ญ๋ ํธ์ฐจ๋ ์ธ์ ๋ฐฐ๋ถ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๋ชจ๋ ํ์ด ์ ์์ญ(ํ๋ก ํธ๋ถํฐ ๋ฐฑ์๋, DevOps)์ ๋ค ํ ์ ์์ ์ ๋๋ก ํ์คํ์ด ๋์ด์ผ ํ ์๋ ์๊ณ , ์๋๋ฉด BFF๋ ํ๋ซํผ ํ์ ๋ณ๋๋ก ๋์ด ๊ณตํต ์ธํ๋ผ๋ฅผ ์ง์ํด์ผ ํ ์๋ ์์ต๋๋ค. ์ปค๋ฎค๋์ผ์ด์ ๋น์ฉ๋ ์ด๊ธฐ์ ์ฆ๊ฐํ ์ ์์ต๋๋ค. ๊ฒฝ๊ณ๊ฐ ๋ชจํธํ ๊ธฐ๋ฅ์ ์ด๋ค ํ์ด ๋งก์์ง, ๊ณตํต ์์(์: ๊ณตํต ๋ค๋น๊ฒ์ด์ ๋ฐ)๋ ๋๊ฐ ๊ด๋ฆฌํ ์ง ๋ฑ์ ๊ฒฐ์ ํด์ผ ํ๊ณ , ํ ๊ฐ API ํน์ ์ด๋ฒคํธ ๊ณ์ฝ์ ์ ์ํ๋ ค๋ฉด ์ถฉ๋ถํ ํ์๊ฐ ํ์ํฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ํ์ง๋ง ์ผ๋จ ๊ฒฝ๊ณ๊ฐ ๋ช ํํด์ง๊ณ ๋๋ฉด ์คํ๋ ค ๊ฐ์ ์์ ๋กญ๊ฒ ๋ฐฐํฌํ ์ ์์ด ์ ์ฒด ์์ฐ์ฑ์ ์ฌ๋ผ๊ฐ๋๋ค.
- ๊ณตํต ์์์ UX ์ผ๊ด์ฑ: ๋ ๋ฆฝ ๊ฐ๋ฐ์ ์์ ์ ์ฌ์ฉ์ ๊ฒฝํ ์ผ๊ด์ฑ ์ฌ์ด์์ ๊ท ํ์ ์ก์์ผ ํฉ๋๋ค. ๋์์ธ ์์คํ ์๋ฆฝ์ด๋ ๊ณต์ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์ถ์ ๊ฐํ๊ฒ ๊ถ์ฅํฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ์๋ฅผ ๋ค์ด ๋ฒํผ, ์์ด์ฝ, ํฐํธ ๋ฑ์ ๊ณตํต ๊ฐ์ด๋์ ๋ฐ๋ผ ๋์ผํ๊ฒ ๊ตฌํํ๋๋ก ํ๊ณ , ๊ฐ๋ฅํ ํ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด npm ํจํค์ง๋ Git Submodule ๋ฑ์ผ๋ก ๊ณต์ ํด์ผ ํฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ) (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ๋ค๋ง ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋๋ฌด ์ฑ๊ธํ๊ฒ ๋ง๋ค๊ธฐ๋ณด๋ค, ์ด๊ธฐ์๋ ์ค๋ณต์ ํ์ฉํ๋ค๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๊ณตํต ํจํด์ด ๋ณด์ด๋ฉด ์ถ์ถํ๋ ๋ฐฉ์์ด ์ข์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ๋ํ ๊ฐ ํ์ UX ๋์์ด๋๋ค์ด ๊ธด๋ฐํ ํ์ ํ์ฌ ์ฌ์ฉ์ ์ ์ฅ์์ ํ๋์ ์ ํ์ฒ๋ผ ๋ณด์ด๋๋ก ์ ๊ฒฝ ์จ์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํ ํฌ๋ก์คํ ๋์์ธ ์ฑํฐ๋ฅผ ์ด์ํ๊ฑฐ๋, ์ต์ข UI๋ฅผ ํตํฉ์ ์ผ๋ก ์ ๊ฒํ๋ ํ๋ก์ธ์ค๋ ํ์ํฉ๋๋ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋ฐ ์ต์ ํ: ์์ ์ธ๊ธํ๋ฏ ์๋ชปํ๋ฉด ๋ฒ๋ค ํฌ๊ธฐ ์ฆ๊ฐ ๋ฑ์ผ๋ก ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ผ๋ฏ๋ก, ์ฑ๋ฅ ์์ฐ(Performance Budget)์ ์ค์ ํ๊ณ ๊พธ์คํ ๋ชจ๋ํฐ๋งํด์ผ ํฉ๋๋ค. ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ ๋ฒ๋ค ํฌ๊ธฐ, ๋ก๋ ์๊ฐ, FPS ๋ฑ์ ์ธก์ ํ๊ณ , ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๋ง์ดํฌ๋ก ์ฑ์ ์ด๋ํ ๋ ๋ฐ๋ณต ๋ค์ด๋ก๋๊ฐ ๋ฐ์ํ์ง ์๋๋ก CDN ์บ์ ํ์ฉ์ด๋ Module Federation์ shared ์ค์ ๋ฑ์ ์ต์ ํํด์ผ ํฉ๋๋ค (Micro Frontends) (Micro Frontends). ํนํ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์๋ ๋คํธ์ํฌ๊ฐ ์ด์ ํ ์ ์์ผ๋ฏ๋ก, ์ง์ญ๋ณ/๊ธฐ๊ธฐ๋ณ ์ฑ๋ฅ ๋ก๊ทธ๋ฅผ ์์งํด ๋ณ๋ชฉ์ ์ฐพ์๋ด๋ ์์ ์ด ์ค์ํฉ๋๋ค. ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ํน์ฑ์, ๊ฐ๋ณ ํ์ด์ง๋ ๊ฐ๋ฒผ์์ ธ๋ ์ ์ฒด ์ฌ์ดํธ๋ก ๋ณด๋ฉด ์ค๋ณต ๋ฆฌ์์ค๊ฐ ๋ ์ ์์์ ๋ช ์ฌํด์ผ ํฉ๋๋ค (Micro Frontends). ๋ฐ๋ผ์ “์ฒซ ๋ฐฉ๋ฌธ์ ๋น ๋ฅด์ง๋ง, ์ฌ๋ฌ ํ์ด์ง ์ด๋ ์ ๋งค๋ฒ ๋น์ทํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ ๋ถ๋ฌ์์ ๋๋ ค์ง์ง ์๋๊ฐ” ๋ฑ์ ์ ๊ฒํ๊ณ ๋์ฑ ์ ์ธ์์ผ ํฉ๋๋ค.
- ํต์ ๊ณผ ๋ฐ์ดํฐ ๊ด๋ฆฌ: ๊ฐ ๋ง์ดํฌ๋ก ์ฑ ๊ฐ์ ์ํ ๊ณต์ ๋ ํต์ ์ด ์ต์ํ๋๋๋ก ๊ฒฝ๊ณ๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ๋ง์ฝ ๊ณตํต์ผ๋ก ์จ์ผ ํ๋ ์ํ(์: ๋ก๊ทธ์ธ ์ํ, ์ฅ๋ฐ๊ตฌ๋ ํ๋ชฉ์)๊ฐ ์๋ค๋ฉด, ์ด๋ฅผ ์ ์ญ ์ํ ๊ด๋ฆฌ(์: ์ฟ ํค, localStorage, ๋๋ ์ปจํ ์ด๋์์ ์ ๊ณตํ๋ ๊ธ๋ก๋ฒ ์ํ ์๋น์ค)๋ก ํด๊ฒฐํ ์ง, ์๋๋ฉด ์ด๋ฒคํธ๋ฅผ ํตํด ํ์ํ ์์ ์ ์ ๋ฌํ ์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. ๋ฌด๋ถ๋ณํ ํฌ๋ก์ค ์ฑ ํธ์ถ์ ์์กด์ฑ์ ๋์ฌ ๋ง์ดํฌ๋ก์๋น์ค ์ทจ์ง์ ๋ง์ง ์์ผ๋ฏ๋ก, BFF(Backends for Frontends) ํจํด ๋ฑ์ ๋์ ํด ๊ฐ๋ฅํ ํ ๋ฐฑ์๋์์ ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ด ํ์ํ ๋ฐ์ดํฐ๋ง ์ ๊ณตํ๊ณ ํ๋ก ํธ์๋ ๊ฐ ์ง์ ํต์ ์ ์ค์ด๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). ๋ํ ๊ณตํต ์ธ์ฆ์ด๋ ๊ถํ ์ฒ๋ฆฌ๋ ์ปจํ ์ด๋ ์ฑ์ด ๋ด๋นํ๊ณ , ๊ฐ๋ณ ๋ง์ดํฌ๋ก ์ฑ์์๋ ํ ํฐ์ด๋ ์ปจํ ์คํธ๋ง ๋ฐ์์ ์ฌ์ฉํ๋ ์์ผ๋ก ์ญํ ์ ๋ถ๋ดํด์ผ ์ค๋ณต์ ์ค์ผ ์ ์์ต๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ).
- DevOps ๋ฐ ํ ์คํธ: ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ๋์ ์ ์ด์ ๋จ๊ณ์์ ๋ ๋ง์ ๊ตฌ์ฑ์์๋ฅผ ๋ค๋ฃจ๋ ์ผ์ ์๋ฏธํ๋ฏ๋ก, DevOps ์ญ๋์ด ๋ท๋ฐ์นจ๋์ด์ผ ํฉ๋๋ค (๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ ์ณ). CI ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ์ฌ ๊ฐ ์๋น์ค๊ฐ ๋น ๋ฅด๊ฒ ๋ฐฐํฌ๋๋๋ก ํ๊ณ , ๋ชจ๋ํฐ๋ง/๋ก๊น ์์คํ ์ ์ ๋นํด ์ด๋ ๋ถ๋ถ์์ ์๋ฌ๊ฐ ๋๋์ง ์ถ์ ํ ์ ์์ด์ผ ํฉ๋๋ค. ํนํ ์ฌ์ฉ์๊ฐ ๋ณด๋ ํ ํ๋ฉด์ ์ฌ๋ฌ ์๋น์ค๊ฐ ์ฝํ ์์ผ๋ฏ๋ก, ์ฅ์ ๋ฐ์ ์ ์ํฅ ๋ฒ์๋ฅผ ํ์ ํ๊ณ ๊ฒฉ๋ฆฌ ์กฐ์นํ๋ ์ ์ฐจ๋ฅผ ๋ง๋ จํด์ผ ํฉ๋๋ค. ์บ๋ฆฌ ๋ฆด๋ฆฌ์ค๋ ํผ์ฒ ํ ๊ธ ๊ธฐ๋ฒ์ ํ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ์๋ ๋ง์ดํฌ๋ก์ฑ๋ง ๋นํ์ฑํํ๊ฑฐ๋ ๋กค๋ฐฑํ์ฌ ์ ์ฒด ์๋น์ค ์ฅ์ ๋ฅผ ๋ง์ ์ ์์ต๋๋ค. ํ ์คํธ ์ธก๋ฉด์์๋ ๋จ์ ํ ์คํธ/ํตํฉ ํ ์คํธ ์ธ์ ๊ณ์ฝ ํ ์คํธ(contract test)๋ ์๋ํฌ์๋ ํ ์คํธ๋ฅผ ์ถ๊ฐ๋ก ๊ณ ๋ คํฉ๋๋ค. ๊ฐ ๋ง์ดํฌ๋ก ์ฑ์ด ์ค์ํด์ผ ํ ์ธํฐํ์ด์ค(API ์๋ต ํํ ๋ฑ)์ ๋ณํจ์ด ์๋์ง ์๋ํ๋ ๊ณ์ฝ ํ ์คํธ๋ฅผ ๋๋ฆฌ๊ณ , ํต์ฌ ์ฌ์ฉ์ ์๋๋ฆฌ์ค์ ๋ํด Cypress ๋ฑ์ผ๋ก e2e ํ ์คํธ๋ฅผ ๊ตฌ์ฑํด๋๋ฉด ํ์ง์ ์ ์งํ๋๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ ๋ต์ ๋์ ๊ณผ ๋จ๊ณ์ ํ์ฅ: ๋ง์ง๋ง์ผ๋ก, ์ฒ์๋ถํฐ ์ ์ฒด๋ฅผ ํ๊บผ๋ฒ์ ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ก ์ชผ๊ฐ๊ธฐ๋ณด๋ค๋ ์ ์ง์ ์ธ ๋์ ์ ๋ต์ด ๊ถ์ฅ๋ฉ๋๋ค. ์ฐ์ ๊ฐ์ฅ ๋ณ๋ชฉ์ด ๋๋ ๋ถ๋ถ์ด๋ ํ ๊ฐ ์ถฉ๋์ด ์ฌํ ์์ญ๋ถํฐ ํ์ผ๋ฟ์ผ๋ก ๋ถ๋ฆฌํด๋ณด๊ณ , ์ฑ๊ณต ๊ฒฝํ์ ๋ฐํ์ผ๋ก ๋ฒ์๋ฅผ ๋ํ๊ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ธฐ์กด ์์คํ ๊ณผ ๊ณต์กดํ๋ ๊ธฐ๊ฐ์๋ ์์๋ก ์์ดํ๋ ์์ ์ฐ๊ฑฐ๋, ํน์ ๊ธฐ์กด ๋ชจ๋๋ฆฌ์์ ํ ์ ์ฌ์ด ์๋ก์ด ๋ง์ดํฌ๋ก ์ฑ์ ํฌํจ์ํค๋ ๋ฐฉ์ ๋ฑ ํ์ด๋ธ๋ฆฌ๋ ์ ๋ต์ ์ทจํ ์ ์์ต๋๋ค (Incremental adoption of micro-frontends with Cloudflare Workers) (Incremental adoption of micro-frontends with Cloudflare Workers). ๋ํ ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ๋์ ์ด ๋น์ฆ๋์ค ๋ชฉํ์ ๋ง์๋จ์ด์ง๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์๋น์ค๊ฐ ๋น ๋ฅด๊ฒ ํผ๋ฒํ๊ฑฐ๋ ์ฌ๋ฌ ๋ ๋ฆฝ ์ ํ์ผ๋ก ํ์ฅํ๋ ค๋ ๋น์ ์ด ์๋ค๋ฉด ์ ํฉํ์ง๋ง, ๊ทธ๋ ์ง ์๊ณ ํ๋ ๊ธฐ๋ฅ๋ง ๋ถ๋ฆฌํด์ ํจ๊ณผ๊ฐ ๋ฏธ๋ฏธํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ ์ฌ๋ฐ๋ฅธ ์ํฉ์์ ์ ์ฉํ๋ฉด ํ ์์ฐ์ฑ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง๋ณด์์ฑ, ํ์ฅ์ฑ์ ํฌ๊ฒ ๋์ฌ์ค๋๋ค. ํ์ง๋ง ๋์ ์๋ ์ ์คํ ๊ณํ๊ณผ ํฌ์๊ฐ ํ์ํ๋ฉฐ, ๊ธฐ์ ์คํ ์ ์ ๋ถํฐ ์กฐ์ง ๋ฌธํ๊น์ง ๊ฑฐ๋ฒ๋์ค ์ธก๋ฉด์ ์ค๋น๊ฐ ์ ํ๋์ด์ผ ํฉ๋๋ค (The Truth Behind Micro Frontends: Insights from Real Case Studies). ์ด๋ฌํ ์ ๋ค์ ์ถฉ๋ถํ ๊ณ ๋ คํ๋ค๋ฉด, ๋ง์ดํฌ๋กํ๋ก ํธ์๋๋ ํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ๊ฐ ๋ ๊ฒ์ ๋๋ค.
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250326 TIL] image-rendering, translateZ(0) (0) | 2025.03.26 |
---|---|
[250318 TIL] ์ธ์ฑ์์ ํ๊ฒจ๋ฒ๋ฆฌ๊ณ ์ถ์๋ (0) | 2025.03.18 |
[250310 TIL] post-commit (0) | 2025.03.11 |
[250225 TIL] Hasura๋?(GPT์ง์) (0) | 2025.02.25 |
[250225 TIL] n8n ์ด๋?(GPT์ง์) (0) | 2025.02.25 |