5 min read

๋ฌด์ž‘์ • MFA ์ฒดํ—˜ํ•˜๊ธฐ - Module Federation

Table of Contents

์ตœ๊ทผ ํšŒ์‚ฌ์—์„œ MFA๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•ด ๋ณด์ž๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์–ด ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•ด๋‹น ๊ฐœ๋…์„ ์•Œ๊ฒŒ ๋œ ์ง€๋Š” ์–ผ๋งˆ ๋˜์ง€ ์•Š์•˜๋Š”๋ฐ, ์šฐ์„  MFA๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ธ Module Federation์„ ๊ฐ„๋‹จํžˆ ์ฒดํ—˜ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

MFA๋ž€?

MFA (Micro Frontend Architecture)๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์–ด ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ฐœ๋ฐœโ—ฆ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , ์ด๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํ†ตํ•ฉ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์ฝ”๋“œ์™€ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜์™€ ์žฌ์‚ฌ์šฉ์ด ์šฉ์ดํ•˜๊ณ , ์„œ๋กœ ๋…๋ฆฝ์ ์ธ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ์ง ์šด์˜์—๋„ ๋„์›€์ด ๋˜๋Š” ๋“ฑ ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค ๋˜๋Š” ์กฐ์ง์—์„œ ๊ฐ•์ ์„ ๋ณด์ด๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MFA๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“ค์–ด ๋นŒ๋“œ ๊ณผ์ •์—์„œ ํ†ตํ•ฉ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ณ , <iframe> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €ํฌ ์ธก์—์„œ๋Š” JavaScript ๋ฒˆ๋“ค์„ ๋Ÿฐํƒ€์ž„์—์„œ ๋กœ๋“œํ•ด์„œ ํ•ฉ์น˜๋Š” ๋ฐฉ์‹์ธ Module Federation์„ ๊ณ ๋ คํ–ˆ๊ณ  ์ด์ชฝ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Module Federation ์ ์šฉํ•ด ๋ณด๊ธฐ

์™ธ๋ถ€๋กœ ๋‚ด๋ณด๋‚ผ ์ปดํฌ๋„ŒํŠธ ํ˜ธ์ŠคํŠธ ํ™”๋ฉด

์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด CRA๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ 2๊ฐœ์˜ ์•ฑ์„ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ์ฒซ ํ™”๋ฉด(์ดํ•˜ ์™ธ๋ถ€)์˜ ์นด๋“œ๋ฅผ ํ˜ธ์ŠคํŠธ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์™ธ๋ถ€ ์นด๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ teamName, teamImgUrl ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜ธ์ŠคํŠธ ์นด๋“œ๋Š” ํŽธ์˜์ƒ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "teamName": "T1",
  "teamImgUrl": "<t1-url>",
  "playerName": "Faker",
  "playerImgUrl": "<faker-url>"
}

Module Federation์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” webpack์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ดˆ๊ธฐํ™”์—๋Š” npx webpack init ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ง์ ‘ ์„ค์น˜๋ฅผ ํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์„ค์ • ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ webpack.config.js ํŒŒ์ผ ์„ค์ •์ด์—ˆ์Šต๋‹ˆ๋‹ค.

const { ModuleFederationPlugin } = require("webpack").container;
const { FederatedTypesPlugin } = require("@module-federation/typescript");
// ...
const federationConfig = {
  name: "exportapp",
  filename: "remoteEntry.js",
  exposes: {
    "./Team": "./src/component/Team.tsx",
    "./types": "./src/@types/index.ts",
  },
  shared: {
    ...deps,
    react: { singleton: true, eager: true, requiredVersion: deps.react },
    "react-dom": {
      singleton: true,
      eager: true,
      requiredVersion: deps["react-dom"],
    },
    // ...
  },
};
// ...
const config = {
  entry: "./src/index.ts",
  // ...
  plugins: [
    // ...
    new ModuleFederationPlugin(federationConfig),
    new FederatedTypesPlugin({ federationConfig }),
  ],
  // ...
};
// ...

์œ„๋Š” ์™ธ๋ถ€ ๋ชจ๋“ˆ์˜ ์„ค์ • ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. federationConfig ๋ณ€์ˆ˜์— Module Federation ์„ค์ •์ด ๋“ค์–ด ์žˆ๋Š”๋ฐ, ์ฃผ๋ชฉํ•  ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • name์€ ์ „์ฒด ๋ชจ๋“ˆ์˜ ์ด๋ฆ„์œผ๋กœ, ๋‹ค๋ฅธ ์•ฑ๊ณผ ์ค‘๋ณต๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • filename์€ ๋‚ด๋ณด๋‚ผ ํŒŒ์ผ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • exposes๋Š” ์–ด๋–ค ์†Œ์Šค๋ฅผ ์–ด๋–ค ์ด๋ฆ„์œผ๋กœ ๋‚ด๋ณด๋‚ผ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
    name๊ณผ ํ•จ๊ป˜ ๋ชจ๋“ˆ ํ˜ธ์ถœ์— ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํžˆ ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Module Federation์— ํ•„์ˆ˜์ ์ธ ModuleFederationPlugin ์™ธ์—, TypeScript์—์„œ ํƒ€์ž… ๊ณต์œ ๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€๋กœ FederatedTypesPlugin์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์šฐ์•„ํ•œํ˜•์ œ๋“ค์—์„œ๋Š” ์–‘๋ฐฉํ–ฅ ํƒ€์ž… ๊ณต์œ ๋ฅผ ์œ„ํ•ด @module-federation/native-federation-typescript ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ €์˜ ๊ฒฝ์šฐ ์•„์ง ์–‘๋ฐฉํ–ฅ ํƒ€์ž… ๊ณต์œ ๋ฅผ ๊ณ ๋ คํ•  ๋‹จ๊ณ„๋Š” ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

// ...
const federationConfig = {
  name: "hostapp",
  remotes: {
    sample1: "exportapp@http://localhost:3001/remoteEntry.js",
  },
  shared: {
    // ...
  },
};
// ...

ํ˜ธ์ŠคํŠธ์˜ ์„ค์ • ํŒŒ์ผ๋„ ๊ฑฐ์˜ ๋™์ผํ•˜์ง€๋งŒ, ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด remotes ์˜ต์…˜์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ชจ๋“ˆ์—์„œ ์„ค์ •ํ•œ ์ด๋ฆ„๊ณผ ํŒŒ์ผ๋ช…, ๊ทธ๋ฆฌ๊ณ  ์ ‘๊ทผ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์„ค์ •์„ ๋งˆ์น˜๊ณ  ์„œ๋น„์Šค๋“ค์„ ์žฌ์‹คํ–‰ํ•˜๋ฉด ํ˜ธ์ŠคํŠธ์— ํƒ€์ž… ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ์— ์ƒ์„ฑ๋œ ํƒ€์ž… ํŒŒ์ผ

์ƒ์„ฑ๋œ ํƒ€์ž… ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ํ˜ธ์ŠคํŠธ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. VS Code ๊ธฐ์ค€ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ์—๋„ ํƒ€์ž…์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์™ธ๋ถ€ ๋ชจ๋“ˆ์„ ์œ„ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ

์นด๋“œ์— ๋“ค์–ด๊ฐ€๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ๋ฌธ์ œ์—†์ด ๋ชจ๋“ˆ์ด ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ชจ๋“ˆ

๋งˆ์ฃผ์ณค๋˜ ๋ฌธ์ œ๋“ค

  • ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ€์ผ ์ถฉ๋Œ ๋ฌธ์ œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
    ์ฒ˜์Œ์—๋Š” Shadow DOM์„ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆจ๊ฒจ์ง„ DOM์„ ๋งŒ๋“ค์–ด ์Šคํƒ€์ผ ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์‹์œผ๋กœ ๊ฐœ๋ณ„์ ์ธ ์Šคํƒ€์ผ ์ ์šฉ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ Shadow DOM์„ ์„ค์ •ํ•  ๋ช…ํ™•ํ•œ ๊ฒฝ๊ณ„๋ฅผ ์ •ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ํ˜„์žฌ ์ •์ฑ…์ด ๋ชจํ˜ธํ•ด์„œ ๊ตฌํ˜„์ด ์• ๋งคํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์˜ˆ์ œ๋งŒ ์ฐพ์•„ ๋‘๊ณ  ํ•„์š”ํ•  ๊ฒฝ์šฐ ์ ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ styled-components ๋“ฑ์˜ CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด์„œ๋Š” ์ •์ƒ์ ์œผ๋กœ ์Šคํƒ€์ผ ๋ถ„๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.
    ์œ„์— ๊ธฐ์ˆ ํ•œ ๋ฐฉ๋ฒ•๋„ ํด๋ž˜์Šค๋ช…์ด ์ค‘๋ณต๋˜๋ฉด ์ถฉ๋Œ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด, ๋ณ„๋„์˜ ๋‚ด๋ถ€ ๊ทœ์น™์„ ์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ™•์‹คํ•˜๋‹ค๋Š” ์˜๊ฒฌ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. (์„ธ๋ฌธ๋‹˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ˜Š)
  • Module Federation์€ ๋ณ„๋„์˜ ์„ค์ •์ด ์—†์„ ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ์— ์—ฐ๊ฒฐ๋œ UI ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋กœ๋“œ์— ์‹คํŒจํ•œ๋‹ค๋ฉด ํ˜ธ์ŠคํŠธ ์ „์ฒด๊ฐ€ ๋ฉˆ์ถ”๋Š” ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์Šˆ์—์„œ๋„ ํ•ด๋‹น ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•œ ํ”์ ์ด ์žˆ๊ณ  ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋‚˜ ๋กœ์šฐ๋ ˆ๋ฒจ API ๋“ฑ์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ผ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์‹œ๋„๋ฅผ ํ•ด ๋ณธ ๊ฒฐ๊ณผ ์ œ ๊ธฐ์ค€ ๊ฐ€์žฅ ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•์€ Error boundary๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๋‹ค์šด๋กœ๋“œ ์—๋Ÿฌ๋ฅผ ์žก๋Š” ๋ณ„๋„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ณต์œ  ๋ชจ๋“ˆ์„ ๊ฐ์‹ธ๊ณ , ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์™ธ๋ถ€ ๋ชจ๋“ˆ ์—๋Ÿฌ ์ฒ˜๋ฆฌ

์ฒดํ—˜ํ•ด ๋ณด๋ฉฐ ๋А๋‚€ ์ 

  • ์˜ˆ์ƒ์€ ํ–ˆ์ง€๋งŒ ์ƒ๊ฐ๋ณด๋‹ค ๋” ์„ค์ •์ด ๋ณต์žกํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ๋Š” webpack.config.js ํŒŒ์ผ์˜ ์ผ๋ถ€ ์„ค์ •๋งŒ ๋‹ค๋ฃจ์—ˆ์ง€๋งŒ tsconfig.json ์„ค์ •, ํŒจํ‚ค์ง€ ์ตœ์ ํ™” ๋“ฑ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๊ณผ์ •์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ ๋ฌธ์ œ๋Š” ์ฆ์ƒ๋งŒ ์ ์–ด ๋‘๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณต์žก๋„๊ฐ€ ๋†’์•„ ํฐ ์„œ๋น„์Šค์—์„œ๋Š” ์ด๋ฅผ ๊ฐ์ˆ˜ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ์„œ๋น„์Šค์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.
  • ์•„์ง ์ƒํƒœ๊ณ„๊ฐ€ ๋ฏธ์„ฑ์ˆ™ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž๋ฃŒ๋„ ์ฐพ๊ธฐ ์‰ฝ์ง€ ์•Š์•˜๊ณ , ๋ฌธ์„œ๋‚˜ ์˜ˆ์ œ๋„ ์„ค๋ช…์ด ๋ถ€์‹คํ•˜๊ฑฐ๋‚˜ ์ฐธ๊ณ ํ•˜๊ธฐ ํž˜๋“  ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.
    +) 2024.4์›” ๊ธฐ์ค€ ๊ณ„์† ๊ณต์‹ ํŽ˜์ด์ง€์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ์ด ๋ณ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ž์ž˜ํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ webpack ๊ฐœ๋ฐœ ์„œ๋ฒ„์™€ ํ˜ธํ™˜์ด ์ž˜ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

์˜ค๋žœ๋งŒ์— ๊นŠ๊ฒŒ ํ”„๋ก ํŠธ์—”๋“œ ๋ถ„์•ผ๋ฅผ ํŒŒ๊ณ ๋“ค์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ์‰ฝ์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด๊ฒƒ์ด ์ฃผ๋œ ์ž‘์—…์€ ์•„๋‹ˆ๊ณ , K8s ํ™˜๊ฒฝ์—์„œ MFA ํ…œํ”Œ๋ฆฟ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ๋ฐฐํฌ๊นŒ์ง€ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด ์ตœ์ข… ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. ์ดํ›„ ์ง„ํ–‰์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋ฉด ์ถ”๊ฐ€๋กœ ์ ์–ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €์˜ ์ž‘์—… ๋‚ด์—ญ์€ ์•„๋ž˜ Repository์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Repository ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฐธ๊ณ  ์ž๋ฃŒ