์๋ฐ์คํฌ๋ฆฝํธ ์ต์ ๋ฒ ํจํด์ ํ์ฉํด ํจ์จ์ ์ธ ์ด๋ฒคํธ ์๋ฆผ์ผ๋ก ๋ถ๋ฆฌ๋๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ๊ตฌํ ๊ธฐ์ ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐฐ์๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ต์ ๋ฒ ํจํด: ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ด๋ฒคํธ ์๋ฆผ
ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ค๋ฉด ๋์์ธ ํจํด์ ๋ํ ๊น์ ์ดํด๊ฐ ํ์ํฉ๋๋ค. ๊ฐ์ฅ ๊ฐ๋ ฅํ๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํจํด ์ค ํ๋๋ ์ต์ ๋ฒ ํจํด(Observer pattern)์ ๋๋ค. ์ด ํจํด์ ์ฌ์ฉํ๋ฉด ์ฃผ์ฒด(observable)๊ฐ ์ฌ๋ฌ ์ข ์ ๊ฐ์ฒด(observer)์๊ฒ ํน์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์ ํ์ ์์ด ์ํ ๋ณ๊ฒฝ์ ์๋ฆด ์ ์์ต๋๋ค. ์ด๋ ๋์จํ ๊ฒฐํฉ(loose coupling)์ ์ด์งํ๊ณ ๋ ํฐ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ์ ํ์ฉํฉ๋๋ค. ์ด๋ ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ณํ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ํด์ผ ํ๋ ๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๊ธ์์๋ ํนํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ๋งฅ๋ฝ์์ ์ต์ ๋ฒ ํจํด๊ณผ ์ด ํจํด์ด ํจ์จ์ ์ธ ์ด๋ฒคํธ ์๋ฆผ์ ์ด๋ป๊ฒ ์ด์งํ๋์ง ์์ธํ ์ดํด๋ด ๋๋ค.
์ต์ ๋ฒ ํจํด ์ดํดํ๊ธฐ
์ต์ ๋ฒ ํจํด์ ํ์ ๋์์ธ ํจํด ๋ฒ์ฃผ์ ์ํฉ๋๋ค. ์ด๋ ๊ฐ์ฒด ๊ฐ์ ์ผ๋๋ค(one-to-many) ์ข ์์ฑ์ ์ ์ํ์ฌ, ํ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ชจ๋ ์ข ์ ๊ฐ์ฒด์ ์๋์ผ๋ก ์๋ฆผ์ด ๊ฐ๊ณ ์ ๋ฐ์ดํธ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด ํจํด์ ๋ค์๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค์์ ํนํ ์ ์ฉํฉ๋๋ค:
- ํ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ์๊ตฌํ์ง๋ง, ์ผ๋ง๋ ๋ง์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋์ง ๋ฏธ๋ฆฌ ์ ์ ์๋ ๊ฒฝ์ฐ.
- ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฐ์ฒด๊ฐ ์์ ์๊ฒ ์์กดํ๋ ๊ฐ์ฒด์ ๋ํด ์์ง ๋ชปํด์ผ ํ๋ ๊ฒฝ์ฐ.
- ๊ด๋ จ ๊ฐ์ฒด๋ค ๊ฐ์ ๊ธด๋ฐํ ๊ฒฐํฉ ์์ด ์ผ๊ด์ฑ์ ์ ์งํด์ผ ํ๋ ๊ฒฝ์ฐ.
์ต์ ๋ฒ ํจํด์ ์ฃผ์ ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฃผ์ฒด (Observable): ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฐ์ฒด์ ๋๋ค. ์ต์ ๋ฒ ๋ชฉ๋ก์ ์ ์งํ๊ณ ์ต์ ๋ฒ๋ฅผ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ํ ๋ณ๊ฒฝ์ด ๋ฐ์ํ์ ๋ ์ต์ ๋ฒ์๊ฒ ์๋ฆฌ๋ ๋ฉ์๋๋ ํฌํจํฉ๋๋ค.
- ์ต์ ๋ฒ (Observer): ์ ๋ฐ์ดํธ ๋ฉ์๋๋ฅผ ์ ์ํ๋ ์ธํฐํ์ด์ค ๋๋ ์ถ์ ํด๋์ค์ ๋๋ค. ์ต์ ๋ฒ๋ ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ์ฃผ์ฒด๋ก๋ถํฐ ์๋ฆผ์ ๋ฐ์ต๋๋ค.
- ๊ตฌ์ฒด์ ์ธ ์ต์ ๋ฒ (Concrete Observers): ์ต์ ๋ฒ ์ธํฐํ์ด์ค์ ํน์ ๊ตฌํ์ฒด์ ๋๋ค. ์ด ๊ฐ์ฒด๋ค์ ์ฃผ์ฒด์ ๋ฑ๋กํ๊ณ ์ฃผ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์์ ์ต์ ๋ฒ ํจํด ๊ตฌํํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ์ต์ ๋ฒ ํจํด์ ์บก์ํํ๋ ์์ฐ์ค๋ฌ์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ฃผ์ฒด์ ์ต์ ๋ฒ๋ฅผ ์ํ ๋ณ๋์ ๋ชจ๋์ ๋ง๋ค์ด ๋ชจ๋์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์ต๋๋ค. ES ๋ชจ๋์ ์ฌ์ฉํ ์ค์ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
์์ : ์ฃผ๊ฐ ์ ๋ฐ์ดํธ
์ฃผ๊ฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฌ๋ฌ ์ปดํฌ๋ํธ(์: ์ฐจํธ, ๋ด์ค ํผ๋, ์๋ฆผ ์์คํ )์ ์๋ ค์ผ ํ๋ ์ฃผ๊ฐ ์๋น์ค๊ฐ ์๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋๊ณผ ํจ๊ป ์ต์ ๋ฒ ํจํด์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
1. ์ฃผ์ฒด (Observable) - `stockPriceService.js`
// stockPriceService.js
let observers = [];
let stockPrice = 100; // ์ด๊ธฐ ์ฃผ๊ฐ
const subscribe = (observer) => {
observers.push(observer);
};
const unsubscribe = (observer) => {
observers = observers.filter((obs) => obs !== observer);
};
const setStockPrice = (newPrice) => {
if (stockPrice !== newPrice) {
stockPrice = newPrice;
notifyObservers();
}
};
const notifyObservers = () => {
observers.forEach((observer) => observer.update(stockPrice));
};
export default {
subscribe,
unsubscribe,
setStockPrice,
};
์ด ๋ชจ๋์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- `observers`: ๋ชจ๋ ๋ฑ๋ก๋ ์ต์ ๋ฒ๋ฅผ ๋ด๋ ๋ฐฐ์ด.
- `stockPrice`: ํ์ฌ ์ฃผ๊ฐ.
- `subscribe(observer)`: ์ต์ ๋ฒ๋ฅผ `observers` ๋ฐฐ์ด์ ์ถ๊ฐํ๋ ํจ์.
- `unsubscribe(observer)`: ์ต์ ๋ฒ๋ฅผ `observers` ๋ฐฐ์ด์์ ์ ๊ฑฐํ๋ ํจ์.
- `setStockPrice(newPrice)`: ์ฃผ๊ฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ๊ฐ๊ฒฉ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ต์ ๋ฒ์๊ฒ ์๋ฆฌ๋ ํจ์.
- `notifyObservers()`: `observers` ๋ฐฐ์ด์ ์ํํ๋ฉฐ ๊ฐ ์ต์ ๋ฒ์ `update` ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ํจ์.
2. ์ต์ ๋ฒ ์ธํฐํ์ด์ค - `observer.js` (์ ํ ์ฌํญ์ด์ง๋ง, ํ์ ์์ ์ฑ์ ์ํด ๊ถ์ฅ๋จ)
// observer.js
// ์ค์ ์๋๋ฆฌ์ค์์๋ ์ฌ๊ธฐ์ ์ถ์ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ์ฌ
// `update` ๋ฉ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
// ์๋ฅผ ๋ค์ด, ํ์
์คํฌ๋ฆฝํธ ์ฌ์ฉ ์:
// interface Observer {
// update(stockPrice: number): void;
// }
// ๊ทธ๋ฐ ๋ค์ ์ด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ต์ ๋ฒ๊ฐ `update` ๋ฉ์๋๋ฅผ ๊ตฌํํ๋๋ก ํ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์๋ (ํ์ ์คํฌ๋ฆฝํธ ์์ด๋) ๋ค์ดํฐ๋ธ ์ธํฐํ์ด์ค๊ฐ ์์ง๋ง, ๋ ํ์ดํ(duck typing)์ด๋ ํ์ ์คํฌ๋ฆฝํธ์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ๋ฒ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์ต์ ๋ฒ๊ฐ ํ์ํ `update` ๋ฉ์๋๋ฅผ ๊ตฌํํ๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
3. ๊ตฌ์ฒด์ ์ธ ์ต์ ๋ฒ - `chartComponent.js`, `newsFeedComponent.js`, `alertSystem.js`
์ด์ ์ฃผ๊ฐ ๋ณํ์ ๋ฐ์ํ ๋ช ๊ฐ์ง ๊ตฌ์ฒด์ ์ธ ์ต์ ๋ฒ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
`chartComponent.js`
// chartComponent.js
import stockPriceService from './stockPriceService.js';
const chartComponent = {
update: (price) => {
// ์๋ก์ด ์ฃผ๊ฐ๋ก ์ฐจํธ๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค
console.log(`์ฐจํธ๊ฐ ์ ๊ฐ๊ฒฉ์ผ๋ก ์
๋ฐ์ดํธ๋จ: ${price}`);
},
};
stockPriceService.subscribe(chartComponent);
export default chartComponent;
`newsFeedComponent.js`
// newsFeedComponent.js
import stockPriceService from './stockPriceService.js';
const newsFeedComponent = {
update: (price) => {
// ์๋ก์ด ์ฃผ๊ฐ๋ก ๋ด์ค ํผ๋๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค
console.log(`๋ด์ค ํผ๋๊ฐ ์ ๊ฐ๊ฒฉ์ผ๋ก ์
๋ฐ์ดํธ๋จ: ${price}`);
},
};
stockPriceService.subscribe(newsFeedComponent);
export default newsFeedComponent;
`alertSystem.js`
// alertSystem.js
import stockPriceService from './stockPriceService.js';
const alertSystem = {
update: (price) => {
// ์ฃผ๊ฐ๊ฐ ํน์ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ฉด ์๋ฆผ์ ๋ฐ์์ํต๋๋ค
if (price > 110) {
console.log(`๊ฒฝ๊ณ : ์ฃผ๊ฐ๊ฐ ์๊ณ๊ฐ์ ์ด๊ณผํ์ต๋๋ค! ํ์ฌ ๊ฐ๊ฒฉ: ${price}`);
}
},
};
stockPriceService.subscribe(alertSystem);
export default alertSystem;
๊ฐ ๊ตฌ์ฒด์ ์ธ ์ต์ ๋ฒ๋ `stockPriceService`๋ฅผ ๊ตฌ๋ ํ๊ณ `update` ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ์ฃผ๊ฐ ๋ณํ์ ๋ฐ์ํฉ๋๋ค. ๊ฐ ์ปดํฌ๋ํธ๊ฐ ๋์ผํ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ํ ๋ค๋ฅธ ๋์์ ๊ฐ์ง ์ ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ธ์. ์ด๋ ๋์ปคํ๋ง์ ๊ฐ๋ ฅํจ์ ๋ณด์ฌ์ค๋๋ค.
4. ์ฃผ๊ฐ ์๋น์ค ์ฌ์ฉํ๊ธฐ
// main.js
import stockPriceService from './stockPriceService.js';
import chartComponent from './chartComponent.js'; // ๊ตฌ๋
์ด ๋ฐ์ํ๋๋ก ํ๋ ค๋ฉด ์ํฌํธ๊ฐ ํ์ํฉ๋๋ค
import newsFeedComponent from './newsFeedComponent.js'; // ๊ตฌ๋
์ด ๋ฐ์ํ๋๋ก ํ๋ ค๋ฉด ์ํฌํธ๊ฐ ํ์ํฉ๋๋ค
import alertSystem from './alertSystem.js'; // ๊ตฌ๋
์ด ๋ฐ์ํ๋๋ก ํ๋ ค๋ฉด ์ํฌํธ๊ฐ ํ์ํฉ๋๋ค
// ์ฃผ๊ฐ ์
๋ฐ์ดํธ ์๋ฎฌ๋ ์ด์
stockPriceService.setStockPrice(105);
stockPriceService.setStockPrice(112);
stockPriceService.setStockPrice(108);
// ์ปดํฌ๋ํธ ๊ตฌ๋
์ทจ์
stockPriceService.unsubscribe(chartComponent);
stockPriceService.setStockPrice(115); // ์ฐจํธ๋ ์
๋ฐ์ดํธ๋์ง ์๊ณ , ๋ค๋ฅธ ๊ฒ๋ค์ ์
๋ฐ์ดํธ๋ฉ๋๋ค
์ด ์์ ์์๋ `stockPriceService`์ ๊ตฌ์ฒด์ ์ธ ์ต์ ๋ฒ๋ค์ ์ํฌํธํฉ๋๋ค. ์ปดํฌ๋ํธ๋ฅผ ์ํฌํธํ๋ ๊ฒ์ ์ด๋ค์ด `stockPriceService`๋ฅผ ๊ตฌ๋ ํ๋๋ก ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ํด ํ์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ `setStockPrice` ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ฃผ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค. ์ฃผ๊ฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฑ๋ก๋ ์ต์ ๋ฒ๋ค์๊ฒ ์๋ฆผ์ด ๊ฐ๊ณ ๊ทธ๋ค์ `update` ๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค. ๋ํ `chartComponent`์ ๊ตฌ๋ ์ ์ทจ์ํ์ฌ ๋ ์ด์ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ง ์๋๋ก ํ๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ํฌํธ๋ ์ฃผ์ฒด๊ฐ ์๋ฆผ์ ๋ณด๋ด๊ธฐ ์์ํ๊ธฐ ์ ์ ์ต์ ๋ฒ๋ค์ด ๊ตฌ๋ ํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๋ชจ๋์ด ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋๋ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ค์ํฉ๋๋ค.
์ต์ ๋ฒ ํจํด ์ฌ์ฉ์ ์ด์
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์์ ์ต์ ๋ฒ ํจํด์ ๊ตฌํํ๋ฉด ๋ช ๊ฐ์ง ์ค์ํ ์ด์ ์ด ์์ต๋๋ค:
- ๋์จํ ๊ฒฐํฉ (Loose Coupling): ์ฃผ์ฒด๋ ์ต์ ๋ฒ์ ํน์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ ์์กด์ฑ์ ์ค์ด๊ณ ์์คํ ์ ๋ ์ ์ฐํ๊ฒ ๋ง๋ญ๋๋ค.
- ํ์ฅ์ฑ (Scalability): ์ฃผ์ฒด๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์ต์ ๋ฒ๋ฅผ ์ฝ๊ฒ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ด๋ ์๋ก์ด ์๊ตฌ ์ฌํญ์ด ๋ฐ์ํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ฅํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ์ฌ์ฌ์ฉ์ฑ (Reusability): ์ต์ ๋ฒ๋ ์ฃผ์ฒด์ ๋ ๋ฆฝ์ ์ด๋ฏ๋ก ๋ค๋ฅธ ์ปจํ ์คํธ์์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ชจ๋์ฑ (Modularity): ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ๋ชจ๋์ฑ์ด ๊ฐ์ ๋์ด ์ฝ๋๊ฐ ๋ ์ฒด๊ณ์ ์ด๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์์ง๋๋ค.
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ (Event-Driven Architecture): ์ต์ ๋ฒ ํจํด์ ๋ฐ์ํ ๋ฐ ๋ํํ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ํ์์ ์ธ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์์ ๋๋ค.
- ํ ์คํธ ์ฉ์ด์ฑ ํฅ์ (Improved Testability): ์ฃผ์ฒด์ ์ต์ ๋ฒ๊ฐ ๋์จํ๊ฒ ๊ฒฐํฉ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ ์ ์์ด ํ ์คํธ ๊ณผ์ ์ ๋จ์ํํฉ๋๋ค.
๋์ ๋ฐ ๊ณ ๋ ค์ฌํญ
์ต์ ๋ฒ ํจํด์ ๊ฐ๋ ฅํ์ง๋ง, ์ผ๋์ ๋์ด์ผ ํ ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์๊ณผ ๊ณ ๋ ค์ฌํญ์ด ์์ต๋๋ค:
- ๋ฐํ-๊ตฌ๋ (Pub/Sub): Pub/Sub๋ ์ต์ ๋ฒ์ ์ ์ฌํ์ง๋ง ์ค๊ฐ์ ๋ฉ์์ง ๋ธ๋ก์ปค๊ฐ ์๋ ๋ ์ผ๋ฐ์ ์ธ ํจํด์ ๋๋ค. ์ฃผ์ฒด๊ฐ ์ง์ ์ต์ ๋ฒ์๊ฒ ์๋ฆฌ๋ ๋์ , ํ ํฝ์ ๋ฉ์์ง๋ฅผ ๋ฐํํ๊ณ ์ต์ ๋ฒ๋ ๊ด์ฌ ์๋ ํ ํฝ์ ๊ตฌ๋ ํฉ๋๋ค. ์ด๋ ์ฃผ์ฒด์ ์ต์ ๋ฒ๋ฅผ ๋์ฑ ๋ถ๋ฆฌ์ํต๋๋ค. Redis Pub/Sub๋ ๋ฉ์์ง ํ(์: RabbitMQ, Apache Kafka)์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํนํ ๋ถ์ฐ ์์คํ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ Pub/Sub๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
- ์ด๋ฒคํธ ์ด๋ฏธํฐ (Event Emitters): Node.js๋ ์ต์ ๋ฒ ํจํด์ ๊ตฌํํ๋ ๋ด์ฅ `EventEmitter` ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ Node.js ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์ ์ ์ ์ด๋ฒคํธ ์ด๋ฏธํฐ์ ๋ฆฌ์ค๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
- ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ (RxJS): RxJS๋ Observable์ ์ฌ์ฉํ์ฌ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ๊ณผ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. RxJS Observable์ ์ต์ ๋ฒ ํจํด์ ์ฃผ์ฒด์ ์ ์ฌํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๊ณ ํํฐ๋งํ๊ธฐ ์ํ ์ฐ์ฐ์์ ๊ฐ์ ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค.
- ๋ณต์ก์ฑ: ์ต์ ๋ฒ ํจํด์ ์ ์คํ๊ฒ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ฝ๋๋ฒ ์ด์ค์ ๋ณต์ก์ฑ์ ๋ํ ์ ์์ต๋๋ค. ๊ตฌํํ๊ธฐ ์ ์ ์ถ๊ฐ๋๋ ๋ณต์ก์ฑ๊ณผ ์ด์ ์ ๋น๊ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ ์ด์ ํ์ํ์ง ์์ ์ต์ ๋ฒ๋ ์ ์ ํ ๊ตฌ๋ ์ทจ์ํด์ผ ํฉ๋๋ค. ์ด๋ ํนํ ์ฅ๊ธฐ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค์ํฉ๋๋ค. `WeakRef` ๋ฐ `WeakMap`๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฌํ ์๋๋ฆฌ์ค์์ ๊ฐ์ฒด ์๋ช ์ ๊ด๋ฆฌํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ ์ญ ์ํ: ์ต์ ๋ฒ ํจํด์ ๋์ปคํ๋ง์ ์ด์งํ์ง๋ง, ๊ตฌํ ์ ์ ์ญ ์ํ๋ฅผ ๋์ ํ๋ ๊ฒ์ ์ฃผ์ํด์ผ ํฉ๋๋ค. ์ ์ญ ์ํ๋ ์ฝ๋๋ฅผ ์ดํดํ๊ณ ํ ์คํธํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์์กด์ฑ์ ๋ช ์์ ์ผ๋ก ์ ๋ฌํ๊ฑฐ๋ ์์กด์ฑ ์ฃผ์ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
- ์ปจํ ์คํธ: ๊ตฌํ์ ์ ํํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์คํธ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ๊ฐ๋จํ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ธ ์ต์ ๋ฒ ํจํด ๊ตฌํ์ผ๋ก ์ถฉ๋ถํ ์ ์์ต๋๋ค. ๋ ๋ณต์กํ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ RxJS์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ Pub/Sub ์์คํ ์ ๊ตฌํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ์์ ํด๋ผ์ด์ธํธ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ์ ์ธ ์ธ๋ฉ๋ชจ๋ฆฌ(in-memory) ์ต์ ๋ฒ ํจํด์ ์ฌ์ฉํ ์ ์์ง๋ง, ๋๊ท๋ชจ ๋ถ์ฐ ์์คํ ์ ๋ฉ์์ง ํ๊ฐ ์๋ ๊ฒฌ๊ณ ํ Pub/Sub ๊ตฌํ์ ์ด์ ์ ๋๋ฆด ๊ฒ์ ๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ์ฃผ์ฒด์ ์ต์ ๋ฒ ๋ชจ๋์์ ์ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ญ์์ค. ์ต์ ๋ฒ์์ ์ฒ๋ฆฌ๋์ง ์์ ์์ธ๋ ๋ค๋ฅธ ์ต์ ๋ฒ์๊ฒ ์๋ฆผ์ด ์ ๋ฌ๋๋ ๊ฒ์ ๋ง์ ์ ์์ต๋๋ค. `try...catch` ๋ธ๋ก์ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๊ณ ํธ์ถ ์คํ ์๋ก ์ ํ๋๋ ๊ฒ์ ๋ฐฉ์งํ์ญ์์ค.
์ค์ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
์ต์ ๋ฒ ํจํด์ ๋ค์ํ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํ๋ ์์ํฌ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค:
- GUI ํ๋ ์์ํฌ: ๋ง์ GUI ํ๋ ์์ํฌ(์: React, Angular, Vue.js)๋ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ์ฒ๋ฆฌํ๊ณ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ฐ๋ผ UI๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ์ต์ ๋ฒ ํจํด์ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, React ์ปดํฌ๋ํธ์์ ์ํ ๋ณ๊ฒฝ์ ํด๋น ์ปดํฌ๋ํธ์ ๊ทธ ์์๋ค์ ์ฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํ์ฌ ํจ๊ณผ์ ์ผ๋ก ์ต์ ๋ฒ ํจํด์ ๊ตฌํํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ: ์น ๋ธ๋ผ์ฐ์ ์ DOM ์ด๋ฒคํธ ๋ชจ๋ธ์ ์ต์ ๋ฒ ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ด๋ฒคํธ ๋ฆฌ์ค๋(์ต์ ๋ฒ)๋ DOM ์์(์ฃผ์ฒด)์ ํน์ ์ด๋ฒคํธ(์: click, mouseover)์ ๋ฑ๋กํ๊ณ ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์๋ฆผ์ ๋ฐ์ต๋๋ค.
- ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ : ์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ (์: ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ , ์จ๋ผ์ธ ๊ฒ์)์ ์ข ์ข ์ฐ๊ฒฐ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฐ์ดํธ๋ฅผ ์ ํํ๊ธฐ ์ํด ์ต์ ๋ฒ ํจํด์ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฑํ ์๋ฒ๋ ์ ๋ฉ์์ง๊ฐ ์ ์ก๋ ๋๋ง๋ค ๋ชจ๋ ์ฐ๊ฒฐ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ฆด ์ ์์ต๋๋ค. Socket.IO์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ข ์ข ์ค์๊ฐ ํต์ ์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ: ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ํ๋ ์์ํฌ(์: Angular, Vue.js)๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ UI๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ๊ธฐ ์ํด ์ต์ ๋ฒ ํจํด์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฐ๋ฐ ๊ณผ์ ์ ๋จ์ํํ๊ณ ํ์ํ ์์ฉ๊ตฌ ์ฝ๋(boilerplate code)์ ์์ ์ค์ ๋๋ค.
- ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ: ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์์ ์ต์ ๋ฒ ๋๋ Pub/Sub ํจํด์ ๋ค๋ฅธ ์๋น์ค ๊ฐ์ ํต์ ์ ์ฉ์ดํ๊ฒ ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ ์๋น์ค๊ฐ ์ ์ฌ์ฉ์๊ฐ ์์ฑ๋ ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ฉด ๋ค๋ฅธ ์๋น์ค๋ค์ด ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ์ฌ ๊ด๋ จ ์์ (์: ํ์ ์ด๋ฉ์ผ ๋ณด๋ด๊ธฐ, ๊ธฐ๋ณธ ํ๋กํ ์์ฑ)์ ์ํํ ์ ์์ต๋๋ค.
- ๊ธ์ต ์ ํ๋ฆฌ์ผ์ด์ : ๊ธ์ต ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ์ฌ์ฉ์์๊ฒ ์ค์๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ต์ ๋ฒ ํจํด์ ์ฌ์ฉํฉ๋๋ค. ์ฃผ์ ์์ฅ ๋์๋ณด๋, ๊ฑฐ๋ ํ๋ซํผ, ํฌํธํด๋ฆฌ์ค ๊ด๋ฆฌ ๋๊ตฌ ๋ชจ๋ ํจ์จ์ ์ธ ์ด๋ฒคํธ ์๋ฆผ์ ์์กดํ์ฌ ์ฌ์ฉ์๋ค์ด ์ ๋ณด๋ฅผ ๊ณ์ ์ป์ ์ ์๋๋ก ํฉ๋๋ค.
- ์ฌ๋ฌผ ์ธํฐ๋ท (IoT): IoT ์ฅ์น๋ ์ข ์ข ์ค์ ์๋ฒ์ ํต์ ํ๊ธฐ ์ํด ์ต์ ๋ฒ ํจํด์ ์ฌ์ฉํฉ๋๋ค. ์ผ์๋ ์ฃผ์ฒด ์ญํ ์ ํ์ฌ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๋ฅผ ์๋ฒ์ ๋ฐํํ๊ณ , ์๋ฒ๋ ํด๋น ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌ๋ ํ๋ ๋ค๋ฅธ ์ฅ์น๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ฆฝ๋๋ค.
๊ฒฐ๋ก
์ต์ ๋ฒ ํจํด์ ๋ถ๋ฆฌ๋๊ณ , ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ, ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. ์ต์ ๋ฒ ํจํด์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ํ์ฉํจ์ผ๋ก์จ, ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ ๊ฒฌ๊ณ ํ ์ด๋ฒคํธ ์๋ฆผ ์์คํ ์ ๋ง๋ค ์ ์์ต๋๋ค. ์์ ํด๋ผ์ด์ธํธ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋๊ท๋ชจ ๋ถ์ฐ ์์คํ ์ ๊ตฌ์ถํ๋ , ์ต์ ๋ฒ ํจํด์ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ์ฝ๋์ ์ ๋ฐ์ ์ธ ์ํคํ ์ฒ๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
๊ตฌํ์ ์ ํํ ๋ ๋์๊ณผ ์ฅ๋จ์ ์ ๊ณ ๋ คํ๊ณ , ํญ์ ๋์จํ ๊ฒฐํฉ๊ณผ ๋ช ํํ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ฅผ ์ฐ์ ์ํ๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ์ด๋ฌํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฆ์ผ๋ก์จ, ์ต์ ๋ฒ ํจํด์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ ๋ ์ ์ฐํ๊ณ ๋ณต์๋ ฅ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.