Module Federation

Module Federation

์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ์˜ ์ฝ”๋“œ ๊ณต์œ  ์ž์œ ๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•

  • ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜์˜ ํšจ์œจ์ ์œผ๋กœ ์ผํ•˜๋Š” ์ตœ๋Œ€ํ•œ์˜ ๋ฐฉ๋ฒ•

  • ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ "์ž์œ ๋กœ์šด ๋ชจ๋“ˆ" ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ

  • ๋ถ„๋ฆฌ๋œ ๋ชจ๋“ˆ์„ "๋™์ ์œผ๋กœ ๋กœ๋“œ"

  • Webpack์˜ Module Federation์„ ์‚ฌ์šฉ

    • Production ์ฝ”๋“œ๋“ค์„ Webpack์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์•”๋ฌต์ ์ธ ๋ฃฐ์ด ์ƒ๊ธฐ๊ฒŒ๋จ

    • Vite์™€ ๊ฐ™์ด ๊ฒฐ๊ณผ ํŒŒ์ผ์ด Webpack์œผ๋กœ ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋“ค์ด ๋งŽ์Œ

ํ˜‘์—…์˜ ์• ๋งคํ•œ ํฌ์ธํŠธ

  • Monorepo์˜ ๊ณต์œ  ๋‹จ์œ„๋Š”?

    • ์™„์„ฑ๋œ ์ปดํฌ๋„ŒํŠธ, ๊ณตํ†ต์˜ ์ฝ”๋“œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, API

    • ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์–ด๋– ํ•œ "์ฝ”๋“œ"

ํ˜‘์—…ํ•  ๋•Œ ์• ๋งคํ•œ ํฌ์ธํŠธ๋Š” ํ•ญ์ƒ ์ถ”๊ฐ€๋œ๋‹ค.

ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€์— ๋‘ ํŒ€์ด ํ™”๋ฉด์˜ ๋ฐ˜๋ฐ˜์”ฉ์„ ๊ฐœ๋ฐœํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ

๊ณตํ†ต์˜ ์ฝ”๋“œ๋กœ ์„œ๋กœ ์–ผ๋งˆ๋‚˜ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๊ณต์œ ํ•˜๊ณ  ์‹ถ๋‹ค.

๊ณตํ†ต์˜ ๋ Œ๋”๋ง์„ ๋‹ด๋‹นํ•˜๋Š” ์ฃผ์ฒด์™€ ์ฝ˜ํ…์ธ ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ฃผ์ฒด๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ

  • Host Application, Remote Application ๊ฐœ๋…์œผ๋กœ ์ ‘๊ทผ

    • Host Application: ๋ชจ๋“  ๊ฒƒ๋“ค์„ ์ทจํ•ฉํ•ด์„œ ๋ Œ๋”๋ง์‹œ์ผœ์คŒ

    • Remote Application: ํŠน์ •ํ•œ ์˜์—ญ๋งŒ ๋ Œ๋”๋ง, ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰

    • ๋ถ„๋ฆฌ๋œ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ ๋‹จ์œ„๋กœ ์šด์˜์ด๋จ

  • Module Federation์€ "์ž์œ ๋กœ์šด ๋ชจ๋“ˆ ๋‹จ์œ„"๋กœ ์บก์Šํ™”๋ฅผ ํ•ด์ค€๋‹ค.

  • Repository ๋‹จ์œ„๋กœ ์„œ๋กœ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•œ๋‹ค.

  • Host-Remote ๊ตฌ์กฐ๋กœ ๋‚˜๋‰˜๋ฉฐ, Host Application์ด ์ตœ์ข… ๋ Œ๋”๋ง์„ ๊ฒฐ์ •ํ•˜๊ณ , Remote Application์€ Host์— ๋“ฑ๋ก๋œ๋‹ค.

์žฅ์ 

  • ํ˜‘์—… ์‹œ์˜ ๋ชจ๋“ˆ ๋‹จ์œ„ ๊ณต์œ ๋ฅผ ํ†ตํ•œ ์ƒ์‚ฐ์„ฑ ๊ฐ•ํ™”

  • ํŒ€ ๋‚ด ์ž‘์€ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœํ•˜์—ฌ ์ฝ”๋“œ ์‘์ง‘ ๋ฐ ์บก์Šํ™”๋ฅผ ํ†ตํ•œ ๋ณ€๊ฒฝ์— ๊ฐ•ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ

    • ๋ชจ๋“ˆ ๋‹จ์œ„๊ฐ€ ๋ ˆ์ด์•„์›ƒ ๋‹จ์œ„๋กœ๋„ ๊ฐ€๋Šฅ

  • ๋ชจ๋…ธ๋ ˆํฌ ๋‚ด๋ถ€์—์„œ๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ชจ๋…ธ๋ ˆํฌ์™€ ์ƒ๊ด€์—†์ด ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ์ถ•์ ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ์‹œ ํ™•์žฅ์„ฑ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Œ

  • ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋‚จ๊ธฐ ๋•Œ๋ฌธ์— ํžˆ์Šคํ† ๋ฆฌ ์ถ”์ ์˜ ์šฉ์ด

๋‹จ์ 

  • ๊ทœ๋ชจ๊ฐ€ ์ž‘์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ๋˜๋ ค ๋ณต์žกํ•ด์ง€๋Š” ๊ตฌ์กฐ๋กœ ์ƒ์‚ฐ์„ฑ์ด ํ•˜๋ฝ๋  ์ˆ˜ ์žˆ์Œ

  • ๊ฐœ๋ฐœ ๋ฐ ์šด์˜์˜ ํ•™์Šต์ด ํ•„์š”ํ•œ ๋‚œ์ด๋„๊ฐ€ ์žˆ์Œ

  • 100% ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ํž˜๋“  ์•„์ง ์—ฐ๊ตฌ๊ฐ€ ์ง„ํ–‰์ค‘์ธ ๋ถ€๋ถ„์ด ๋‹ค์ˆ˜ ์žˆ์Œ

  • ๋™์  ๋กœ๋“œ ์ƒํ™ฉ์—์„œ์˜ ๋ณด์•ˆ์˜ ์ทจ์•ฝ์  ์กด์žฌ

    • ๋™์  ๋กœ๋“œ๋œ ๊ฒƒ์„ ์Šค๋‹ˆํ•‘์„ ํ•ด์™€์„œ ๋‹ค๋ฅด๊ฒŒ ์กฐ์ž‘ํ•˜์—ฌ ๋‹ค์‹œ ๋ชจ๋“ˆ์„ ๋„ฃ๋Š” ๋“ฑ์˜ ๋ณด์•ˆ์˜ ์œ„ํ—˜์„ฑ ์กด์žฌ

    • ์›น ํ™˜๊ฒฝ ์ž์ฒด๊ฐ€ ๋ณด์•ˆ์˜ ์ทจ์•ฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ ..

Module Federation Architecture

Infra Architecture

  • Host, Remote๊ฐ€ ์–ด๋– ํ•œ ํ˜•ํƒœ๋กœ S3 ๋ฒ„ํ‚ท์— ๋นŒ๋“œ ํŒŒ์ผ ์ €์žฅ์ด ๋œ๋‹ค.

  • Module Federation์€ React Component Rendering ๋‹จ๊ณ„์— Remote Application์„ ๋ Œ๋”๋งํ•œ๋‹ค. (๋™์  ๋กœ๋“œ)

Host Application

  • https://github.com/module-federation

    • ๊ฑฐ์˜ ์œ ์ผ๋ฌด์ดํ•œ module-federation organization

    • ํ•ด๋‹น ์ฝ”๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ€๋‹ค์ˆ˜์˜ module federation์ด ์ด๋ฃจ์–ด์ง

  • Webpack.config.js

    • name: ๋ถˆ๋Ÿฌ์˜ฌ ์•ฑ์˜ ์ด๋ฆ„๊ณผ ์—ฐ๊ด€

    • remoteEntity: ๋ชจ๋“ˆ ๋ฐ์ด๊ฑฐ ๋‹ด๊ธฐ๊ฒŒ ๋จ

    • remotes: ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ฌ remote ์ฃผ์†Œ (remoteEntry.js๋ฅผ ๋“ฑ๋กํ•˜๋ฉด ๋จ)

    • shared: react, react-dom์€ ๋ชจ๋“ˆ ํŽ˜๋”๋ ˆ์ด์…˜์—์„œ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ณต์œ ๋จ

Remote Application

  • webpack.config.js

    • name: ๋ถˆ๋Ÿฌ์˜ฌ ์•ฑ์˜ ์ด๋ฆ„๊ณผ ์—ฐ๊ด€

    • remoteEntry: ๋ชจ๋“ˆ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊น€

    • exposes: ๋ชจ๋“ˆ์„ ๋ฐ–์œผ๋กœ ๋‚ด๋ณด๋‚ธ๋‹ค.

    • shared: react, react-dom์€ ๋ชจ๋“ˆ ํŽ˜๋”๋ ˆ์ด์…˜์—์„œ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ณต์œ  ๋จ

  • Host Application์— ๋Œ€ํ•œ ์ฃผ์†Œ๋Š” ์ ์ง€ ์•Š๋Š”๋‹ค.

Remote Application์€ ์™„์ „ํ•œ ๋ชจ๋“ˆ๋กœ์„œ exposes ๋ฅผ ํ†ตํ•ด ๋ฐ–์œผ๋กœ ๋‚ด๋ณด๋‚ธ๋‹ค.

Host Application์€ expose๋œ application๋งŒ ๋“ฑ๋กํ•˜๊ณ ์„œ ๋ Œ๋”๋งํ•ด์ฃผ๋ฉด Remote Application์—์„œ ๋™์ ์œผ๋กœ ์ˆ˜์ •ํ•ด๋„ ๋ฐ˜์˜๋˜๊ฒŒ๋”

Rendering

  • Host์—์„œ Remote๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

    • Remote ๋ชจ๋“ˆ์—์„œ ๋ฒ„ํŠผ์„ ๊ฐ€์ ธ์™€ ๋กœ๋“œํ•œ๋‹ค.

  • ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— React.Suspense๋กœ ๋กœ๋“œ๋  ๋•Œ์˜ fallback์„ ์„ค์ •

Retmoe module ํ˜ธ์ถœ ํƒ€์ด๋ฐ

์ •๋ฆฌ

  • Module Federation์€ ๋Ÿฐํƒ€์ž„์—์„œ ๋‹ค์ด๋‚˜๋ฏน๋กœ๋“œ๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ

  • ์˜์กด๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ๋ ˆํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด๋„ ๋ชจ๋“ˆ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•

  • ์—ฌ๋Ÿฌ ํŒ€์ด ์„ ๋ฐœ๋˜์–ด์žˆ๋Š” ํšŒ์‚ฌ์—์„œ ์ ํ•ฉํ•˜๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

Last updated