๐ Next.js ์ฌํ 12์ฅ: Micro-Frontend & Multi-Zones โ ๊ฑฐ๋ ๊ณต๋ฃก์ ์กฐ๊ฐ๋ด์ด ๋ค์ค๋ฆฌ๊ธฐ
๐ ๊ฐ์
Next.js Multi-Zones๋ก ๊ฑฐ๋ ์ฑ์ ๋ ๋ฆฝ ๋ฐฐํฌ ๊ฐ๋ฅํ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ก ๋ถ๋ฆฌํฉ๋๋ค.
๐ ๋ชฉ์ฐจ
- ๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
- ๐ค ์ ์์์ผ ํ๋๊ฐ
- ๐๏ธ ๋น์ ๋ก ๋จผ์ ์ดํดํ๊ธฐ
- ๐บ๏ธ Multi-Zones vs Module Federation ๐ข
- ๐๏ธ Multi-Zones ์ํคํ ์ฒ ์ค๊ณ ๐ก
- ๐งฉ ๊ณต์ ์ปดํฌ๋ํธ์ ํจํค์ง ์ ๋ต ๐ก
- ๐ ์ค์ ! next.config.ts์์ Zone ์ฐ๊ฒฐํ๊ธฐ ๐ด
- ๐ฅ ์๋ฌ ํด๊ฒฐ ์นดํ๋ก๊ทธ
- ๐ ์ด๋ฒ์ ๋ฐฐ์ด ๋ด์ฉ ์ด์ ๋ฆฌ
- ๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
- ๐ ๋ ์์๋ณด๊ธฐ
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 20๋ถ (์ ์ฒด) / ํต์ฌ ํํธ๋ง: 10๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ์์(PM): "์ํธ ๋, ์ฐ๋ฆฌ ์ปค๋ฎค๋ํฐ๊ฐ ๋๋ฌด ์ปค์ ธ์ ๋น๋ ํ ๋ฒ์ 15๋ถ์ด๋ ๊ฑธ๋ ค์! ๊ฐ๋ฐ ์๋๊ฐ ๋๋ฌด ๋๋ ค์ก๋๋ฐ ๋ฐฉ๋ฒ ์๋์?"
- ์ํธ(๋ฆฌ๋): "์ฝ๋๊ฐ ๋๋ฌด ๊ฑฐ๋ํด์ ธ์ ๊ทธ๋์. ์ด์ '์ปค๋ฎค๋ํฐ ๋ฉ์ธ', '์ค์๊ฐ ์ฑํ ', '๋ง์ผ'์ ๊ฐ๊ฐ ๋ณ๋์ Next.js ์ฑ์ผ๋ก ์ชผ๊ฐ์ผ ํ ๋๊ฐ ๋๋ค์."
- ์์ฒ (์ฃผ๋์ด): "์ด? ์ฑ์ ์ชผ๊ฐ๋ฉด ์ ์ ๊ฐ ํ์ด์ง ์ด๋ํ ๋ ์๋ก๊ณ ์นจ ๋์์์! SPA ๊ฐ์ ๋๋์ด ์ ๋๋ฉด ์ด์ฉ์ฃ ?"
- ์ํธ: "๊ทธ๋์ Multi-Zones๊ฐ ํ์ํ ๊ฑฐ์์. ์ ์ ๋ ํ๋์ ์ฑ์ธ ์ค ์์ง๋ง, ์ค์ ๋ก๋ ์ฌ๋ฌ ์ฑ์ด ํ์ ํ๋ ๊ฑฐ์ฃ ."
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- ๊ฑฐ๋ํด์ง Next.js ์ฑ์ ์๋ฏธ ์๋ ๋จ์(Zones)๋ก ๋ถ๋ฆฌํ ์ ์๋ค
- ๋น๋ ์๋์ ๋ฐฐํฌ ๋จ์๋ฅผ ๋ ๋ฆฝ์์ผ ํ๋ณ ์์ฐ์ฑ์ ๊ทน๋ํํ ์ ์๋ค
-
rewrites๋ฅผ ์ด์ฉํด ์ฌ๋ฌ Next.js ์ฑ์ ํ๋์ ๋๋ฉ์ธ์ผ๋ก ๋งค๋๋ฝ๊ฒ ์ฐ๊ฒฐํ ์ ์๋ค
๐ค ์ ์์์ผ ํ๋๊ฐ
์๋น์ค๊ฐ ์ฑ์ฅํ๋ฉด ์ฝ๋๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋์ด๋. ์ด๊ฑธ ๋ชจ๋๋ฆฌ์(Monolithic) ํ๋ก ํธ์๋๋ผ๊ณ ํด.
๋ฌธ์ ๋ ์ฝ๋๊ฐ ๋์ด๋ ์๋ก ๋น๋๊ฐ ๋๋ ค์ง๊ณ , ํ ๋ช
์ ์ค์๋ก ์ ์ฒด ์๋น์ค๊ฐ ์ค๋จ๋ ์ํ๋ ์ปค์ง๋ค๋ ๊ฑฐ์ผ.
๋ง์ดํฌ๋ก ํ๋ก ํธ์๋(MFE) ๋ ์ด ๊ฑฐ๋ํ ์ฑ์ ์๊ฒ ์ชผ๊ฐ๋ ์ฒ ํ์ด์ผ.
Next.js์์๋ ์ด๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ๊ณ ์์ (Native)์ธ ๋ฐฉ์์ด ๋ฐ๋ก Multi-Zones์ผ.
์๋์ด์ ์ธ์ฌ์ดํธ:
"Module Federation(Webpack ์ ์ฉ)์ ๊ฐ๋ ฅํ์ง๋ง ์ค์ ์ด ๋ช์ด๊ณ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR) ์ง์์ด ๊น๋ค๋ก์์. ํ์ง๋ง Next.js์ Multi-Zones๋rewrites๊ธฐ๋ฐ์ด๋ผ SSR๋ ์๋ฒฝํ๊ณ ๊ตฌ์กฐ๋ ํจ์ฌ ๋จ์ํ์ฃ . ๋๊ท๋ชจ ๊ธฐ์ (Vercel, Uber, TikTok ๋ฑ)๋ค์ด ์ด ๋ฐฉ์์ ์ ํธํ๋ ์ด์ ์์."
๐๏ธ ๋น์ ๋ก ๋จผ์ ์ดํดํ๊ธฐ
๐ข ๋ฐฑํ์ ์ผ๋ก ์ค๋ช ํ๋ค๋ฉด?
๊ฑฐ๋ํ ๋ฐฑํ์ ๊ฑด๋ฌผ ํ๋๋ฅผ ๊ด๋ฆฌํ๋ ๊ฑด ํ๋ค์ด. ์ ๊ธฐ๊ฐ ๋๊ฐ๋ฉด ๋ชจ๋ ์ธต์ด ๋ค ์ด๋์์ง์์.
- ๋ชจ๋๋ฆฌ์: ๊ฑด๋ฌผ์ด ํต์งธ๋ก ํ๋์ธ ๋ฐฑํ์ .
- Multi-Zones: 1์ธต์ ๋ช ํ์กด(Next.js ์ฑ A), 2์ธต์ ํธ๋์ฝํธ(Next.js ์ฑ B), 3์ธต์ ์ํ๊ด(Next.js ์ฑ C)์ผ๋ก ์ฃผ์ธ์ด ๊ฐ๊ฐ ๋ฐ๋ก ์๋ ๊ฑฐ์ผ.
์๋(์ ์ )์ ์๋ฆฌ๋ฒ ์ดํฐ(๋ค๋น๊ฒ์ด์ )๋ฅผ ํ๊ณ ์ธต์ ์ด๋ํด. 1์ธต(๋ช ํ) ์ฃผ์ธ์ ์งํ์ค ๊ณต์ฌ๋ฅผ ํด๋ 2์ธต(ํธ๋์ฝํธ) ์์ ์๋ ์ง์ฅ์ด ์์ง. ์๋ ์ ์ฅ์์๋ ์ฌ์ ํ ํ๋์ '๋ฐฑํ์ '์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ฌ.
๐บ๏ธ Multi-Zones vs Module Federation ๐ข
๐ฏ ์ด ์น์ ์ ์ฝ๊ณ ๋๋ฉด:
- ํ๋ก์ ํธ ๊ท๋ชจ์ ๋ง๋ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ ๋ต์ ์ ํํ ์ ์๋ค.
| ๋น๊ต ํญ๋ชฉ | Multi-Zones (Next.js ์์ ) | Module Federation (Webpack/Rspack) |
|---|---|---|
| ์๋ ์๋ฆฌ | ๋ผ์ฐํ
๊ธฐ๋ฐ ํตํฉ (rewrites) | ๋ฐํ์ ์ฝ๋ ์ฃผ์ (JavaScript ๊ณต์ ) |
| ํตํฉ ๊ฐ๋ | ๋์จํ ๊ฒฐํฉ (์ฑ์ด ์์ ํ ๋ถ๋ฆฌ๋จ) | ๊ฐํ ๊ฒฐํฉ (์ปดํฌ๋ํธ ๋จ์๋ฅผ ๊ณต์ ) |
| SSR ์ง์ | โ ์๋ฒฝ ์ง์ (๊ฐ์ฅ ํฐ ์ฅ์ ) | โ ๏ธ ๊น๋ค๋ก์ (์๋ฒ ์ฌ์ด๋ ๋๊ธฐํ ํ์) |
| ๊ตฌํ ๋์ด๋ | ๐ข ์ฌ์ (Config ์ค์ ์์ฃผ) | ๐ด ์ด๋ ค์ (๋น๋ ๋๊ตฌ ์ฌํ ์ง์ ํ์) |
| ์ถ์ฒ ์ํฉ | ๋๋ฉ์ธ/๊ฒฝ๋ก ๋จ์๋ก ๋ช ํํ ์ชผ๊ฐ์ง ๋ | ๋์๋ณด๋ ์์ ฏ์ฒ๋ผ ์์ฌ์์ ๋ |
๐๏ธ Multi-Zones ์ํคํ ์ฒ ์ค๊ณ ๐ก
1์ฐจ ์ ๋ต: ๋๋ฉ์ธ ๋งคํ
๊ฐ์ฅ ๋จผ์ 'Host'(์ ๊ตฌ) ์ฑ๊ณผ 'Child'(์๋ธ) ์ฑ์ ์ ํด์ผ ํด.
- Host (Main):
youngsu.com/(๋ฉ์ธ ํ, ๊ณตํต ๋ ์ด์์) - Zone 1 (Chat):
youngsu.com/chat(์ค์๊ฐ ์ฑํ ์ฑ) - Zone 2 (Market):
youngsu.com/market(์์ดํ ๊ฑฐ๋ ์ฑ)
2์ฐจ ์ ๋ต: ์์ฐ(Assets)์ ๊ณ ์ ์ฑ
๊ฐ ์ฑ์ _next/static ๊ฒฝ๋ก๊ฐ ๊ฒน์น๋ฉด ์ ๋ผ! ๊ทธ๋์ assetPrefix๋ฅผ ๋ค๋ฅด๊ฒ ์ค์ ํด์ผ ํด.
๐ ์ค์ ! next.config.ts์์ Zone ์ฐ๊ฒฐํ๊ธฐ ๐ด
1๋จ๊ณ: ์๋ธ ์ฑ(Chat) ์ค์
์์ฒ ์ด๊ฐ ๋ง๋ ์ฑํ ์ฑ์ ์ค์ ์ด์ผ.
// apps/chat/next.config.ts
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
// โ
ํต์ฌ 1: ๋น๋๋ JS/CSS ํ์ผ๋ค์ด ๊ฒน์น์ง ์๊ฒ ๊ฒฝ๋ก๋ฅผ ๋นํ์ด์ค
assetPrefix: '/chat-static',
// โ
ํต์ฌ 2: ๋ด๋ถ ๋ผ์ฐํ
์ด /chat ๋ฐ์์๋ง ๋์๊ฐ๋๋ก ๊ณ ์
basePath: '/chat',
// ์ ์ ์์ฐ ์์ฒญ์ assetPrefix๋ก ๋ค์ ๋๋ ค์ฃผ๋ ์ค์
async rewrites() {
return [
{
source: '/chat-static/_next/:path*',
destination: '/_next/:path*',
},
];
},
};
export default nextConfig;2๋จ๊ณ: ๋ฉ์ธ ํธ์คํธ(Main) ์ค์
์ํธ๊ฐ ๊ด๋ฆฌํ๋ ๋ฉ์ธ ๊ฒ์ดํธ์จ์ด ์ค์ ์ด์ผ.
// apps/main/next.config.ts
import type { NextConfig } from "next";
const CHAT_URL = process.env.CHAT_APP_URL || 'http://localhost:3001';
const nextConfig: NextConfig = {
async rewrites() {
return [
// โ
ํต์ฌ: /chat์ผ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ์ฑํ
์๋ฒ(Zone 1)๋ก ํ ์ค!
{
source: '/chat',
destination: `${CHAT_URL}/chat`,
},
{
source: '/chat/:path*',
destination: `${CHAT_URL}/chat/:path*`,
},
// โ
์ ์ ํ์ผ๋ ์๋ผ์ด๋๋ก ํ ์ค
{
source: '/chat-static/_next/:path*',
destination: `${CHAT_URL}/chat-static/_next/:path*`,
}
];
},
};
export default nextConfig;๐งฉ ๊ณต์ ์ปดํฌ๋ํธ์ ํจํค์ง ์ ๋ต ๐ก
๐ค ์ ๊น, ๋จผ์ ์๊ฐํด๋ด
์ฑ์ ์ชผ๊ฐฐ๋๋ฐ 'Header'๋ 'Footer' ์ฝ๋๋ฅผ ๋ชจ๋ ์ฑ์ ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ฉด ๊ด๋ฆฌํ ์ ์์๊น?
๋น์ฐํ ์ ๋๊ฒ ์ง. ๊ทธ๋์ Turborepo ๊ฐ์ ๋ชจ๋ ธ๋ ํฌ ๋๊ตฌ๋ฅผ ์จ์packages/ui๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํด์ผ ํด.
์ํธ์ Pro-Tip:
"์ํ ๊ด๋ฆฌ(Redux, Query)๋ฅผ ์ฌ๋ฌ Zone์์ ๊ณต์ ํ๋ ๊ฑด ๊ถ์ฅํ์ง ์์์. ๊ฐ Zone์ ๋
๋ฆฝ์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ๊ณต์ ๊ฐ ๊ผญ ํ์ํ๋ค๋ฉด Shared Cookie๋ URL ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐ์ธ์. ๊ทธ๊ฒ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ต๊ฒ '๋์จํ๊ฒ ์ฐ๊ฒฐ๋' ์ํ๊ฑฐ๋ ์."
๐ ์ด๋ฒ์ ๋ฐฐ์ด ๋ด์ฉ ์ด์ ๋ฆฌ
๐ Multi-Zones ์ฒดํฌ๋ฆฌ์คํธ
| ๋จ๊ณ | ์์ ๋ด์ฉ | ์ด์ |
|---|---|---|
| basePath | ์๋ธ ์ฑ์ ๊ฒฝ๋ก ๊ณ ์ (/chat) | ๋ผ์ฐํ ์ถฉ๋ ๋ฐฉ์ง |
| assetPrefix | ์ ์ ์์ฐ ๊ฒฝ๋ก ๊ณ ์ ํ | JS/CSS ํ์ผ ๋ฎ์ด์ฐ๊ธฐ ๋ฐฉ์ง |
| rewrites | ํธ์คํธ ์ฑ์์ ์๋ธ ์ฑ ์ฐ๊ฒฐ | ์ ์ ์๊ฒ ํ๋์ ์ฑ์ฒ๋ผ ๋ณด์ด๊ฒ ํจ |
โ ๏ธ ์ ๋ ํ์ง ๋ง ๊ฒ
| ์ํฉ | โ ๋์ ์ | โ ์ข์ ์ |
|---|---|---|
| ์ฑ ์ฐ๊ฒฐ | ํ๋์ฝ๋ฉ๋ ๋๋ฉ์ธ (market.com) | rewrites๋ฅผ ํตํ ๊ฒฝ๋ก ๊ธฐ๋ฐ ํตํฉ |
| ์์ ๊ณต์ | ๋ชจ๋ ์ฑ์ด ํ๋์ Redux Store ๊ณต์ | ๊ฐ ์ฑ๋ณ ๋ ๋ฆฝ Store + ์ต์ํ์ ์ํ ๊ณต์ |
| ๋ฐฐํฌ | ํ๋์ ๊ฑฐ๋ํ ๋น๋ ๋ฐฐํฌ | Zone ๋จ์ ๋ ๋ฆฝ ๋น๋ & ๋ ๋ฆฝ ๋ฐฐํฌ |
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. Multi-Zones์์ assetPrefix๋ฅผ ์ค์ ํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ?
โ ์ ๋ต: ์ฌ๋ฌ Next.js ์ฑ์ /_next/static ์์ฐ ๊ฒฝ๋ก๊ฐ ์ถฉ๋ํ์ง ์๊ฒ ํ๊ธฐ ์ํด์๋ค.
๐ก ์์ธ ํด์ค: ๊ฐ Zone์ ๋ ๋ฆฝ๋ Next.js ์ฑ์ด์ง๋ง ๊ฐ์ ๋๋ฉ์ธ ์๋ ํฉ์ณ์ง ์ ์๋ค. ์์ฐ ๊ฒฝ๋ก๊ฐ ๊ฒน์น๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค๋ฅธ ์ฑ์ JS/CSS๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์บ์๊ฐ ๊ผฌ์ผ ์ ์๋ค. assetPrefix๋ Zone๋ง๋ค ์ ์ ์์ฐ์ ์ถ์ฒ๋ฅผ ๋ถ๋ฆฌํ๋ ์์ ์ฅ์น๋ค.
Q2. ๋ฉ์ธ ์ฑ์์ /chat ์์ฒญ์ ์ฑํ Zone์ผ๋ก ๋ณด๋ด๋ฉด์ ์ฃผ์์ฐฝ์ ์ ์งํ๋ ค๋ฉด ์ด๋ค ์ค์ ์ด ํ์ํ๊ฐ?
โ ์ ๋ต: next.config์ rewrites ๋๋ ํ๋ก์ ๊ณ์ธต์์ /chat/:path*๋ฅผ ์ฑํ ์ฑ์ URL๋ก ๋งคํํ๋ค.
๐ก ์์ธ ํด์ค: redirect๋ ์ฌ์ฉ์ ์ฃผ์๋ฅผ ๋ฐ๊พธ๊ณ ์ฑ ๊ฒฝ๊ณ๋ฅผ ๋๋ฌ๋ธ๋ค. Multi-Zones๋ ์ฌ์ฉ์์๊ฒ ํ๋์ ๋๋ฉ์ธ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ฉด์ ๋ด๋ถ์ ์ผ๋ก ์์ฒญ์ ๋ค๋ฅธ Zone์ ๋ณด๋ธ๋ค. ๊ณต์ ๊ฐ์ด๋๋ Zone์ ์ผ๋ฐ Next.js ์ฑ์ด๋ฉฐ ๋ผ์ฐํ ๊ณ์ธต์ด ์ฌ๋ฐ๋ฅธ Zone์ผ๋ก ์์ฒญ์ ์ ๋ฌํ๋ค๊ณ ์ค๋ช ํ๋ค.
Q3. ์์ฒ ์ด์ ํ ์คํธ ํ์: ์ฑํ ํ๋ง Next.js ์ ๋ฒ์ ์ผ๋ก ๋จผ์ ์ฌ๋ฆฌ๊ณ ์ถ๋ค. Multi-Zones๊ฐ ๋์ ๋๋ ์ง์ ๊ณผ ์กฐ์ฌํ ์ง์ ์ ๋ฌด์์ธ๊ฐ?
โ ์ ๋ต: Zone๋ณ ๋ ๋ฆฝ ๋ฐฐํฌ์ ๋ฒ์ ์ ํ์ ์ฌ์์ง์ง๋ง, ๊ณต์ UI/์ธ์ฆ/๊ด์ธก ๊ท์น์ ํจํค์ง์ ๊ณ์ฝ์ผ๋ก ๋ช ํํ ๊ด๋ฆฌํด์ผ ํ๋ค.
๐ก ์์ธ ํด์ค: Multi-Zones๋ ์กฐ์ง ๊ฒฝ๊ณ๋ฅผ ๊ธฐ์ ๊ฒฝ๊ณ๋ก ๋ฐ์ํ ๋ ๊ฐํ๋ค. ํ์ง๋ง ์ ์ญ ์ํ๋ฅผ ์ฝ๊ฒ ๊ณต์ ํ๋ ๊ตฌ์กฐ๊ฐ ์๋๋ฏ๋ก ๋ก๊ทธ์ธ ์ธ์ , ๋์์ธ ์์คํ , ์ด๋ฒคํธ ์ถ์ ์ด๋ฆ์ด ํฉ์ด์ง๊ธฐ ์ฝ๋ค. ์ํธ๋ผ๋ฉด "์ชผ๊ฐค ์ ์๋๊ฐ"๋ณด๋ค "์ชผ๊ฐ ๋ค ๊ณ์ฝ์ ์ ์งํ ์ ์๋๊ฐ"๋ฅผ ๋จผ์ ๋ฌป๋๋ค.
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋์ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ฅผ ์ฑ์ ์๊ฒ ์ชผ๊ฐ๋ ๊ธฐ์ ๋ก๋ง ๋ณด์ง ์๊ฒ ๋๋ค. ๋น๋ ์๊ฐ, ํ ์์จ์ฑ, ๋ฒ์ ์ ๊ทธ๋ ์ด๋ ์๋ ๊ฐ์ ์กฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ง๋ง, ๊ทธ๋งํผ ๊ฒฝ๊ณ ๊ณ์ฝ์ ๋ ์๊ฒฉํ ์ธ์์ผ ํ๋ค.
๐ก "Multi-Zones๋ ์ฝ๋ ๋ถ๋ฆฌ๊ฐ ์๋๋ผ ํ ๊ฐ ์ฑ ์ ๊ฒฝ๊ณ๋ฅผ URL๊ณผ ๋ฐฐํฌ ๋จ์๋ก ๋๋ฌ๋ด๋ ์ ํ์ด๋ค."
๋ค์์ ํฐ ๊ธฐ๋ฅ์ ๋ณ๋ Zone์ผ๋ก ๋นผ์๋ ์ด์ผ๊ธฐ๊ฐ ๋์ค๋ฉด assetPrefix์ rewrites๋ง ๋ณด์ง ์๊ฒ ๋ค. ์ธ์ฆ ์ฟ ํค ๋ฒ์, ๊ณตํต ํจํค์ง ๋ฒ์ , ์ฅ์ ๊ฐ ํ Zone์ ๋จธ๋ฌด๋ฅด๋์ง, ๋ก๊ทธ๊ฐ ํ ์ฌ์ฉ์ ์ฌ์ ์ผ๋ก ์ด์ด์ง๋์ง๊น์ง ๊ฐ์ด ์ฒดํฌํ๊ฒ ๋ค.