Rails Insights

루비에서 전략 디자인 패턴 사용하기

소프트웨어 개발에서 디자인 패턴은 문제를 해결하기 위한 일반적인 접근 방식을 제공합니다. 그 중에서도 전략 디자인 패턴은 알고리즘을 캡슐화하고, 클라이언트가 런타임에 알고리즘을 선택할 수 있도록 해줍니다. 이 글에서는 루비에서 전략 디자인 패턴을 어떻게 구현하고 활용할 수 있는지에 대해 알아보겠습니다.

전략 디자인 패턴이란?

전략 디자인 패턴은 객체 지향 프로그래밍에서 알고리즘을 정의하고, 이를 캡슐화하여 서로 교환 가능하게 만드는 패턴입니다. 이 패턴을 사용하면 클라이언트 코드가 알고리즘의 구체적인 구현에 의존하지 않게 되어, 코드의 유연성과 재사용성을 높일 수 있습니다.

전략 패턴의 구성 요소

전략 패턴은 다음과 같은 세 가지 주요 구성 요소로 이루어져 있습니다:

  • 컨텍스트(Context): 전략을 사용하는 클라이언트 코드입니다. 이 클래스는 전략 인터페이스를 통해 알고리즘을 호출합니다.
  • 전략 인터페이스(Strategy Interface): 다양한 알고리즘을 정의하는 인터페이스입니다. 이 인터페이스를 구현하는 클래스는 각각의 알고리즘을 제공합니다.
  • 구체적인 전략(Concrete Strategy): 전략 인터페이스를 구현하는 클래스들로, 각기 다른 알고리즘을 제공합니다.

루비에서 전략 디자인 패턴 구현하기

이제 루비에서 전략 디자인 패턴을 어떻게 구현할 수 있는지 살펴보겠습니다. 예를 들어, 다양한 할인 전략을 적용하는 쇼핑 카트를 만들어 보겠습니다.

1단계: 전략 인터페이스 정의하기

먼저, 할인 전략을 정의하는 인터페이스를 만들어 보겠습니다.

class DiscountStrategy
  def apply_discount(price)
    raise NotImplementedError, 'You must implement the apply_discount method'
  end
end

2단계: 구체적인 전략 구현하기

이제 다양한 할인 전략을 구현해 보겠습니다. 예를 들어, 정액 할인과 비율 할인을 구현할 수 있습니다.

class FlatDiscount < DiscountStrategy
  def initialize(discount_amount)
    @discount_amount = discount_amount
  end

  def apply_discount(price)
    price - @discount_amount
  end
end

class PercentageDiscount < DiscountStrategy
  def initialize(discount_percentage)
    @discount_percentage = discount_percentage
  end

  def apply_discount(price)
    price - (price * @discount_percentage / 100.0)
  end
end

3단계: 컨텍스트 클래스 만들기

이제 할인 전략을 사용하는 쇼핑 카트 클래스를 만들어 보겠습니다.

class ShoppingCart
  def initialize
    @items = []
    @discount_strategy = nil
  end

  def add_item(price)
    @items << price
  end

  def set_discount_strategy(strategy)
    @discount_strategy = strategy
  end

  def total_price
    total = @items.reduce(0, :+)
    total = @discount_strategy.apply_discount(total) if @discount_strategy
    total
  end
end

전략 패턴 사용 예제

이제 위에서 정의한 클래스를 사용하여 할인 전략을 적용해 보겠습니다.

cart = ShoppingCart.new
cart.add_item(100)
cart.add_item(200)

puts "총 가격: #{cart.total_price}" # 총 가격: 300

# 정액 할인 적용
flat_discount = FlatDiscount.new(50)
cart.set_discount_strategy(flat_discount)
puts "할인 적용 후 가격: #{cart.total_price}" # 할인 적용 후 가격: 250

# 비율 할인 적용
percentage_discount = PercentageDiscount.new(10)
cart.set_discount_strategy(percentage_discount)
puts "할인 적용 후 가격: #{cart.total_price}" # 할인 적용 후 가격: 270

전략 디자인 패턴의 장점

전략 디자인 패턴을 사용하면 다음과 같은 장점을 누릴 수 있습니다:

  • 유연성: 알고리즘을 런타임에 변경할 수 있어, 다양한 상황에 맞게 쉽게 조정할 수 있습니다.
  • 재사용성: 알고리즘을 독립적으로 구현하므로, 다른 컨텍스트에서도 재사용할 수 있습니다.
  • 코드의 가독성 향상: 각 알고리즘이 별도의 클래스로 분리되어 있어, 코드가 더 깔끔하고 이해하기 쉬워집니다.

전략 디자인 패턴의 단점

물론 전략 디자인 패턴에도 단점이 존재합니다:

  • 클래스 수 증가: 각 알고리즘마다 별도의 클래스를 만들어야 하므로, 클래스 수가 증가할 수 있습니다.
  • 복잡성 증가: 패턴을 적용하는 과정에서 코드의 복잡성이 증가할 수 있습니다.

결론

전략 디자인 패턴은 알고리즘을 캡슐화하고, 클라이언트가 런타임에 알고리즘을 선택할 수 있도록 해주는 유용한 패턴입니다. 루비에서 이 패턴을 구현하는 방법을 살펴보았으며, 다양한 할인 전략을 적용하는 쇼핑 카트 예제를 통해 그 활용성을 보여주었습니다. 이 패턴을 통해 코드의 유연성과 재사용성을 높일 수 있으니, 여러분의 프로젝트에서도 적극적으로 활용해 보시기 바랍니다!

Published: August 12, 2024

© 2024 RailsInsights. All rights reserved.