ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํ ํจ๊ณผ์ ์ธ ์๋น์ค ๊ฒ์ ๋ฐ ํต์ ๊ธฐ์ ์ ์ค์ ์ ๋ ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค์ ์ธ๊ณ๋ฅผ ํ๊ตฌํฉ๋๋ค.
ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค: ์๋น์ค ๊ฒ์ ๋ฐ ํต์ ์ ๋ต
๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ๋ช ์ ์ผ์ผ์ผ ํ์ด ํ์ฅ ๊ฐ๋ฅํ๊ณ ํ๋ ฅ์ ์ด๋ฉฐ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌ ๊ฐ๋ฅํ ์๋น์ค๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก ํ์ต๋๋ค. ์ด์ ์ด ์ํคํ ์ฒ ํจํด์ ํ๋ฐํธ์๋์์ ์ ์ ๋ ๋ง์ด ์ฑํ๋์ด ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค, ์ฆ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ฅผ ํ์์์ผฐ์ต๋๋ค. ์ด ๊ธ์ ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ ๋ด์์ ์๋น์ค ๊ฒ์ ๋ฐ ํต์ ์ ์ค์ํ ์ธก๋ฉด์ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃน๋๋ค.
ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค๋ ๋ฌด์์ธ๊ฐ์?
ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค(๋๋ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋)๋ ํ๋ฐํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌ ๋ฐ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ๋จ์๋ก ๋ถํดํ๋ ์ํคํ ์ฒ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ๊ฐ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ณ๋์ ํ์ด ์์ ํ๋ฏ๋ก ์์จ์ฑ์ ๋์ด๊ณ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๋จ์ถํ๋ฉฐ ํ์ฅ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค. ๋ชจ๋ ๊ธฐ๋ฅ์ด ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋ ๋ชจ๋๋ฆฌ์ ํ๋ฐํธ์๋์ ๋ฌ๋ฆฌ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ๋ชจ๋ํ์ ๋์จํ ๊ฒฐํฉ์ ์ด์งํฉ๋๋ค.
ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค์ ์ด์ :
- ๋ ๋ฆฝ์ ์ธ ๋ฐฐํฌ: ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ฅผ ๋ฐฐํฌํ ์ ์์ด ๋ฐฐํฌ ์ํ์ ์ค์ด๊ณ ๋ ๋น ๋ฅธ ๋ฐ๋ณต์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ๊ธฐ์ ๋ค์์ฑ: ๊ฐ ํ์ ํน์ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์ ๊ฐ์ฅ ์ ํฉํ ๊ธฐ์ ์คํ์ ์ ํํ ์ ์์ด ์คํ๊ณผ ํ์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ํฅ์๋ ํ์ฅ์ฑ: ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ํน์ ํ์์ ๋ฐ๋ผ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅ๋ ์ ์์ด ๋ฆฌ์์ค ํ์ฉ์ ์ต์ ํํฉ๋๋ค.
- ์ฆ๊ฐ๋ ํ ์์จ์ฑ: ํ์ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์ ๋ํ ์์ ํ ์์ ๊ถ์ ๊ฐ์ง๋ฏ๋ก ์์จ์ฑ์ด ํฅ์๋๊ณ ์์ฌ ๊ฒฐ์ ์ด ๋นจ๋ผ์ง๋๋ค.
- ์ฌ์ด ์ ์ง๋ณด์: ์ฝ๋๋ฒ ์ด์ค๊ฐ ์์์๋ก ์ ์ง๋ณด์ ๋ฐ ์ดํด๊ฐ ์ฌ์ ๋ฒ๊ทธ ๋์ ์ํ์ ์ค์ ๋๋ค.
ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค์ ๊ณผ์ :
- ๋ณต์ก์ฑ ์ฆ๊ฐ: ์ฌ๋ฌ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋จ์ผ ๋ชจ๋๋ฆฌ์ ํ๋ฐํธ์๋๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ๋ณด๋ค ๋ ๋ณต์กํ ์ ์์ต๋๋ค.
- ์๋น์ค ๊ฒ์ ๋ฐ ํต์ : ํจ๊ณผ์ ์ธ ์๋น์ค ๊ฒ์ ๋ฐ ํต์ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ๋ ๊ฒ์ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ ์ํคํ ์ฒ์ ์ฑ๊ณต์ ์ค์ํฉ๋๋ค.
- ๊ณต์ ์ปดํฌ๋ํธ: ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ ๊ฐ์ ๊ณต์ ์ปดํฌ๋ํธ ๋ฐ ์ข ์์ฑ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ์ฌ๋ฌ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์ ๊ฑธ์ณ ์ฑ๋ฅ์ ์ต์ ํํ๋ ค๋ฉด ๋ก๋ฉ ์ ๋ต ๋ฐ ๋ฐ์ดํฐ ์ ์ก ๋ฉ์ปค๋์ฆ์ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ํตํฉ ํ ์คํธ: ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ ์ํคํ ์ฒ์์๋ ์ฌ๋ฌ ๋ ๋ฆฝ์ ์ธ ๋จ์ ๊ฐ์ ์ํธ ์์ฉ์ ํ ์คํธํด์ผ ํ๋ฏ๋ก ํตํฉ ํ ์คํธ๊ฐ ๋ ๋ณต์กํ ์ ์์ต๋๋ค.
ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค์ ์๋น์ค ๊ฒ์
์๋น์ค ๊ฒ์์ ๋ถ์ฐ ์์คํ ์์ ์๋น์ค๋ฅผ ์๋์ผ๋ก ์ฐพ๊ณ ์ฐ๊ฒฐํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ์๋น์ค ๊ฒ์์ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๊ฐ ์๋ก ๋ฐ ๋ฐฑ์๋ ์๋น์ค์ ํต์ ํ ์ ์๋๋ก ํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค์๋ ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์๋ ์ฌ๋ฌ ๊ฐ์ง ์๋น์ค ๊ฒ์ ์ ๊ทผ ๋ฐฉ์์ด ์์ต๋๋ค.
์๋น์ค ๊ฒ์ ์ ๊ทผ ๋ฐฉ์:
1. ์ ์ ๊ตฌ์ฑ:
์ด ์ ๊ทผ ๋ฐฉ์์์๋ ๊ฐ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์ ์์น๊ฐ ๊ตฌ์ฑ ํ์ผ ๋๋ ํ๊ฒฝ ๋ณ์์ ํ๋์ฝ๋ฉ๋ฉ๋๋ค. ์ด๊ฒ์ ๊ฐ์ฅ ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์์ด์ง๋ง ์ ์ฐ์ฑ์ ๊ฐ์ฅ ๋ฎ์ต๋๋ค. ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์ ์์น๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ตฌ์ฑ ํ์ผ์ ์ ๋ฐ์ดํธํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ ๋ฐฐํฌํด์ผ ํฉ๋๋ค.
์์:
const microFrontendConfig = {
"productCatalog": "https://product-catalog.example.com",
"shoppingCart": "https://shopping-cart.example.com",
"userProfile": "https://user-profile.example.com"
};
์ฅ์ :
- ๊ตฌํ์ด ๊ฐ๋จํฉ๋๋ค.
๋จ์ :
- ํ์ฅ์ฑ์ด ์์ต๋๋ค.
- ๊ตฌ์ฑ ๋ณ๊ฒฝ ์ ์ฌ๋ฐฐํฌ๊ฐ ํ์ํฉ๋๋ค.
- ์ฅ์ ์ ํ๋ ฅ์ ์ด์ง ์์ต๋๋ค.
2. DNS ๊ธฐ๋ฐ ์๋น์ค ๊ฒ์:
์ด ์ ๊ทผ ๋ฐฉ์์ DNS๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์ ์์น๋ฅผ ํ์ธํฉ๋๋ค. ๊ฐ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์ DNS ๋ ์ฝ๋๊ฐ ํ ๋น๋๋ฉฐ, ํด๋ผ์ด์ธํธ๋ DNS ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์์น๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฐฐํฌํ์ง ์๊ณ ๋ DNS ๋ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ผ๋ฏ๋ก ์ ์ ๊ตฌ์ฑ๋ณด๋ค ๋ ์ ์ฐํฉ๋๋ค.
์์:
๋ค์๊ณผ ๊ฐ์ด DNS ๋ ์ฝ๋๊ฐ ๊ตฌ์ฑ๋์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
- product-catalog.microfrontends.example.com IN A 192.0.2.10
- shopping-cart.microfrontends.example.com IN A 192.0.2.11
ํ๋ฐํธ์๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
const microFrontendUrls = {
"productCatalog": `http://${new URL("product-catalog.microfrontends.example.com").hostname}`,
"shoppingCart": `http://${new URL("shopping-cart.microfrontends.example.com").hostname}`
};
์ฅ์ :
- ์ ์ ๊ตฌ์ฑ๋ณด๋ค ์ ์ฐํฉ๋๋ค.
- ๊ธฐ์กด DNS ์ธํ๋ผ์ ํตํฉ๋ ์ ์์ต๋๋ค.
๋จ์ :
- DNS ๋ ์ฝ๋ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
- ๋ณ๊ฒฝ ์ฌํญ ์ ํ๊ฐ ๋๋ฆด ์ ์์ต๋๋ค.
- DNS ์ธํ๋ผ ๊ฐ์ฉ์ฑ์ ์์กดํฉ๋๋ค.
3. ์๋น์ค ๋ ์ง์คํธ๋ฆฌ:
์ด ์ ๊ทผ ๋ฐฉ์์ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์ ์์น๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ ์ฉ ์๋น์ค ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ์์ํ ๋ ์๋น์ค ๋ ์ง์คํธ๋ฆฌ์ ์์ ์ ๋ฑ๋กํ๊ณ , ํด๋ผ์ด์ธํธ๋ ์๋น์ค ๋ ์ง์คํธ๋ฆฌ์ ์ฟผ๋ฆฌํ์ฌ ํด๋น ์์น๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค. ์ด๋ ์๋น์ค ๋ ์ง์คํธ๋ฆฌ๊ฐ ๋น์ ์์ ์ธ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ฅผ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ์ ๊ฑฐํ ์ ์์ผ๋ฏ๋ก ๊ฐ์ฅ ๋์ ์ด๊ณ ํ๋ ฅ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
์ธ๊ธฐ ์๋ ์๋น์ค ๋ ์ง์คํธ๋ฆฌ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- Consul
- Eureka
- etcd
- ZooKeeper
์์ (Consul ์ฌ์ฉ):
๋จผ์ , ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ์์ ์ Consul์ ์์ ์ ๋ฑ๋กํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์ ์ด๋ฆ, IP ์ฃผ์, ํฌํธ ๋ฐ ๊ธฐํ ๊ด๋ จ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
// Example using Node.js and the 'node-consul' library
const consul = require('consul')({
host: 'consul.example.com', // Consul server address
port: 8500
});
const serviceRegistration = {
name: 'product-catalog',
id: 'product-catalog-1',
address: '192.168.1.10',
port: 3000,
check: {
http: 'http://192.168.1.10:3000/health',
interval: '10s',
timeout: '5s'
}
};
consul.agent.service.register(serviceRegistration, function(err) {
if (err) throw err;
console.log('Registered with Consul');
});
๊ทธ๋ฐ ๋ค์, ๋ค๋ฅธ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ ๋๋ ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ Consul์ ์ฟผ๋ฆฌํ์ฌ ์ ํ ์นดํ๋ก๊ทธ ์๋น์ค์ ์์น๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
consul.agent.service.list(function(err, result) {
if (err) throw err;
const productCatalogService = Object.values(result).find(service => service.Service === 'product-catalog');
if (productCatalogService) {
const productCatalogUrl = `http://${productCatalogService.Address}:${productCatalogService.Port}`;
console.log('Product Catalog URL:', productCatalogUrl);
} else {
console.log('Product Catalog service not found');
}
});
์ฅ์ :
- ๋งค์ฐ ๋์ ์ด๊ณ ํ๋ ฅ์ ์ ๋๋ค.
- ์ํ ํ์ธ ๋ฐ ์๋ ์ฅ์ ์กฐ์น๋ฅผ ์ง์ํฉ๋๋ค.
- ์๋น์ค ๊ด๋ฆฌ๋ฅผ ์ํ ์ค์ ์ ์ด ์ง์ ์ ์ ๊ณตํฉ๋๋ค.
๋จ์ :
- ์๋น์ค ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๋ฐฐํฌํ๊ณ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- ์ํคํ ์ฒ์ ๋ณต์ก์ฑ์ ๋ํฉ๋๋ค.
4. API ๊ฒ์ดํธ์จ์ด:
API ๊ฒ์ดํธ์จ์ด๋ ๋ฐฑ์๋ ์๋น์ค์ ๋ํ ๋ชจ๋ ์์ฒญ์ ๋จ์ผ ์ง์ ์ ์ญํ ์ ํฉ๋๋ค. ์๋น์ค ๊ฒ์, ๋ผ์ฐํ , ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค์ ๋งฅ๋ฝ์์ API ๊ฒ์ดํธ์จ์ด๋ URL ๊ฒฝ๋ก ๋๋ ๊ธฐํ ๊ธฐ์ค์ ๋ฐ๋ผ ์ ์ ํ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ก ์์ฒญ์ ๋ผ์ฐํ ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. API ๊ฒ์ดํธ์จ์ด๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๊ฐ๋ณ ์๋น์ค์ ๋ณต์ก์ฑ์ ์ถ์ํํฉ๋๋ค. Netflix์ Amazon๊ณผ ๊ฐ์ ํ์ฌ๋ค์ API ๊ฒ์ดํธ์จ์ด๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํฉ๋๋ค.
์์:
Nginx์ ๊ฐ์ ์ญ๋ฐฉํฅ ํ๋ก์๋ฅผ API ๊ฒ์ดํธ์จ์ด๋ก ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. URL ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Nginx๋ฅผ ๊ตฌ์ฑํ์ฌ ์ฌ๋ฌ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ก ์์ฒญ์ ๋ผ์ฐํ ํ ์ ์์ต๋๋ค.
# nginx configuration
http {
upstream product_catalog {
server product-catalog.example.com:8080;
}
upstream shopping_cart {
server shopping-cart.example.com:8081;
}
server {
listen 80;
location /product-catalog/ {
proxy_pass http://product_catalog/;
}
location /shopping-cart/ {
proxy_pass http://shopping_cart/;
}
}
}
์ด ๊ตฌ์ฑ์์ `/product-catalog/*`์ ๋ํ ์์ฒญ์ `product_catalog` ์ ์คํธ๋ฆผ์ผ๋ก ๋ผ์ฐํ ๋๊ณ , `/shopping-cart/*`์ ๋ํ ์์ฒญ์ `shopping_cart` ์ ์คํธ๋ฆผ์ผ๋ก ๋ผ์ฐํ ๋ฉ๋๋ค. ์ ์คํธ๋ฆผ ๋ธ๋ก์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฑ์๋ ์๋ฒ๋ฅผ ์ ์ํฉ๋๋ค.
์ฅ์ :
- ๋ชจ๋ ์์ฒญ์ ๋ํ ์ค์ ์ง์ค์ ์ง์ ์ .
- ๋ผ์ฐํ , ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์๋น์ค ๊ฒ์์ ๋จ์ํํฉ๋๋ค.
๋จ์ :
- ์ ๋๋ก ํ์ฅ๋์ง ์์ผ๋ฉด ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค.
- ์ํคํ ์ฒ์ ๋ณต์ก์ฑ์ ๋ํฉ๋๋ค.
- ์ ์คํ ๊ตฌ์ฑ ๋ฐ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
5. ํ๋ฐํธ์๋๋ฅผ ์ํ ๋ฐฑ์๋ (BFF):
ํ๋ฐํธ์๋๋ฅผ ์ํ ๋ฐฑ์๋(BFF) ํจํด์ ๊ฐ ํ๋ฐํธ์๋์ ๋ํด ๋ณ๋์ ๋ฐฑ์๋ ์๋น์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๊ฐ BFF๋ ์ฌ๋ฌ ๋ฐฑ์๋ ์๋น์ค์ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๊ณ ํ๋ฐํธ์๋์ ํน์ ์๊ตฌ์ ๋ง๊ฒ ์๋ต์ ์กฐ์ ํ๋ ์ญํ ์ ํฉ๋๋ค. ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ ์ํคํ ์ฒ์์ ๊ฐ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ์์ฒด BFF๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ด๋ ๋ฐ์ดํฐ ํ์น๋ฅผ ๋จ์ํํ๊ณ ํ๋ฐํธ์๋ ์ฝ๋์ ๋ณต์ก์ฑ์ ์ค์ ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์ ๋๋ ์ง๊ณ๊ฐ ํ์ํ ๋ค์ํ ์ ํ์ ํด๋ผ์ด์ธํธ(์: ์น, ๋ชจ๋ฐ์ผ)๋ฅผ ์ฒ๋ฆฌํ ๋ ํนํ ์ ์ฉํฉ๋๋ค.
์์:
์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ชจ๋ฐ์ผ ์ฑ ๋ชจ๋ ์ ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์ํด์ผ ํ์ง๋ง ์ฝ๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ํ์์ด ํ์ํ๋ค๊ณ ์์ํด ๋ด ์๋ค. ํ๋ฐํธ์๋๊ฐ ์ฌ๋ฌ ๋ฐฑ์๋ ์๋น์ค๋ฅผ ์ง์ ํธ์ถํ๊ณ ๋ฐ์ดํฐ ๋ณํ์ ์์ฒด์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋์ , ๊ฐ ํ๋ฐํธ์๋์ ๋ํ BFF๋ฅผ ๋ง๋ญ๋๋ค.
์น BFF๋ `ProductCatalogService`, `ReviewService` ๋ฐ `RecommendationService`์์ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๊ณ ํฐ ํ๋ฉด์ ํ์ํ๊ธฐ์ ์ต์ ํ๋ ์๋ต์ ๋ฐํํ ์ ์์ต๋๋ค. ๋ฐ๋ฉด์ ๋ชจ๋ฐ์ผ BFF๋ ๋ฐ์ดํฐ ์ฌ์ฉ๋์ ์ต์ํํ๊ณ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด `ProductCatalogService` ๋ฐ `ReviewService`์์ ๊ฐ์ฅ ํ์์ ์ธ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์ฅ์ :
- ํน์ ํ๋ฐํธ์๋ ์๊ตฌ์ ์ต์ ํ๋์์ต๋๋ค.
- ํ๋ฐํธ์๋์ ๋ณต์ก์ฑ์ ์ค์ ๋๋ค.
- ํ๋ฐํธ์๋์ ๋ฐฑ์๋์ ๋ ๋ฆฝ์ ์ธ ์งํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋จ์ :
- ์ฌ๋ฌ ๋ฐฑ์๋ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ณ ์ ์ง๋ณด์ํด์ผ ํฉ๋๋ค.
- ์ ๋๋ก ๊ด๋ฆฌ๋์ง ์์ผ๋ฉด ์ฝ๋ ์ค๋ณต์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ์ด์ ์ค๋ฒํค๋๊ฐ ์ฆ๊ฐํฉ๋๋ค.
ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค์ ํต์ ์ ๋ต
๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๊ฐ ๊ฒ์๋๋ฉด ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ์๋ก ํต์ ํด์ผ ํฉ๋๋ค. ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ํต์ ํจํด์ด ์์ต๋๋ค.
ํต์ ํจํด:
1. ์ง์ ํต์ :
์ด ํจํด์์ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ HTTP ์์ฒญ ๋๋ ๊ธฐํ ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์๋ก ์ง์ ํต์ ํฉ๋๋ค. ์ด๊ฒ์ ๊ฐ์ฅ ๊ฐ๋จํ ํต์ ํจํด์ด์ง๋ง, ๋ฐ์ ํ ๊ฒฐํฉ๊ณผ ๋ณต์ก์ฑ ์ฆ๊ฐ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ํ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๊ฐ ๋ค๋ฅธ ๋คํธ์ํฌ ๋๋ ์ง์ญ์ ์์นํ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์์:
ํ๋์ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋(์: ์ ํ ๋ชฉ๋ก ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋)๊ฐ ๋ค๋ฅธ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋(์ฅ๋ฐ๊ตฌ๋ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋)์์ ๊ด๋ฆฌํ๋ ํ์ฌ ์ฌ์ฉ์์ ์ฅ๋ฐ๊ตฌ๋ ๊ฐ์๋ฅผ ํ์ํด์ผ ํฉ๋๋ค. ์ ํ ๋ชฉ๋ก ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ์ฅ๋ฐ๊ตฌ๋ ๊ฐ์๋ฅผ ๊ฒ์ํ๊ธฐ ์ํด ์ฅ๋ฐ๊ตฌ๋ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์ ์ง์ HTTP ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
// In the product listing micro frontend:
async function getCartCount() {
const response = await fetch('https://shopping-cart.example.com/cart/count');
const data = await response.json();
return data.count;
}
// ... display the cart count in the product listing
์ฅ์ :
- ๊ตฌํ์ด ๊ฐ๋จํฉ๋๋ค.
๋จ์ :
- ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ ๊ฐ์ ๋ฐ์ ํ ๊ฒฐํฉ.
- ๋ณต์ก์ฑ ์ฆ๊ฐ.
- ์ ์ฌ์ ์ธ ์ฑ๋ฅ ๋ฌธ์ .
- ์ข ์์ฑ ๊ด๋ฆฌ๊ฐ ์ด๋ ต์ต๋๋ค.
2. ์ด๋ฒคํธ (๊ฒ์/๊ตฌ๋ ):
์ด ํจํด์์ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ์ด๋ฒคํธ๋ฅผ ๊ฒ์ํ๊ณ ๊ตฌ๋ ํจ์ผ๋ก์จ ์๋ก ํต์ ํฉ๋๋ค. ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๊ฐ ์ด๋ฒคํธ๋ฅผ ๊ฒ์ํ๋ฉด ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๋ ๋ค๋ฅธ ๋ชจ๋ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๊ฐ ์๋ฆผ์ ๋ฐ์ต๋๋ค. ์ด ํจํด์ ๋์จํ ๊ฒฐํฉ์ ์ด์งํ๊ณ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๊ฐ ๋ณ๊ฒฝ ์ธ๋ถ ์ ๋ณด๋ฅผ ์์ง ๋ชปํ๊ณ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ ์ ์๋๋ก ํฉ๋๋ค.
์์:
์ฌ์ฉ์๊ฐ ์ฅ๋ฐ๊ตฌ๋(์ฅ๋ฐ๊ตฌ๋ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์์ ๊ด๋ฆฌ)์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ฉด "cartItemAdded"๋ผ๋ ์ด๋ฒคํธ๋ฅผ ๊ฒ์ํฉ๋๋ค. ์ด ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๋ ์ ํ ๋ชฉ๋ก ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ์ฅ๋ฐ๊ตฌ๋ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ฅผ ์ง์ ํธ์ถํ์ง ์๊ณ ํ์๋ ์ฅ๋ฐ๊ตฌ๋ ๊ฐ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
// Shopping Cart Micro Frontend (Publisher):
function addItemToCart(item) {
// ... add item to cart
publishEvent('cartItemAdded', { itemId: item.id });
}
function publishEvent(eventName, data) {
// ... publish the event using a message broker or custom event bus
}
// Product Listing Micro Frontend (Subscriber):
subscribeToEvent('cartItemAdded', (data) => {
// ... update the displayed cart count based on the event data
});
function subscribeToEvent(eventName, callback) {
// ... subscribe to the event using a message broker or custom event bus
}
์ฅ์ :
- ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ ๊ฐ์ ๋์จํ ๊ฒฐํฉ.
- ์ ์ฐ์ฑ ์ฆ๊ฐ.
- ํฅ์๋ ํ์ฅ์ฑ.
๋จ์ :
- ๋ฉ์์ง ๋ธ๋ก์ปค ๋๋ ์ด๋ฒคํธ ๋ฒ์ค ๊ตฌํ์ด ํ์ํฉ๋๋ค.
- ๋๋ฒ๊น ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ์ต์ข ์ผ๊ด์ฑ์ด ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
3. ๊ณต์ ์ํ:
์ด ํจํด์์ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ๋ธ๋ผ์ฐ์ ์ฟ ํค, ๋ก์ปฌ ์ ์ฅ์ ๋๋ ๊ณต์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ์ค์ ์์น์ ์ ์ฅ๋ ๊ณตํต ์ํ๋ฅผ ๊ณต์ ํฉ๋๋ค. ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ๊ณต์ ์ํ์ ์ก์ธ์คํ๊ณ ์์ ํ ์ ์์ผ๋ฏ๋ก ๊ฐ์ ์ ์ผ๋ก ์๋ก ํต์ ํ ์ ์์ต๋๋ค. ์ด ํจํด์ ์๋์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๋ฐ ์ ์ฉํ์ง๋ง, ์ ๋๋ก ๊ด๋ฆฌ๋์ง ์์ผ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๋ฐ ๋ฐ์ดํฐ ๋ถ์ผ์น๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๊ณต์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด Redux ๋๋ Vuex์ ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
์์:
๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ์ฟ ํค์ ์ ์ฅ๋ ์ฌ์ฉ์ ์ธ์ฆ ํ ํฐ์ ๊ณต์ ํ ์ ์์ต๋๋ค. ๊ฐ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ ์ธ์ฆ ์๋น์ค์ ์ง์ ํต์ ํ ํ์ ์์ด ์ฟ ํค์ ์ก์ธ์คํ์ฌ ์ฌ์ฉ์์ ์ ์์ ํ์ธํ ์ ์์ต๋๋ค.
// Setting the authentication token (e.g., in the authentication micro frontend)
document.cookie = "authToken=your_auth_token; path=/";
// Accessing the authentication token (e.g., in other micro frontends)
function getAuthToken() {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
if (cookie.startsWith('authToken=')) {
return cookie.substring('authToken='.length);
}
}
return null;
}
const authToken = getAuthToken();
if (authToken) {
// ... use the auth token to authenticate the user
}
์ฅ์ :
- ์๋์ ๋ฐ์ดํฐ์ ๋ํด ๊ตฌํ์ด ๊ฐ๋จํฉ๋๋ค.
๋จ์ :
- ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ํ ๋ณ๊ฒฝ ๊ด๋ฆฌ๊ฐ ์ด๋ ต์ต๋๋ค.
- ์ฃผ์ ๊น๊ฒ ๋ค๋ฃจ์ง ์์ผ๋ฉด ๋ณด์ ์ํ์ด ์์ต๋๋ค (์: ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ฟ ํค์ ์ ์ฅ).
4. ์๋์ฐ ์ด๋ฒคํธ (์ปค์คํ ์ด๋ฒคํธ):
๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ `window` ๊ฐ์ฒด์์ ๋์คํจ์น๋๋ ์ฌ์ฉ์ ์ ์ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ํต์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๊ฐ ๋ค๋ฅธ iframe ๋๋ ์น ์ปดํฌ๋ํธ์ ๋ก๋๋์ด ์๋๋ผ๋ ์ํธ ์์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ์ ๊ทผ ๋ฐฉ์์ด์ง๋ง, ์ถฉ๋์ ํผํ๊ณ ์ผ๊ด์ฑ์ ์ ์งํ๋ ค๋ฉด ์ด๋ฒคํธ ์ด๋ฆ ๋ฐ ๋ฐ์ดํฐ ํ์ ๊ด๋ฆฌ์ ์ ์คํด์ผ ํฉ๋๋ค.
์์:
// Micro Frontend A (Publisher)
const event = new CustomEvent('custom-event', { detail: { message: 'Hello from Micro Frontend A' } });
window.dispatchEvent(event);
// Micro Frontend B (Subscriber)
window.addEventListener('custom-event', (event) => {
console.log('Received event:', event.detail.message);
});
์ฅ์ :
- ๋ค์ดํฐ๋ธ ๋ธ๋ผ์ฐ์ ์ง์.
- ๊ธฐ๋ณธ ํต์ ๊ตฌํ์ด ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค.
๋จ์ :
- ์ ์ญ ๋ค์์คํ์ด์ค๊ฐ ์ถฉ๋๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๋ณต์กํ ์ด๋ฒคํธ ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ฅ์ฑ์ด ์ ํ๋ฉ๋๋ค.
- ์ด๋ฆ ์ถฉ๋์ ํผํ๊ธฐ ์ํด ํ ๊ฐ์ ์ ์คํ ์กฐ์ ์ด ํ์ํฉ๋๋ค.
5. ๋ชจ๋ ํ๋๋ ์ด์ (Webpack 5):
๋ชจ๋ ํ๋๋ ์ด์ ์ JavaScript ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐํ์์ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฝ๋๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ npm ํจํค์ง๋ฅผ ๊ฒ์ํ๊ณ ์ฌ์ฉํ ํ์ ์์ด ์ฌ๋ฌ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ ๊ฐ์ ์ฝ๋์ ์ข ์์ฑ์ ๊ณต์ ํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ๊ตฌ์ฑ ๊ฐ๋ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ํ๋ฐํธ์๋๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ์ ๊ทผ ๋ฐฉ์์ด์ง๋ง, ์ ์คํ ๊ณํ๊ณผ ๊ตฌ์ฑ์ด ํ์ํฉ๋๋ค.
์์:
๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ A(ํธ์คํธ)๊ฐ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ B(์๊ฒฉ)์์ ์ปดํฌ๋ํธ๋ฅผ ๋ก๋ํฉ๋๋ค.
// Micro Frontend A (webpack.config.js)
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
module.exports = {
// ... other webpack configurations
plugins: [
new ModuleFederationPlugin({
name: 'MicroFrontendA',
remotes: {
'MicroFrontendB': 'MicroFrontendB@http://localhost:3001/remoteEntry.js',
},
shared: ['react', 'react-dom'], // Share dependencies to avoid duplicates
}),
],
};
// Micro Frontend A (Component)
import React from 'react';
import RemoteComponent from 'MicroFrontendB/Component';
const App = () => {
return (
Micro Frontend A
);
};
export default App;
// Micro Frontend B (webpack.config.js)
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
module.exports = {
// ... other webpack configurations
plugins: [
new ModuleFederationPlugin({
name: 'MicroFrontendB',
exposes: {
'./Component': './src/Component',
},
shared: ['react', 'react-dom'],
}),
],
};
// Micro Frontend B (src/Component.js)
import React from 'react';
const Component = () => {
return Hello from Micro Frontend B!
;
};
export default Component;
์ฅ์ :
- npm ํจํค์ง ์์ด ์ฝ๋ ๊ณต์ ๋ฐ ์ฌ์ฌ์ฉ.
- ๋ฐํ์์ ์ปดํฌ๋ํธ ๋์ ๋ก๋ฉ.
- ํฅ์๋ ๋น๋ ์๊ฐ ๋ฐ ๋ฐฐํฌ ํจ์จ์ฑ.
๋จ์ :
- Webpack 5 ์ด์์ด ํ์ํฉ๋๋ค.
- ๊ตฌ์ฑํ๊ธฐ ๋ณต์กํ ์ ์์ต๋๋ค.
- ๊ณต์ ์ข ์์ฑ๊ณผ์ ๋ฒ์ ํธํ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
6. ์น ์ปดํฌ๋ํธ:
์น ์ปดํฌ๋ํธ๋ ์บก์ํ๋ ์คํ์ผ๋ง ๋ฐ ๋์์ผ๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฌ์ฉ์ ์ ์ HTML ์์๋ฅผ ๋ง๋ค ์ ์๋ ์น ํ์ค ์ธํธ์ ๋๋ค. ์ด๋ ๊ธฐ๋ณธ ํ๋ ์์ํฌ์ ๊ด๊ณ์์ด ๋ชจ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํฉ๋ ์ ์๋ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ํ๋ซํผ ๋ ๋ฆฝ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํ์ํ ์บก์ํ๋ฅผ ์ ๊ณตํ์ง๋ง, ๋ณต์กํ ์ํ ๊ด๋ฆฌ ๋๋ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์๋๋ฆฌ์ค๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด ์ถ๊ฐ ๋๊ตฌ ๋๋ ํ๋ ์์ํฌ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
์์:
// Micro Frontend A (Web Component)
class MyCustomElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' }); // Encapsulated shadow DOM
this.shadowRoot.innerHTML = `
Hello from Web Component!
`;
}
}
customElements.define('my-custom-element', MyCustomElement);
// Using the Web Component in any HTML page
์ฅ์ :
- ํ๋ ์์ํฌ ๋ ๋ฆฝ์ ์ด๋ฉฐ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- ์บก์ํ๋ ์คํ์ผ๋ง ๋ฐ ๋์.
- ํ์คํ๋ ์น ๊ธฐ์ .
๋จ์ :
- ํฌํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด ์์ฑํ๊ธฐ ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค.
- ์ด์ ๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ ํด๋ฆฌํ์ด ํ์ํ ์ ์์ต๋๋ค.
- ์ํ ๊ด๋ฆฌ ๋ฐ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด ํ๋ ์์ํฌ ๊ธฐ๋ฐ ์๋ฃจ์ ์ ๋นํด ๋ ๋ณต์กํ ์ ์์ต๋๋ค.
์ฌ๋ฐ๋ฅธ ์ ๋ต ์ ํ
ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์ ๊ฐ์ฅ ์ ํฉํ ์๋น์ค ๊ฒ์ ๋ฐ ํต์ ์ ๋ต์ ๋ค์์ ํฌํจํ ์ฌ๋ฌ ์์ธ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ํฌ๊ธฐ์ ๋ณต์ก์ฑ. ์๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ ์ ๊ตฌ์ฑ ๋๋ ์ง์ ํต์ ๊ณผ ๊ฐ์ ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์ถฉ๋ถํ ์ ์์ต๋๋ค. ๋ ํฌ๊ณ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์๋น์ค ๋ ์ง์คํธ๋ฆฌ ๋๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ์ ๊ฐ์ ๋ ๊ฐ๋ ฅํ ์ ๊ทผ ๋ฐฉ์์ด ๊ถ์ฅ๋ฉ๋๋ค.
- ํ์ ํ์ํ ์์จ์ฑ ์์ค. ํ์ด ๋์ ์์จ์ฑ์ ํ์๋ก ํ๋ ๊ฒฝ์ฐ ์ด๋ฒคํธ์ ๊ฐ์ ๋์จํ๊ฒ ๊ฒฐํฉ๋ ํต์ ํจํด์ด ์ ํธ๋ฉ๋๋ค. ํ์ด ๋ ๊ธด๋ฐํ๊ฒ ํ๋ ฅํ ์ ์๋ ๊ฒฝ์ฐ ์ง์ ํต์ ๊ณผ ๊ฐ์ ๋ ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋ ํจํด์ด ํ์ฉ๋ ์ ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ์๊ตฌ ์ฌํญ. ์ง์ ํต์ ๊ณผ ๊ฐ์ ์ผ๋ถ ํต์ ํจํด์ ์ด๋ฒคํธ์ ๊ฐ์ ๋ค๋ฅธ ํจํด๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ง์ ํต์ ์ ์ฑ๋ฅ ์ด์ ์ ์ฆ๊ฐ๋ ๋ณต์ก์ฑ๊ณผ ๋ฐ์ ํ ๊ฒฐํฉ์ผ๋ก ์์๋ ์ ์์ต๋๋ค.
- ๊ธฐ์กด ์ธํ๋ผ. ์ด๋ฏธ ์๋น์ค ๋ ์ง์คํธ๋ฆฌ ๋๋ ๋ฉ์์ง ๋ธ๋ก์ปค๊ฐ ๊ตฌ์ถ๋์ด ์๋ ๊ฒฝ์ฐ ํด๋น ์ธํ๋ผ๋ฅผ ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค์ ํ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก
ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ์๋น์ค ๊ฒ์ ๋ฐ ํต์ ์ ๊ตฌํํ ๋ ๋ฐ๋ฅผ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฐ๋จํ๊ฒ ์ ์งํ์ญ์์ค. ํ์์ ๋ง๋ ๊ฐ์ฅ ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์๋ถํฐ ์์ํ๊ณ ํ์์ ๋ฐ๋ผ ์ ์ง์ ์ผ๋ก ๋ณต์ก์ฑ์ ๋๋ฆฌ์ญ์์ค.
- ๋์จํ ๊ฒฐํฉ์ ์ ํธํ์ญ์์ค. ๋์จํ ๊ฒฐํฉ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ ์ฐํ๊ณ ํ๋ ฅ์ ์ด๋ฉฐ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ์ผ๊ด๋ ํต์ ํจํด์ ์ฌ์ฉํ์ญ์์ค. ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋ ํต์ ํจํด์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ดํดํ๊ณ ๋๋ฒ๊น ํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
- ์๋น์ค๋ฅผ ๋ชจ๋ํฐ๋งํ์ญ์์ค. ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์ ์ํ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ์ฌ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ์ญ์์ค.
- ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ญ์์ค. ์ค๋ฅ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๊ณ ์ฌ์ฉ์์๊ฒ ์ ์ตํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ์ญ์์ค.
- ์ํคํ ์ฒ๋ฅผ ๋ฌธ์ํํ์ญ์์ค. ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ ์ ์๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ๋ ์๋น์ค ๊ฒ์ ๋ฐ ํต์ ํจํด์ ๋ฌธ์ํํ์ญ์์ค.
๊ฒฐ๋ก
ํ๋ฐํธ์๋ ๋ง์ดํฌ๋ก์๋น์ค๋ ํ์ฅ์ฑ, ์ ์ง๋ณด์์ฑ ๋ฐ ํ ์์จ์ฑ ์ธก๋ฉด์์ ์๋นํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฑ๊ณต์ ์ธ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์๋น์ค ๊ฒ์ ๋ฐ ํต์ ์ ๋ต์ ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ์ฌ์ฉ์ ๋ฐ ๊ฐ๋ฐ ํ์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ํ๋ฐํธ์๋๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๋ง์ดํฌ๋ก ํ๋ฐํธ์๋์ ์ฑ๊ณต์ ์ธ ๊ตฌํ์ ํต์ฌ์ ๋ค์ํ ์๋น์ค ๊ฒ์ ๋ฐ ํต์ ํจํด ๊ฐ์ ์ฅ๋จ์ ์ ์ดํดํ๋ ๋ฐ ์์ต๋๋ค. ์ ์ ๊ตฌ์ฑ์ ๋จ์ํจ์ ์ ๊ณตํ์ง๋ง ์๋น์ค ๋ ์ง์คํธ๋ฆฌ์ ๋์ ์ธ ํน์ฑ์ด ๋ถ์กฑํฉ๋๋ค. ์ง์ ํต์ ์ ๊ฐ๋จํด ๋ณด์ผ ์ ์์ง๋ง ๋ฐ์ ํ ๊ฒฐํฉ์ผ๋ก ์ด์ด์ง ์ ์์ผ๋ฉฐ, ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ ๋์จํ ๊ฒฐํฉ์ ์ด์งํ์ง๋ง ๋ฉ์์ง ๋ธ๋ก์ปค๋ง ๋ฐ ์ต์ข ์ผ๊ด์ฑ ์ธก๋ฉด์์ ๋ณต์ก์ฑ์ ์ด๋ํฉ๋๋ค. ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฝ๋๋ฅผ ๊ณต์ ํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง ์ต์ ๋น๋ ๋๊ตฌ ์ฒด์ธ์ด ํ์ํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์น ์ปดํฌ๋ํธ๋ ํ์คํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ์ง๋ง ์ํ ๋ฐ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๊ด๋ฆฌํ ๋ ํ๋ ์์ํฌ์ ๋ณด์์ด ํ์ํ ์ ์์ต๋๋ค.
๊ถ๊ทน์ ์ผ๋ก ์ต์ ์ ์ ํ์ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ ์ฌํญ, ํ์ ์ ๋ฌธ ์ง์ ๋ฐ ์ ๋ฐ์ ์ธ ์ํคํ ์ฒ ๋ชฉํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ ๊ณํ๋ ์ ๋ต๊ณผ ๋ชจ๋ฒ ์ฌ๋ก ์ค์๋ ์ฐ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ๋ง์ดํฌ๋ก ํ๋ฐํธ์๋ ์ํคํ ์ฒ๋ฅผ ๋ง๋ค์ด๋ผ ์ ์์ต๋๋ค.