์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ปค๋งจ๋ ํจํด์ ๊ฐ๋ ฅํ ์ก์ ์บก์ํ ๊ธฐ๋ฅ์ ํ์ํ์ฌ, ๊ธ๋ก๋ฒ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ์ฝ๋ ๊ตฌ์ฑ, ์ ์ง๋ณด์์ฑ, ํ ์คํธ ์ฉ์ด์ฑ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ปค๋งจ๋ ํจํด: ์ก์ ์บก์ํ
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ์์ญ, ํนํ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํ๋ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ๋ ์ ์ง๋ณด์์ฑ, ํ ์คํธ ์ฉ์ด์ฑ, ํ์ฅ์ฑ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ด๋ฌํ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ํจ๊ณผ์ ์ธ ์ ๊ทผ ๋ฐฉ์ ์ค ํ๋๋ ๋์์ธ ํจํด์ ์ ์ฉํ๋ ๊ฒ์ ๋๋ค. ๊ทธ์ค์์๋ ์ปค๋งจ๋ ํจํด์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ์์คํ ๊ณผ ๊ฒฐํฉ๋ ๋ ์ก์ ์ ์บก์ํํ๊ณ , ๋์จํ ๊ฒฐํฉ์ ์ด์งํ๋ฉฐ, ์ฝ๋ ๊ตฌ์ฑ์ ํฅ์์ํค๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ์ ๊ณตํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ข ์ข ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ปค๋งจ๋ ํจํด์ด๋ผ๊ณ ํฉ๋๋ค.
์ปค๋งจ๋ ํจํด์ด๋ ๋ฌด์์ธ๊ฐ?
์ปค๋งจ๋ ํจํด์ ์์ฒญ์ ๋ ๋ฆฝ ์คํํ ๊ฐ์ฒด๋ก ๋ฐ๊พธ๋ ํ๋ ๋์์ธ ํจํด์ ๋๋ค. ์ด ๊ฐ์ฒด๋ ์์ฒญ์ ๋ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค. ์ด๋ฌํ ๋ณํ์ ํตํด ํด๋ผ์ด์ธํธ๋ฅผ ๋ค์ํ ์์ฒญ์ผ๋ก ๋งค๊ฐ๋ณ์ํํ๊ณ , ์์ฒญ์ ํ์ ๋ฃ๊ฑฐ๋ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํ๋ฉฐ, ์คํ ์ทจ์ ๊ฐ๋ฅํ ์์ ์ ์ง์ํ ์ ์์ต๋๋ค. ๋ณธ์ง์ ์ผ๋ก, ์ด๋ ์์ ์ ํธ์ถํ๋ ๊ฐ์ฒด์ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค. ์ด๋ฌํ ๋ถ๋ฆฌ๋ ํนํ ์ ์ธ๊ณ์ ์ผ๋ก ๋ค์ํ ๋ฒ์์ ์ฌ์ฉ์ ์ํธ ์์ฉ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ธฐ๋ฅ์ ๋ค๋ฃฐ ๋ ์ ์ฐํ๊ณ ์ ์ ๊ฐ๋ฅํ ์ํํธ์จ์ด ์์คํ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
์ปค๋งจ๋ ํจํด์ ํต์ฌ ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ปค๋งจ๋(Command): ์ก์ ์คํ์ ์ํ ๋ฉ์๋๋ฅผ ์ ์ธํ๋ ์ธํฐํ์ด์ค์ ๋๋ค.
- ๊ตฌ์ฒด์ ์ธ ์ปค๋งจ๋(Concrete Command): ์ปค๋งจ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉฐ, ์ก์ ์ ์์ ์์ ๋ฐ์ธ๋ฉํ์ฌ ์์ฒญ์ ์บก์ํํ๋ ํด๋์ค์ ๋๋ค.
- ํธ์ถ์(Invoker): ์ปค๋งจ๋์๊ฒ ์์ฒญ์ ์ํํ๋๋ก ์์ฒญํ๋ ํด๋์ค์ ๋๋ค.
- ์์ ์(Receiver): ์์ฒญ๊ณผ ๊ด๋ จ๋ ์ก์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์๋ ํด๋์ค์ ๋๋ค.
- ํด๋ผ์ด์ธํธ(Client): ๊ตฌ์ฒด์ ์ธ ์ปค๋งจ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์ ์๋ฅผ ์ค์ ํฉ๋๋ค.
์ปค๋งจ๋ ํจํด์ ๋ชจ๋์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ?
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋จ์๋ก ์บก์ํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ปค๋งจ๋ ํจํด๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ๊ฒฐํฉํจ์ผ๋ก์จ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ป์ ์ ์์ต๋๋ค:
- ์บก์ํ: ๋ชจ๋์ ๊ด๋ จ๋ ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ์บก์ํํ์ฌ ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์ฝ๋ ๊ตฌ์ฑ์ ๊ฐ์ ํฉ๋๋ค. ์ด๋ ํนํ ๋ค๋ฅธ ์ง์ญ์ ๊ฐ๋ฐ์๋ค์ด ๊ธฐ์ฌํ๋ ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ์ ์ฉํฉ๋๋ค.
- ๋์จํ ๊ฒฐํฉ: ์ปค๋งจ๋ ํจํด์ ํธ์ถ์์ ์์ ์ ๊ฐ์ ๋์จํ ๊ฒฐํฉ์ ์ด์งํฉ๋๋ค. ๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ๋ค ์ฌ์ด์ ๋ช ํํ ๊ฒฝ๊ณ๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ์ด๋ฅผ ๋์ฑ ๊ฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด ์๋ก ๋ค๋ฅธ ์๊ฐ๋์ ๊ทผ๋ฌดํ ์ ์๋ ์ฌ๋ฌ ํ์ด ์๋ก ๊ฐ์ญํ์ง ์๊ณ ๋์์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์์ ํ ์ ์์ต๋๋ค.
- ํ ์คํธ ์ฉ์ด์ฑ: ๋ชจ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค. ์ปค๋งจ๋ ํจํด์ ์ก์ ์ ๋ช ์์ ์ผ๋ก ๋ง๋ค์ด ๊ฐ ์ปค๋งจ๋๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐฐํฌ๋๋ ์ํํธ์จ์ด์ ํ์ง๊ณผ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
- ์ฌ์ฌ์ฉ์ฑ: ์ปค๋งจ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ์ฌ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ๋ชจ๋ ๊ฐ์ ์ปค๋งจ๋๋ฅผ ๊ณต์ ํ์ฌ ์ฝ๋ ์ฌ์ฌ์ฉ์ ์ด์งํ๊ณ ์ค๋ณต์ ์ค์ผ ์ ์์ต๋๋ค.
- ์ ์ง๋ณด์์ฑ: ๋ชจ๋ํ๋ ์ฝ๋๋ ์ ์ง๋ณด์ํ๊ณ ์ ๋ฐ์ดํธํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค. ํ ๋ชจ๋์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ๋ฏธ์น ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค. ์ปค๋งจ๋ ํจํด์ ์บก์ํ๋ ํน์ฑ์ ํน์ ์ก์ ์ ๋ํ ๋ณ๊ฒฝ์ ์ํฅ์ ๋์ฑ ๊ฒฉ๋ฆฌ์ํต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ปค๋งจ๋ ํจํด ๊ตฌํํ๊ธฐ
์ค์ฉ์ ์ธ ์์ ๋ฅผ ํตํด ์ด๋ฅผ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฅ๋ฐ๊ตฌ๋์ ์ํ ์ถ๊ฐ, ํ ์ธ ์ ์ฉ, ๊ฒฐ์ ์ฒ๋ฆฌ์ ๊ฐ์ ๊ธฐ๋ฅ์ด ์๋ ๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์์ํด ๋ณด์ธ์. ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ปค๋งจ๋ ํจํด์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ก์ ๋ค์ ์บก์ํํ ์ ์์ต๋๋ค.
์์ : ์ ์์๊ฑฐ๋ ์ก์
ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ค์ธ ES ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์ปค๋งจ๋๋ฅผ ์ ์ํ ๊ฒ์ ๋๋ค.
1. ์ปค๋งจ๋ ์ธํฐํ์ด์ค ์ ์ (command.js):
// command.js
export class Command {
constructor() {
if (this.constructor === Command) {
throw new Error("์ถ์ ํด๋์ค๋ ์ธ์คํด์คํํ ์ ์์ต๋๋ค.");
}
}
execute() {
throw new Error("'execute()' ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.");
}
}
์ด๋ ์ถ์์ ์ธ `execute` ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ธฐ๋ณธ `Command` ํด๋์ค๋ฅผ ์ ์ํฉ๋๋ค.
2. ๊ตฌ์ฒด์ ์ธ ์ปค๋งจ๋ ๊ตฌํ (add-to-cart-command.js, apply-discount-command.js, process-payment-command.js):
// add-to-cart-command.js
import { Command } from './command.js';
export class AddToCartCommand extends Command {
constructor(cart, item, quantity) {
super();
this.cart = cart;
this.item = item;
this.quantity = quantity;
}
execute() {
this.cart.addItem(this.item, this.quantity);
}
}
// apply-discount-command.js
import { Command } from './command.js';
export class ApplyDiscountCommand extends Command {
constructor(cart, discountCode) {
super();
this.cart = cart;
this.discountCode = discountCode;
}
execute() {
this.cart.applyDiscount(this.discountCode);
}
}
// process-payment-command.js
import { Command } from './command.js';
export class ProcessPaymentCommand extends Command {
constructor(paymentProcessor, amount, paymentMethod) {
super();
this.paymentProcessor = paymentProcessor;
this.amount = amount;
this.paymentMethod = paymentMethod;
}
execute() {
this.paymentProcessor.processPayment(this.amount, this.paymentMethod);
}
}
์ด ํ์ผ๋ค์ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ก์ ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ปค๋งจ๋๋ฅผ ๊ตฌํํ๋ฉฐ, ๊ฐ๊ฐ ํ์ํ ๋ฐ์ดํฐ์ ๋ก์ง์ ์บก์ํํฉ๋๋ค.
3. ์์ ์ ๊ตฌํ (cart.js, payment-processor.js):
// cart.js
export class Cart {
constructor() {
this.items = [];
this.discount = 0;
}
addItem(item, quantity) {
this.items.push({ item, quantity });
console.log(`${item} ${quantity}๊ฐ๋ฅผ ์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐํ์ต๋๋ค.`);
}
applyDiscount(discountCode) {
// ํ ์ธ ์ฝ๋ ์ ํจ์ฑ ๊ฒ์ฌ ์๋ฎฌ๋ ์ด์
(์ค์ ๋ก์ง์ผ๋ก ๋์ฒด)
if (discountCode === 'GLOBAL20') {
this.discount = 0.2;
console.log('ํ ์ธ์ด ์ ์ฉ๋์์ต๋๋ค!');
} else {
console.log('์ ํจํ์ง ์์ ํ ์ธ ์ฝ๋์
๋๋ค.');
}
}
getTotal() {
let total = 0;
this.items.forEach(item => {
total += item.item.price * item.quantity;
});
return total * (1 - this.discount);
}
}
// payment-processor.js
export class PaymentProcessor {
processPayment(amount, paymentMethod) {
// ๊ฒฐ์ ์ฒ๋ฆฌ ์๋ฎฌ๋ ์ด์
(์ค์ ๋ก์ง์ผ๋ก ๋์ฒด)
console.log(`${paymentMethod}๋ฅผ ์ฌ์ฉํ์ฌ ${amount} ๊ฒฐ์ ๋ฅผ ์ฒ๋ฆฌ ์ค์
๋๋ค.`);
return true; // ๊ฒฐ์ ์ฑ๊ณต ํ์
}
}
์ด ํ์ผ๋ค์ ์ค์ ์ก์ ์ ์ํํ๋ ์์ ์์ธ `Cart`์ `PaymentProcessor` ํด๋์ค๋ฅผ ์ ์ํฉ๋๋ค.
4. ํธ์ถ์ ๊ตฌํ (checkout-service.js):
// checkout-service.js
export class CheckoutService {
constructor() {
this.commands = [];
}
addCommand(command) {
this.commands.push(command);
}
executeCommands() {
this.commands.forEach(command => {
command.execute();
});
this.commands = []; // ์คํ ํ ์ปค๋งจ๋ ์ด๊ธฐํ
}
}
`CheckoutService`๋ ์ปค๋งจ๋๋ฅผ ๊ด๋ฆฌํ๊ณ ์คํํ๋ ์ฑ ์์ ์ง๋ ํธ์ถ์ ์ญํ ์ ํฉ๋๋ค.
5. ์ฌ์ฉ ์์ (main.js):
// main.js
import { Cart } from './cart.js';
import { PaymentProcessor } from './payment-processor.js';
import { AddToCartCommand } from './add-to-cart-command.js';
import { ApplyDiscountCommand } from './apply-discount-command.js';
import { ProcessPaymentCommand } from './process-payment-command.js';
import { CheckoutService } from './checkout-service.js';
// ์ธ์คํด์ค ์์ฑ
const cart = new Cart();
const paymentProcessor = new PaymentProcessor();
const checkoutService = new CheckoutService();
// ์ํ ์์ดํ
const item1 = { name: '๊ธ๋ก๋ฒ ์ ํ A', price: 10 };
const item2 = { name: '๊ธ๋ก๋ฒ ์ ํ B', price: 20 };
// ์ปค๋งจ๋ ์์ฑ
const addToCartCommand1 = new AddToCartCommand(cart, item1, 2);
const addToCartCommand2 = new AddToCartCommand(cart, item2, 1);
const applyDiscountCommand = new ApplyDiscountCommand(cart, 'GLOBAL20');
const processPaymentCommand = new ProcessPaymentCommand(paymentProcessor, cart.getTotal(), '์ ์ฉ์นด๋');
// ์ฒดํฌ์์ ์๋น์ค์ ์ปค๋งจ๋ ์ถ๊ฐ
checkoutService.addCommand(addToCartCommand1);
checkoutService.addCommand(addToCartCommand2);
checkoutService.addCommand(applyDiscountCommand);
checkoutService.addCommand(processPaymentCommand);
// ์ปค๋งจ๋ ์คํ
checkoutService.executeCommands();
์ด ์์ ๋ ์ปค๋งจ๋ ํจํด์ด ๋ชจ๋๊ณผ ๊ฒฐํฉํ์ฌ ์ด๋ป๊ฒ ๋ค์ํ ์ก์ ์ ๋ช ํํ๊ณ ์กฐ์ง์ ์ธ ๋ฐฉ์์ผ๋ก ์บก์ํํ๋์ง ๋ณด์ฌ์ค๋๋ค. `CheckoutService`๋ ๊ฐ ์ก์ ์ ์ธ๋ถ ์ฌํญ์ ์ ํ์ ์์ด ๋จ์ํ ์ปค๋งจ๋๋ฅผ ์คํํ๊ธฐ๋ง ํฉ๋๋ค. ์ด ์ํคํ ์ฒ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ๊ธฐ๋ฅ์ ์์ ํ๋ ๊ณผ์ ์ ๋จ์ํํฉ๋๋ค. ์ฃผ๋ก ์์์์์ ์ฌ์ฉ๋๋ ์๋ก์ด ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด ์ง์์ ์ถ๊ฐํด์ผ ํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ด๋ ์ฅ๋ฐ๊ตฌ๋๋ ์ฒดํฌ์์ ํ๋ก์ธ์ค์ ๊ด๋ จ๋ ๊ธฐ์กด ๋ชจ๋์ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ก์ด ์ปค๋งจ๋๋ก ๊ตฌํ๋ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ํํธ์จ์ด ๊ฐ๋ฐ์์์ ์ด์
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ปค๋งจ๋ ํจํด์ ๊ธ๋ก๋ฒ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ์๋นํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ํฅ์๋ ํ์ : ๋ช ํํ ๋ชจ๋ ๊ฒฝ๊ณ์ ์บก์ํ๋ ์ก์ ์ ๋ค๋ฅธ ์๊ฐ๋์ ์ง์ญ์ ๊ฑธ์ณ ์๋ ๊ฐ๋ฐ์ ๊ฐ์ ํ์ ์ ๋จ์ํํฉ๋๋ค. ๊ฐ ํ์ ๋ค๋ฅธ ํ์ ๋ฐฉํดํ์ง ์๊ณ ํน์ ๋ชจ๋๊ณผ ์ปค๋งจ๋์ ์ง์คํ ์ ์์ต๋๋ค.
- ํฅ์๋ ์ฝ๋ ํ์ง: ์ด ํจํด์ ํ ์คํธ ์ฉ์ด์ฑ, ์ฌ์ฌ์ฉ์ฑ, ์ ์ง๋ณด์์ฑ์ ์ด์งํ์ฌ ๋ ๋์ ์ฝ๋ ํ์ง๊ณผ ๋ ์ ์ ๋ฒ๊ทธ๋ก ์ด์ด์ง๋๋ค. ์ด๋ ๋ค์ํ ํ๊ฒฝ์์ ์ ๋ขฐํ ์ ์๊ณ ๊ฒฌ๊ณ ํด์ผ ํ๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ค์ํฉ๋๋ค.
- ๋ ๋น ๋ฅธ ๊ฐ๋ฐ ์ฃผ๊ธฐ: ๋ชจ๋ํ๋ ์ฝ๋์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปค๋งจ๋๋ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ํํ์ฌ ํ์ด ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ์ ๋ฐ์ดํธ๋ฅผ ๋ ๋นจ๋ฆฌ ์ ๊ณตํ ์ ์๊ฒ ํฉ๋๋ค. ์ด ๋ฏผ์ฒฉ์ฑ์ ๊ธ๋ก๋ฒ ์์ฅ์์ ๊ฒฝ์๋ ฅ์ ์ ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ์ฌ์ด ํ์งํ ๋ฐ ๊ตญ์ ํ: ์ด ํจํด์ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ฅผ ์ด์งํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์งํํ๊ณ ๊ตญ์ ํํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ํน์ ์ปค๋งจ๋๋ ํต์ฌ ๊ธฐ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ค๋ฅธ ์ง์ญ์ ์๊ตฌ ์ฌํญ์ ์ฒ๋ฆฌํ๋๋ก ์์ ํ๊ฑฐ๋ ๊ต์ฒดํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํตํ ๊ธฐํธ๋ฅผ ํ์ํ๋ ์ปค๋งจ๋๋ ๊ฐ ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ง๋ ์ฌ๋ฐ๋ฅธ ๊ธฐํธ๋ฅผ ํ์ํ๋๋ก ์ฝ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค.
- ์ํ ๊ฐ์: ํจํด์ ๋์จํ๊ฒ ๊ฒฐํฉ๋ ํน์ฑ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ๋ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์ํ์ ์ค์ฌ์ค๋๋ค. ์ด๋ ๊ธ๋ก๋ฒ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ๊ฐ์ง ํฌ๊ณ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ค์ํฉ๋๋ค.
์ค์ ์ฌ๋ก ๋ฐ ์ ์ฉ
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ปค๋งจ๋ ํจํด์ ๋ค์ํ ์ค์ ์๋๋ฆฌ์ค์ ์ ์ฉ๋ ์ ์์ต๋๋ค:
- ์ ์์๊ฑฐ๋ ํ๋ซํผ: ์ฅ๋ฐ๊ตฌ๋ ๊ด๋ฆฌ, ๊ฒฐ์ ์ฒ๋ฆฌ, ํ ์ธ ์ ์ฉ, ๋ฐฐ์ก ์ ๋ณด ์ฒ๋ฆฌ.
- ์ฝํ ์ธ ๊ด๋ฆฌ ์์คํ (CMS): ์ฝํ ์ธ ์์ฑ, ํธ์ง, ๊ฒ์, ์ฌ์ฉ์ ์ญํ ๋ฐ ๊ถํ ๊ด๋ฆฌ, ๋ฏธ๋์ด ์์ฐ ์ฒ๋ฆฌ.
- ์ํฌํ๋ก์ฐ ์๋ํ ์์คํ : ์ํฌํ๋ก์ฐ ์ ์ ๋ฐ ์คํ, ์์ ๊ด๋ฆฌ, ์งํ ์ํฉ ์ถ์ .
- ๊ฒ์ ๊ฐ๋ฐ: ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ, ๊ฒ์ ์ํ ๊ด๋ฆฌ, ๊ฒ์ ์ก์ ์คํ. ์บ๋ฆญํฐ ์ด๋, ๊ณต๊ฒฉ, ์์ดํ ์ฌ์ฉ๊ณผ ๊ฐ์ ์ก์ ์ ์ปค๋งจ๋๋ก ์บก์ํํ๋ ๋ฉํฐํ๋ ์ด์ด ๊ฒ์์ ์์ํด ๋ณด์ธ์. ์ด๋ ์คํ ์ทจ์/๋ค์ ์คํ ๊ธฐ๋ฅ์ ๊ตฌํ์ ์ฉ์ดํ๊ฒ ํ๊ณ ๋คํธ์ํฌ ๋๊ธฐํ๋ฅผ ์ด์งํฉ๋๋ค.
- ๊ธ์ต ์ ํ๋ฆฌ์ผ์ด์ : ๊ฑฐ๋ ์ฒ๋ฆฌ, ๊ณ์ ๊ด๋ฆฌ, ๋ณด๊ณ ์ ์์ฑ. ์ปค๋งจ๋ ํจํด์ ๊ธ์ต ์์ ์ด ์ผ๊ด๋๊ณ ์ ๋ขฐํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์คํ๋๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ๊ณ ๋ ค ์ฌํญ
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ปค๋งจ๋ ํจํด์ ๋ง์ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ํจ๊ณผ์ ์ธ ๊ตฌํ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ์ปค๋งจ๋๋ฅผ ์๊ณ ์ง์ค์ ์ผ๋ก ์ ์งํ๊ธฐ: ๊ฐ ์ปค๋งจ๋๋ ๋จ์ผํ๊ณ ์ ์ ์๋ ์ก์ ์ ์บก์ํํด์ผ ํฉ๋๋ค. ์ดํดํ๊ณ ์ ์งํ๊ธฐ ์ด๋ ค์ด ํฌ๊ณ ๋ณต์กํ ์ปค๋งจ๋๋ฅผ ๋ง๋ค์ง ๋ง์ธ์.
- ์ค๋ช ์ ์ธ ์ด๋ฆ ์ฌ์ฉํ๊ธฐ: ์ปค๋งจ๋์ ๋ชฉ์ ์ ๋ฐ์ํ๋ ๋ช ํํ๊ณ ์ค๋ช ์ ์ธ ์ด๋ฆ์ ๋ถ์ฌํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ๊ณ ์ดํดํ ์ ์์ต๋๋ค.
- ์ปค๋งจ๋ ํ ์ฌ์ฉ ๊ณ ๋ คํ๊ธฐ: ๋น๋๊ธฐ ์์ ์ด๋ ํน์ ์์๋ก ์คํ๋์ด์ผ ํ๋ ์์ ์ ๊ฒฝ์ฐ ์ปค๋งจ๋ ํ ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์.
- ์คํ ์ทจ์/๋ค์ ์คํ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ: ์ปค๋งจ๋ ํจํด์ ์คํ ์ทจ์/๋ค์ ์คํ ๊ธฐ๋ฅ์ ๋น๊ต์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ท์คํ ๊ธฐ๋ฅ์ด ๋ ์ ์์ต๋๋ค.
- ์ปค๋งจ๋ ๋ฌธ์ํํ๊ธฐ: ๊ฐ ์ปค๋งจ๋์ ๋ํด ๋ชฉ์ , ๋งค๊ฐ๋ณ์, ๋ฐํ ๊ฐ์ ์ค๋ช ํ๋ ๋ช ํํ ๋ฌธ์๋ฅผ ์ ๊ณตํ์ธ์. ์ด๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ปค๋งจ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ดํดํ๊ณ ์ฌ์ฉํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
- ์ฌ๋ฐ๋ฅธ ๋ชจ๋ ์์คํ ์ ํํ๊ธฐ: ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์๋ ์ผ๋ฐ์ ์ผ๋ก ES ๋ชจ๋์ด ์ ํธ๋์ง๋ง, ํ๋ก์ ํธ์ ์๊ตฌ ์ฌํญ ๋ฐ ๋์ ํ๊ฒฝ์ ๋ฐ๋ผ CommonJS ๋๋ AMD๊ฐ ์ ํฉํ ์ ์์ต๋๋ค.
๋์ ๋ฐ ๊ด๋ จ ํจํด
์ปค๋งจ๋ ํจํด์ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ๋ชจ๋ ๋ฌธ์ ์ ๋ํ ์ต์์ ํด๊ฒฐ์ฑ ์ ์๋๋๋ค. ๊ณ ๋ คํด ๋ณผ ๋งํ ๋ช ๊ฐ์ง ๋์ ํจํด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ ๋ต ํจํด(Strategy Pattern): ์ ๋ต ํจํด์ ์ฌ์ฉํ๋ฉด ๋ฐํ์์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ ์ ์์ต๋๋ค. ์ปค๋งจ๋ ํจํด๊ณผ ์ ์ฌํ์ง๋ง, ์ก์ ์ ์บก์ํํ๋ ๊ฒ๋ณด๋ค ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค.
- ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด(Template Method Pattern): ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ๊ธฐ๋ณธ ํด๋์ค์์ ์๊ณ ๋ฆฌ์ฆ์ ๊ณจ๊ฒฉ์ ์ ์ํ์ง๋ง, ํ์ ํด๋์ค๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์๊ณ ๋ฆฌ์ฆ์ ํน์ ๋จ๊ณ๋ฅผ ์ฌ์ ์ํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ต์ ๋ฒ ํจํด(Observer Pattern): ์ต์ ๋ฒ ํจํด์ ๊ฐ์ฒด ๊ฐ์ ์ผ๋๋ค ์ข ์์ฑ์ ์ ์ํ์ฌ ํ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ชจ๋ ์ข ์ ๊ฐ์ฒด๊ฐ ์๋์ผ๋ก ์๋ฆผ์ ๋ฐ๊ณ ์ ๋ฐ์ดํธ๋๋๋ก ํฉ๋๋ค.
- ์ด๋ฒคํธ ๋ฒ์ค ํจํด(Event Bus Pattern): ์ปดํฌ๋ํธ๋ค์ด ์ค์ ์ด๋ฒคํธ ๋ฒ์ค๋ฅผ ํตํด ํต์ ํ ์ ์๋๋ก ํ์ฌ ์ปดํฌ๋ํธ๋ค์ ๋ถ๋ฆฌํฉ๋๋ค. ์ปดํฌ๋ํธ๋ ๋ฒ์ค์ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ ์ ์๊ณ , ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ ํน์ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๊ณ ์ด์ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ์๋ก ํต์ ํด์ผ ํ๋ ๋ง์ ์ปดํฌ๋ํธ๊ฐ ์์ ๋ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ํจํด์ ๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ปค๋งจ๋ ํจํด์ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ก์ ์ ์บก์ํํ๊ณ , ๋์จํ ๊ฒฐํฉ์ ์ด์งํ๋ฉฐ, ์ฝ๋ ๊ตฌ์ฑ์ ํฅ์์ํค๋ ๊ท์คํ ๊ธฐ์ ์ ๋๋ค. ์ปค๋งจ๋ ํจํด๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ๊ฒฐํฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ํนํ ๊ธ๋ก๋ฒ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋งฅ๋ฝ์์ ๋ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ณ , ํ ์คํธํ๊ธฐ ์ฌ์ฐ๋ฉฐ, ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ด ํจํด์ ๋ถ์ฐ๋ ํ ๊ฐ์ ๋ ๋์ ํ์ ์ ๊ฐ๋ฅํ๊ฒ ํ๊ณ , ํ์งํ ๋ฐ ๊ตญ์ ํ๋ฅผ ์ฉ์ดํ๊ฒ ํ๋ฉฐ, ๋ฒ๊ทธ ๋ฐ์ ์ํ์ ์ค์ ๋๋ค. ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ๋๋ฉด ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ์ ๋ฐ์ ์ธ ํ์ง๊ณผ ํจ์จ์ฑ์ ํฌ๊ฒ ํฅ์์์ผ ๊ถ๊ทน์ ์ผ๋ก ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๋ ๋์ ์ํํธ์จ์ด๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๋ ผ์๋ ๋ชจ๋ฒ ์ฌ๋ก์ ๋์์ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ, ๋ค์ํ๊ณ ๊น๋ค๋ก์ด ๊ธ๋ก๋ฒ ์์ฅ์ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ปค๋งจ๋ ํจํด์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ์ ์์ต๋๋ค. ๊ธฐ๋ฅ์ ์ผ ๋ฟ๋ง ์๋๋ผ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ํจ๊ป ์์ ํ๊ธฐ ์ฆ๊ฑฐ์ด ์ํํธ์จ์ด๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ชจ๋์ฑ๊ณผ ์ก์ ์บก์ํ๋ฅผ ์ฑํํ์ธ์.