title: 
style: nestedList # TOC style (nestedList|nestedOrderedList|inlineFirstLevel)
minLevel: 0 # Include headings from the specified level
maxLevel: 0 # Include headings up to the specified level
includeLinks: true # Make headings clickable
hideWhenEmpty: false # Hide TOC if no headings are found
debugInConsole: false # Print debug info in Obsidian console

평가: λ―Έλž˜μ— 도움이 될 점수 - 9/10 (λ‹€μ–‘ν•œ μ–Έμ–΄λ‘œ μ‹€μ œ κ΅¬ν˜„ μ˜ˆμ‹œλ₯Ό ν¬ν•¨ν•˜κ³  λ””μžμΈ νŒ¨ν„΄μ˜ 핡심 κ°œλ…μ„ μ„€λͺ…ν•˜λ―€λ‘œ 높은 점수 λΆ€μ—¬)

μ „λž΅ νŒ¨ν„΄ - λŸ°νƒ€μž„ μ•Œκ³ λ¦¬μ¦˜ ꡐ체

ν‚€μ›Œλ“œ

  • 행동 λ””μžμΈ νŒ¨ν„΄
  • λŸ°νƒ€μž„ μ•Œκ³ λ¦¬μ¦˜ ꡐ체
  • μΈν„°νŽ˜μ΄μŠ€ 좔상화

λ‚΄μš©

μ „λž΅ νŒ¨ν„΄ κ°œμš”

μ „λž΅ νŒ¨ν„΄(Strategy Pattern)은 μ•Œκ³ λ¦¬μ¦˜μ„ μΊ‘μŠν™”ν•˜κ³  이λ₯Ό ꡐ체 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“œλŠ” 행동 λ””μžμΈ νŒ¨ν„΄μ΄λ‹€. 이 νŒ¨ν„΄μ€ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ λ„ λŸ°νƒ€μž„μ— μ•Œκ³ λ¦¬μ¦˜μ„ ꡐ체할 수 있게 ν•΄μ€€λ‹€. μ „λž΅ νŒ¨ν„΄μ€ μ†Œν”„νŠΈμ›¨μ–΄μ˜ ν™•μž₯μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ 크게 ν–₯μƒμ‹œν‚¨λ‹€. 이 νŒ¨ν„΄μ€ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 원칙인 β€˜κ°œλ°©-폐쇄 원칙(OCP)β€˜κ³Ό β€˜λ‹¨μΌ μ±…μž„ 원칙(SRP)β€˜μ„ μ μš©ν•œ λŒ€ν‘œμ μΈ μ˜ˆμ‹œμ΄λ‹€. 미래의 λ‚΄κ°€ 이 νŒ¨ν„΄μ„ κΈ°μ–΅ν•΄μ•Ό ν•˜λŠ” μ΄μœ λŠ” λ‹€μ–‘ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄ ν•„μš”ν•œ μƒν™©μ—μ„œ μ½”λ“œ 쀑볡을 쀄이고 μœ μ—°μ„±μ„ λ†’μ΄λŠ” 데 맀우 효과적이기 λ•Œλ¬Έμ΄λ‹€.

μ „λž΅ νŒ¨ν„΄μ˜ ꡬ쑰

μ „λž΅ νŒ¨ν„΄μ€ 크게 μ„Έ κ°€μ§€ μ£Όμš” ꡬ성 μš”μ†Œλ‘œ 이루어진닀. 첫째, β€˜μ „λž΅(Strategy)’ μΈν„°νŽ˜μ΄μŠ€λŠ” μ§€μ›λ˜λŠ” λͺ¨λ“  μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•œ 곡톡 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•œλ‹€. λ‘˜μ§Έ, β€˜κ΅¬μ²΄μ  μ „λž΅(Concrete Strategy)’ ν΄λž˜μŠ€λ“€μ€ μ „λž΅ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ©° 각각 λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ„ μ œκ³΅ν•œλ‹€. μ…‹μ§Έ, β€˜μ»¨ν…μŠ€νŠΈ(Context)’ ν΄λž˜μŠ€λŠ” μ „λž΅ 객체λ₯Ό μ°Έμ‘°ν•˜κ³  이λ₯Ό 톡해 μ•Œκ³ λ¦¬μ¦˜μ„ μ‹€ν–‰ν•œλ‹€. μ»¨ν…μŠ€νŠΈλŠ” μ „λž΅ 객체λ₯Ό ꡐ체할 수 μžˆλŠ” λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜μ—¬ λŸ°νƒ€μž„μ— μ•Œκ³ λ¦¬μ¦˜μ„ λ³€κ²½ν•  수 있게 ν•œλ‹€. μ΄λŸ¬ν•œ ꡬ쑰λ₯Ό 톡해 μƒˆλ‘œμš΄ μ•Œκ³ λ¦¬μ¦˜μ„ μΆ”κ°€ν•  λ•Œ κΈ°μ‘΄ μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ λ„ ν™•μž₯이 κ°€λŠ₯ν•˜λ‹€.

파이썬으둜 κ΅¬ν˜„ν•œ μ „λž΅ νŒ¨ν„΄

from abc import ABC, abstractmethod
from typing import List
 
# μ „λž΅ μΈν„°νŽ˜μ΄μŠ€
class SortStrategy(ABC):
    @abstractmethod
    def sort(self, data: List) -> List:
        pass
 
# ꡬ체적 μ „λž΅ 1: 버블 μ •λ ¬
class BubbleSortStrategy(SortStrategy):
    def sort(self, data: List) -> List:
        print("버블 μ •λ ¬ μˆ˜ν–‰ 쀑...")
        result = data.copy()
        n = len(result)
        for i in range(n):
            for j in range(0, n - i - 1):
                if result[j] > result[j + 1]:
                    result[j], result[j + 1] = result[j + 1], result[j]
        return result
 
# ꡬ체적 μ „λž΅ 2: 퀡 μ •λ ¬
class QuickSortStrategy(SortStrategy):
    def sort(self, data: List) -> List:
        print("퀡 μ •λ ¬ μˆ˜ν–‰ 쀑...")
        result = data.copy()
        if len(result) <= 1:
            return result
        
        pivot = result[len(result) // 2]
        left = [x for x in result if x < pivot]
        middle = [x for x in result if x == pivot]
        right = [x for x in result if x > pivot]
        
        return self.sort(left) + middle + self.sort(right)
 
# ꡬ체적 μ „λž΅ 3: 파이썬 λ‚΄μž₯ μ •λ ¬
class PythonSortStrategy(SortStrategy):
    def sort(self, data: List) -> List:
        print("파이썬 λ‚΄μž₯ μ •λ ¬ μˆ˜ν–‰ 쀑...")
        return sorted(data)
 
# μ»¨ν…μŠ€νŠΈ
class Sorter:
    def __init__(self, strategy: SortStrategy = None):
        self._strategy = strategy or PythonSortStrategy()
    
    def set_strategy(self, strategy: SortStrategy):
        self._strategy = strategy
    
    def sort(self, data: List) -> List:
        return self._strategy.sort(data)
 
# ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ
if __name__ == "__main__":
    # 데이터 μ€€λΉ„
    data = [7, 1, 4, 6, 3, 8, 2, 5]
    
    # μ»¨ν…μŠ€νŠΈ 생성
    sorter = Sorter()
    
    # κΈ°λ³Έ μ „λž΅ (파이썬 λ‚΄μž₯ μ •λ ¬) μ‚¬μš©
    print(f"κΈ°λ³Έ μ •λ ¬ κ²°κ³Ό: {sorter.sort(data)}")
    
    # 버블 μ •λ ¬ μ „λž΅μœΌλ‘œ λ³€κ²½
    sorter.set_strategy(BubbleSortStrategy())
    print(f"버블 μ •λ ¬ κ²°κ³Ό: {sorter.sort(data)}")
    
    # 퀡 μ •λ ¬ μ „λž΅μœΌλ‘œ λ³€κ²½
    sorter.set_strategy(QuickSortStrategy())
    print(f"퀡 μ •λ ¬ κ²°κ³Ό: {sorter.sort(data)}")

파이썬 μ˜ˆμ‹œμ—μ„œλŠ” μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ„ μ „λž΅ νŒ¨ν„΄μœΌλ‘œ κ΅¬ν˜„ν–ˆλ‹€. SortStrategy 좔상 ν΄λž˜μŠ€λŠ” λͺ¨λ“  μ •λ ¬ μ „λž΅μ΄ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•œλ‹€. μ„Έ κ°€μ§€ ꡬ체적 μ „λž΅μΈ 버블 μ •λ ¬, 퀡 μ •λ ¬, 파이썬 λ‚΄μž₯ 정렬은 각각 λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ„ μ œκ³΅ν•œλ‹€. Sorter ν΄λž˜μŠ€λŠ” μ»¨ν…μŠ€νŠΈ 역할을 ν•˜λ©° λŸ°νƒ€μž„μ— μ •λ ¬ μ „λž΅μ„ λ³€κ²½ν•  수 μžˆλ‹€. νŒŒμ΄μ¬μ—μ„œλŠ” abc λͺ¨λ“ˆμ„ μ‚¬μš©ν•΄ 좔상 클래슀λ₯Ό λ§Œλ“€κ³  νƒ€μž… νžŒνŒ…μ„ 톡해 μ½”λ“œμ˜ 가독성을 λ†’μ˜€λ‹€. 이 κ΅¬ν˜„μ€ μƒˆλ‘œμš΄ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ„ μΆ”κ°€ν•  λ•Œ κΈ°μ‘΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ ν™•μž₯ν•  수 μžˆλŠ” μž₯점이 μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ κ΅¬ν˜„ν•œ μ „λž΅ νŒ¨ν„΄

// μ „λž΅ μΈν„°νŽ˜μ΄μŠ€ (μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λͺ…μ‹œμ  μΈν„°νŽ˜μ΄μŠ€κ°€ μ—†μœΌλ―€λ‘œ μ•”λ¬΅μ μœΌλ‘œ κ΅¬ν˜„)
 
// ꡬ체적 μ „λž΅ 1: μ‹ μš©μΉ΄λ“œ 결제
class CreditCardPaymentStrategy {
  constructor(cardNumber, name, cvv, expiryDate) {
    this.cardNumber = cardNumber;
    this.name = name;
    this.cvv = cvv;
    this.expiryDate = expiryDate;
  }
 
  pay(amount) {
    console.log(`${amount}원을 μ‹ μš©μΉ΄λ“œλ‘œ κ²°μ œν•©λ‹ˆλ‹€: ${this.cardNumber.slice(-4)}`);
    return true;
  }
}
 
// ꡬ체적 μ „λž΅ 2: νŽ˜μ΄νŒ” 결제
class PayPalPaymentStrategy {
  constructor(email, password) {
    this.email = email;
    this.password = password;
  }
 
  pay(amount) {
    console.log(`${amount}원을 PayPal둜 κ²°μ œν•©λ‹ˆλ‹€: ${this.email}`);
    return true;
  }
}
 
// ꡬ체적 μ „λž΅ 3: μ•”ν˜Έν™”ν 결제
class CryptoPaymentStrategy {
  constructor(walletAddress) {
    this.walletAddress = walletAddress;
  }
 
  pay(amount) {
    console.log(`${amount}원을 μ•”ν˜Έν™”νλ‘œ κ²°μ œν•©λ‹ˆλ‹€: ${this.walletAddress.slice(0, 10)}...`);
    return true;
  }
}
 
// μ»¨ν…μŠ€νŠΈ
class PaymentProcessor {
  constructor(paymentStrategy = null) {
    this.paymentStrategy = paymentStrategy;
  }
 
  setPaymentStrategy(paymentStrategy) {
    this.paymentStrategy = paymentStrategy;
  }
 
  processPayment(amount) {
    if (!this.paymentStrategy) {
      throw new Error('결제 μ „λž΅μ΄ μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.');
    }
    return this.paymentStrategy.pay(amount);
  }
}
 
// ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ
function runExample() {
  // μƒν’ˆ 가격
  const price = 15000;
  
  // 결제 ν”„λ‘œμ„Έμ„œ 생성
  const paymentProcessor = new PaymentProcessor();
  
  // μ‹ μš©μΉ΄λ“œ 결제 μ „λž΅ μ‚¬μš©
  const creditCardStrategy = new CreditCardPaymentStrategy(
    '1234-5678-9012-3456',
    '홍길동',
    '123',
    '12/25'
  );
  paymentProcessor.setPaymentStrategy(creditCardStrategy);
  paymentProcessor.processPayment(price);
  
  // νŽ˜μ΄νŒ” 결제 μ „λž΅μœΌλ‘œ λ³€κ²½
  const paypalStrategy = new PayPalPaymentStrategy(
    'user@example.com',
    'password123'
  );
  paymentProcessor.setPaymentStrategy(paypalStrategy);
  paymentProcessor.processPayment(price);
  
  // μ•”ν˜Έν™”ν 결제 μ „λž΅μœΌλ‘œ λ³€κ²½
  const cryptoStrategy = new CryptoPaymentStrategy(
    '0x71C7656EC7ab88b098defB751B7401B5f6d8976F'
  );
  paymentProcessor.setPaymentStrategy(cryptoStrategy);
  paymentProcessor.processPayment(price);
}
 
// 예제 μ‹€ν–‰
runExample();

μžλ°”μŠ€ν¬λ¦½νŠΈ μ˜ˆμ‹œμ—μ„œλŠ” 온라인 결제 μ‹œμŠ€ν…œμ— μ „λž΅ νŒ¨ν„΄μ„ μ μš©ν–ˆλ‹€. 이 κ΅¬ν˜„μ—μ„œλŠ” μ‹ μš©μΉ΄λ“œ, νŽ˜μ΄νŒ”, μ•”ν˜Έν™”νμ™€ 같은 λ‹€μ–‘ν•œ 결제 방식을 각각의 μ „λž΅μœΌλ‘œ μΊ‘μŠν™”ν–ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λͺ…μ‹œμ μΈ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 암묡적인 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 각 μ „λž΅ ν΄λž˜μŠ€κ°€ pay λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€. PaymentProcessor ν΄λž˜μŠ€λŠ” μ»¨ν…μŠ€νŠΈ 역할을 ν•˜λ©° λ‹€μ–‘ν•œ 결제 μ „λž΅μ„ ꡐ체할 수 있게 ν•œλ‹€. μ΄λŸ¬ν•œ κ΅¬ν˜„μ€ μƒˆλ‘œμš΄ 결제 방식이 좔가될 λ•Œλ§ˆλ‹€ κΈ°μ‘΄ μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  ν™•μž₯ν•  수 μžˆμ–΄ μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•˜λ‹€.

PHP둜 κ΅¬ν˜„ν•œ μ „λž΅ νŒ¨ν„΄

<?php
 
// μ „λž΅ μΈν„°νŽ˜μ΄μŠ€
interface LoggerStrategy {
    public function log(string $message): void;
}
 
// ꡬ체적 μ „λž΅ 1: 파일 둜거
class FileLogger implements LoggerStrategy {
    private $filePath;
    
    public function __construct(string $filePath) {
        $this->filePath = $filePath;
    }
    
    public function log(string $message): void {
        $timestamp = date('Y-m-d H:i:s');
        $logMessage = "[$timestamp] $message" . PHP_EOL;
        
        echo "νŒŒμΌμ— 둜그 기둝: $logMessage";
        // μ‹€μ œ κ΅¬ν˜„μ—μ„œλŠ” μ•„λž˜μ™€ 같이 νŒŒμΌμ— 기둝
        // file_put_contents($this->filePath, $logMessage, FILE_APPEND);
    }
}
 
// ꡬ체적 μ „λž΅ 2: λ°μ΄ν„°λ² μ΄μŠ€ 둜거
class DatabaseLogger implements LoggerStrategy {
    private $connection;
    
    public function __construct(string $connectionString) {
        // μ‹€μ œ κ΅¬ν˜„μ—μ„œλŠ” DB μ—°κ²° μ„€μ •
        $this->connection = $connectionString;
    }
    
    public function log(string $message): void {
        $timestamp = date('Y-m-d H:i:s');
        echo "λ°μ΄ν„°λ² μ΄μŠ€μ— 둜그 기둝: [$timestamp] $message" . PHP_EOL;
        
        // μ‹€μ œ κ΅¬ν˜„μ—μ„œλŠ” μ•„λž˜μ™€ 같이 DB에 기둝
        // $query = "INSERT INTO logs (timestamp, message) VALUES (?, ?)";
        // execute query...
    }
}
 
// ꡬ체적 μ „λž΅ 3: 이메일 둜거
class EmailLogger implements LoggerStrategy {
    private $recipientEmail;
    
    public function __construct(string $recipientEmail) {
        $this->recipientEmail = $recipientEmail;
    }
    
    public function log(string $message): void {
        $timestamp = date('Y-m-d H:i:s');
        echo "μ΄λ©”μΌλ‘œ 둜그 전솑: [$timestamp] $message (To: {$this->recipientEmail})" . PHP_EOL;
        
        // μ‹€μ œ κ΅¬ν˜„μ—μ„œλŠ” μ•„λž˜μ™€ 같이 이메일 전솑
        // mail($this->recipientEmail, 'Log Notification', $message);
    }
}
 
// μ»¨ν…μŠ€νŠΈ
class LogManager {
    private $logger;
    
    public function __construct(LoggerStrategy $logger = null) {
        $this->logger = $logger;
    }
    
    public function setLogger(LoggerStrategy $logger): void {
        $this->logger = $logger;
    }
    
    public function log(string $message): void {
        if ($this->logger === null) {
            throw new Exception('λ‘œκ±°κ°€ μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.');
        }
        
        $this->logger->log($message);
    }
}
 
// ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ
function runExample() {
    // 둜그 λ§€λ‹ˆμ € 생성
    $logManager = new LogManager();
    
    // 파일 둜거 μ „λž΅ μ‚¬μš©
    $fileLogger = new FileLogger('/var/log/app.log');
    $logManager->setLogger($fileLogger);
    $logManager->log('μ‚¬μš©μžκ°€ λ‘œκ·ΈμΈν–ˆμŠ΅λ‹ˆλ‹€.');
    
    // λ°μ΄ν„°λ² μ΄μŠ€ 둜거 μ „λž΅μœΌλ‘œ λ³€κ²½
    $dbLogger = new DatabaseLogger('mysql:host=localhost;dbname=logs');
    $logManager->setLogger($dbLogger);
    $logManager->log('μ€‘μš” 데이터가 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.');
    
    // 이메일 둜거 μ „λž΅μœΌλ‘œ λ³€κ²½ (μ‹¬κ°ν•œ 였λ₯˜ λ°œμƒ μ‹œ)
    $emailLogger = new EmailLogger('admin@example.com');
    $logManager->setLogger($emailLogger);
    $logManager->log('μ‹¬κ°ν•œ μ‹œμŠ€ν…œ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€!');
}
 
// 예제 μ‹€ν–‰
runExample();

PHP μ˜ˆμ‹œμ—μ„œλŠ” λ‘œκΉ… μ‹œμŠ€ν…œμ— μ „λž΅ νŒ¨ν„΄μ„ μ μš©ν–ˆλ‹€. 이 κ΅¬ν˜„μ—μ„œλŠ” 파일, λ°μ΄ν„°λ² μ΄μŠ€, 이메일과 같은 λ‹€μ–‘ν•œ λ‘œκΉ… 방식을 각각의 μ „λž΅μœΌλ‘œ μΊ‘μŠν™”ν–ˆλ‹€. LoggerStrategy μΈν„°νŽ˜μ΄μŠ€λŠ” λͺ¨λ“  λ‘œκ±°κ°€ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” log λ©”μ„œλ“œλ₯Ό μ •μ˜ν•œλ‹€. LogManager ν΄λž˜μŠ€λŠ” μ»¨ν…μŠ€νŠΈ 역할을 ν•˜λ©° λ‹€μ–‘ν•œ λ‘œκΉ… μ „λž΅μ„ ꡐ체할 수 있게 ν•œλ‹€. PHPμ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•˜κ³  ν΄λž˜μŠ€κ°€ 이λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ „λž΅ νŒ¨ν„΄μ„ κ΅¬ν˜„ν–ˆλ‹€. 이 νŒ¨ν„΄μ€ λ‘œκΉ… μš”κ΅¬μ‚¬ν•­μ΄ λ³€κ²½λ˜κ±°λ‚˜ μƒˆλ‘œμš΄ λ‘œκΉ… 방식이 ν•„μš”ν•  λ•Œ κΈ°μ‘΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  ν™•μž₯ν•  수 있게 ν•œλ‹€.

μ „λž΅ νŒ¨ν„΄μ˜ μ‹€μ œ μ‚¬μš© 사둀

μ „λž΅ νŒ¨ν„΄μ€ μ‹€μ œ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—μ„œ κ΄‘λ²”μœ„ν•˜κ²Œ μ‚¬μš©λœλ‹€. λŒ€ν‘œμ μΈ μ‚¬λ‘€λ‘œλŠ” 결제 κ²Œμ΄νŠΈμ›¨μ΄, 데이터 μ••μΆ• μ•Œκ³ λ¦¬μ¦˜, 인증 λ©”μ»€λ‹ˆμ¦˜, λΌμš°νŒ… μ•Œκ³ λ¦¬μ¦˜, ν…μŠ€νŠΈ ν¬λ§·νŒ… 등이 μžˆλ‹€. ν”„λ ˆμž„μ›Œν¬μ™€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œλ„ 이 νŒ¨ν„΄μ„ 자주 λ³Ό 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, Spring ν”„λ ˆμž„μ›Œν¬μ˜ μ˜μ‘΄μ„± μ£Όμž…, Java의 Comparator μΈν„°νŽ˜μ΄μŠ€, Node.js의 미듀웨어 등이 μ „λž΅ νŒ¨ν„΄μ˜ 원리λ₯Ό ν™œμš©ν•œλ‹€. 이 νŒ¨ν„΄μ€ 특히 μ•Œκ³ λ¦¬μ¦˜μ˜ λ™μž‘μ΄ λŸ°νƒ€μž„μ— κ²°μ •λ˜μ–΄μ•Ό ν•˜λŠ” κ²½μš°λ‚˜ μ—¬λŸ¬ μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜λ₯Ό 선택해야 ν•˜λŠ” κ²½μš°μ— μœ μš©ν•˜λ‹€.

μ „λž΅ νŒ¨ν„΄μ˜ μž₯단점

μ „λž΅ νŒ¨ν„΄μ˜ μ£Όμš” μž₯점은 μ—¬λŸ¬ μ•Œκ³ λ¦¬μ¦˜μ„ μΊ‘μŠν™”ν•˜κ³  λŸ°νƒ€μž„μ— ꡐ체할 수 μžˆλ‹€λŠ” 점이닀. 이λ₯Ό 톡해 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό ν™•μž₯성이 ν–₯μƒλ˜κ³ , 쑰건문(if-else, switch)의 λ³΅μž‘μ„±μ„ 쀄일 수 μžˆλ‹€. λ˜ν•œ μƒˆλ‘œμš΄ μ „λž΅μ„ μΆ”κ°€ν•  λ•Œ κΈ°μ‘΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ 개방-폐쇄 원칙을 μ€€μˆ˜ν•œλ‹€. λ‹¨μ μœΌλ‘œλŠ” μ „λž΅μ΄ λ§Žμ•„μ§ˆμˆ˜λ‘ 클래슀의 μˆ˜κ°€ μ¦κ°€ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈκ°€ μ „λž΅μ„ μ„ νƒν•˜κΈ° μœ„ν•΄ μ „λž΅ κ°„μ˜ 차이점을 μ•Œμ•„μ•Ό ν•œλ‹€λŠ” 점이닀. λ˜ν•œ κ°„λ‹¨ν•œ μ•Œκ³ λ¦¬μ¦˜μ—μ„œλŠ” 였히렀 λ³΅μž‘μ„±μ΄ 증가할 수 μžˆμœΌλ―€λ‘œ μ μ ˆν•œ μƒν™©μ—μ„œ μ‚¬μš©ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

κ²°λ‘  및 μ•‘μ…˜ μ•„μ΄ν…œ

μ „λž΅ νŒ¨ν„΄μ€ μ•Œκ³ λ¦¬μ¦˜μ„ μΊ‘μŠν™”ν•˜κ³  ꡐ체 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“œλŠ” κ°•λ ₯ν•œ λ””μžμΈ νŒ¨ν„΄μ΄λ‹€. 이 νŒ¨ν„΄μ€ μ½”λ“œμ˜ μœ μ—°μ„±, ν™•μž₯μ„±, μž¬μ‚¬μš©μ„±μ„ ν–₯μƒμ‹œν‚€λ©° 객체지ν–₯ 섀계 원칙을 효과적으둜 μ μš©ν•  수 있게 ν•œλ‹€. μ „λž΅ νŒ¨ν„΄μ„ ν™œμš©ν•˜λ©΄ 쑰건문으둜 μΈν•œ μ½”λ“œ λ³΅μž‘μ„±μ„ 쀄이고 μƒˆλ‘œμš΄ μ•Œκ³ λ¦¬μ¦˜μ„ μ‰½κ²Œ μΆ”κ°€ν•  수 μžˆλ‹€. λ˜ν•œ ν…ŒμŠ€νŠΈ μš©μ΄μ„±λ„ ν–₯μƒλœλ‹€.

μ•‘μ…˜ μ•„μ΄ν…œ:

  1. κΈ°μ‘΄ ν”„λ‘œμ νŠΈμ—μ„œ 쑰건문이 많고 μ•Œκ³ λ¦¬μ¦˜μ΄ 자주 λ³€κ²½λ˜λŠ” 뢀뢄을 μ‹λ³„ν•˜μ—¬ μ „λž΅ νŒ¨ν„΄ μ μš©μ„ κ²€ν† ν•œλ‹€.
  2. μ„Έ κ°€μ§€ μ–Έμ–΄ μ˜ˆμ‹œλ₯Ό μ°Έκ³ ν•˜μ—¬ μžμ‹ μ˜ μ£Όλ ₯ μ–Έμ–΄λ‘œ μ „λž΅ νŒ¨ν„΄ μƒ˜ν”Œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  μ—°μŠ΅ν•œλ‹€.
  3. λ‹€μŒ ν”„λ‘œμ νŠΈμ—μ„œ 결제, 인증, λ‘œκΉ… λ“±κ³Ό 같이 λ‹€μ–‘ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄ ν•„μš”ν•œ κΈ°λŠ₯에 μ „λž΅ νŒ¨ν„΄μ„ μ μš©ν•œλ‹€.
  4. μ „λž΅ νŒ¨ν„΄μ΄ μ˜€λ²„μ—”μ§€λ‹ˆμ–΄λ§μ΄ λ˜μ§€ μ•Šλ„λ‘ λ³΅μž‘μ„±κ³Ό 이점 μ‚¬μ΄μ˜ κ· ν˜•μ„ κ³ λ €ν•œλ‹€.
  5. νŒ€μ›λ“€κ³Ό λ””μžμΈ νŒ¨ν„΄ μŠ€ν„°λ””λ₯Ό μ§„ν–‰ν•˜μ—¬ μ „λž΅ νŒ¨ν„΄κ³Ό λ‹€λ₯Έ 행동 νŒ¨ν„΄μ˜ 차이점을 ν•™μŠ΅ν•œλ‹€.