전략 패턴 가이드: 조건문을 줄이고 행동을 바꾸는 방법
Dev

전략 패턴 가이드: 조건문을 줄이고 행동을 바꾸는 방법


코드를 작성하다 보면 같은 종류의 작업인데도 상황에 따라 처리 방식이 달라지는 경우가 많습니다. 이때 if/else가 계속 커지기 시작하면 구조가 빠르게 지저분해질 수 있습니다. 전략 패턴은 이런 문제를 다루는 대표적인 객체 지향 패턴 중 하나입니다.

이 글에서는 아래 내용을 정리합니다.

  • 전략 패턴이 무엇인지
  • 왜 조건문을 줄이는 데 도움이 되는지
  • 어떤 상황에서 잘 맞는지
  • 객체 지향 원칙과 어떻게 연결되는지

핵심은 전략 패턴은 “무엇을 할지”와 “어떻게 할지”를 분리해서, 행동을 객체로 바꿔 끼울 수 있게 만드는 구조라는 점입니다.

전략 패턴이란 무엇인가

전략 패턴은 같은 종류의 행동을 여러 방식으로 구현하고, 그중 하나를 선택해서 쓰는 구조입니다.

예를 들어:

  • 카드 결제 전략
  • 계좌 이체 전략
  • 포인트 결제 전략

처럼 같은 결제라는 역할을 여러 구현으로 나눌 수 있습니다.

왜 조건문을 줄이는 데 도움이 될까

새 전략이 늘어날 때마다 하나의 큰 서비스 안에 if/else가 계속 늘어나면:

  • 읽기 어려워지고
  • 테스트가 어려워지며
  • 새로운 유형 추가 시 기존 코드 수정이 커집니다

전략 패턴은 각 행동을 별도 객체로 분리해서 이런 분기 확장을 줄여줍니다.

어떤 상황에서 잘 맞을까

  • 처리 방식 종류가 계속 늘어나는 경우
  • 같은 역할을 여러 구현이 수행하는 경우
  • 런타임에 행동을 바꿔야 하는 경우

즉, “행동 교체 가능성”이 높을수록 잘 맞습니다.

객체 지향 원칙과는 어떻게 연결될까

전략 패턴은 자주 아래 원칙들과 연결됩니다.

  • OCP: 새 전략을 추가해도 기존 코드를 덜 건드릴 수 있음
  • DIP: 구체 전략보다 추상 역할에 의존하기 쉬움
  • 다형성: 같은 메시지 뒤에 다른 구현을 숨길 수 있음

즉, 전략 패턴은 객체 지향 원칙이 실제 코드 구조로 드러나는 좋은 예 중 하나입니다.

자주 하는 오해

1. if/else가 있으면 무조건 전략 패턴으로 바꿔야 한다

작고 단순한 경우에는 오히려 과할 수 있습니다.

2. 전략 패턴은 클래스 수만 늘린다

겉으로는 늘어날 수 있지만, 행동이 자주 바뀌는 구조에서는 오히려 변경 비용을 줄여줍니다.

3. 상속 패턴이다

상속이 아니라 조합과 인터페이스 기반으로 구현되는 경우가 많습니다.

간단한 예시

interface PaymentStrategy {
  pay(amount: number): void;
}

class CardPayment implements PaymentStrategy {
  pay(amount: number) {
    console.log(`Pay ${amount} with card`);
  }
}

class PointsPayment implements PaymentStrategy {
  pay(amount: number) {
    console.log(`Pay ${amount} with points`);
  }
}

class CheckoutService {
  constructor(private strategy: PaymentStrategy) {}

  checkout(amount: number) {
    this.strategy.pay(amount);
  }
}

const service = new CheckoutService(new CardPayment());
service.checkout(100);

핵심은 CheckoutService가 구체 결제 방식 대신 PaymentStrategy에만 의존한다는 점입니다.

FAQ

Q. 입문자는 어디서 전략 패턴을 써보면 좋을까

결제, 할인 정책, 정렬 방식, 알림 방식처럼 종류가 자주 늘어나는 기능이 좋습니다.

Q. 전략 패턴과 다형성은 같은가

같지는 않지만, 전략 패턴은 다형성을 활용하는 대표적인 구조입니다.

Q. 전략 선택은 누가 하나

보통 컨텍스트나 상위 조립 코드가 전략 객체를 선택해서 주입합니다.

먼저 읽어볼 가이드

검색 유입이 많은 핵심 글부터 이어서 보세요.