본문 바로가기
language/java

Java 전략 패턴(Strategy Pattern) 완벽 이해하기

by 죄니안죄니 2026. 5. 22.
반응형

Java 전략 패턴(Strategy Pattern) 완벽 이해하기

Java 실무에서 객체지향 설계를 제대로 이해하려면 반드시 알아야 하는 패턴이 바로:

전략 패턴(Strategy Pattern)

입니다.

특히:

  • Spring
  • 결제 시스템
  • 인증 시스템
  • 할인 정책
  • 정렬 로직
  • 다양한 알고리즘 교체

등에서 매우 많이 사용됩니다.

초보 시절에는 보통:

“인터페이스 여러 개 구현하는 패턴”
 

정도로만 이해하기 쉽습니다.

하지만 실제 전략 패턴은:

  • if/switch 제거
  • 다형성 활용
  • OCP(Open Closed Principle)
  • 유연한 객체 설계

를 위한 핵심 설계 패턴입니다.

이번 글에서는:

  • 전략 패턴이 왜 필요한가
  • 내부 동작 원리
  • Spring DI와 관계
  • 실무 사례
  • 전략 패턴 남용 문제

까지 정리해보겠습니다.


1. 전략 패턴(Strategy Pattern)이란?

전략 패턴은:

알고리즘(행동)을 객체로 분리하여 런타임에 교체 가능하게 만드는 패턴

입니다.

즉:

행동을 캡슐화
↓
필요 시 교체 가능
 

구조.


2. 왜 전략 패턴이 필요할까?

예를 들어 결제 시스템.

안 좋은 예:

 
public void pay(String type) {

    if (type.equals("CARD")) {

    } else if (type.equals("KAKAO")) {

    } else if (type.equals("NAVER")) {

    }
}
 

문제:

  • if/switch 증가
  • 유지보수 어려움
  • 새 기능 추가 시 기존 코드 수정

발생.


3. 전략 패턴 핵심 아이디어

핵심은:

행동을 객체로 분리
 

하는 것입니다.

즉:

결제 방식
↓
각각 객체화
 

구조.


4. 전략 인터페이스 정의

 
public interface PaymentStrategy {

    void pay(int amount);
}
 

5. 전략 구현체 생성

카드 결제

 
public class CardPaymentStrategy
        implements PaymentStrategy {

    @Override
    public void pay(int amount) {
        System.out.println("카드 결제");
    }
}
 

카카오페이

 
public class KakaoPaymentStrategy
        implements PaymentStrategy {

    @Override
    public void pay(int amount) {
        System.out.println("카카오 결제");
    }
}
 

6. 전략 사용 객체(Context)

 
public class PaymentService {

    private PaymentStrategy strategy;

    public PaymentService(
            PaymentStrategy strategy) {

        this.strategy = strategy;
    }

    public void pay(int amount) {
        strategy.pay(amount);
    }
}
 

7. 실행 코드

 
PaymentStrategy strategy =
    new CardPaymentStrategy();

PaymentService service =
    new PaymentService(strategy);

service.pay(1000);
 

8. 전략 패턴 핵심 구조

구조:

Context
 ↓
Strategy Interface
 ↓
Concrete Strategy
 

즉:

  • Context는 전략 인터페이스만 의존
  • 실제 구현체는 교체 가능

9. 전략 패턴 핵심 장점


장점 설명
if/switch 제거 유지보수 향상
OCP 만족 확장 쉬움
다형성 활용 유연한 설계
테스트 쉬움 Mock 가능

10. 전략 패턴과 다형성

전략 패턴 핵심은 사실상:

인터페이스 기반 다형성

입니다.

예시:

 
PaymentStrategy strategy
 

뒤 구현체:

  • Card
  • Kakao
  • Naver

교체 가능.


11. OCP(Open Closed Principle)와 전략 패턴

전략 패턴은 대표적인:

Object-Oriented Programming 의 OCP 구현 사례입니다.

즉:

새 전략 추가
↓
기존 코드 수정 최소화
 

가능.


12. Spring과 전략 패턴

Spring은 사실상 전략 패턴 기반 프레임워크에 가깝습니다.

예시:

 
@Autowired
PaymentStrategy strategy;
 

실제 구현체:

  • CardPayment
  • KakaoPayment
  • NaverPayment

등 교체 가능.


13. Spring DI와 전략 패턴

Spring DI 핵심:

인터페이스 의존
+
구현체 주입
 

즉 전략 패턴 구조와 거의 동일.


14. 실무에서 전략 패턴 많이 쓰는 사례


영역 예시
결제 카드/카카오/네이버
로그인 JWT/OAuth/Session
할인 정책 정액/정률
정렬 알고리즘 Comparator
압축 방식 zip/gzip

15. Comparator도 전략 패턴

대표 사례:

 
Collections.sort(list, comparator);
 

Comparator 구현체 교체 가능.

즉:

정렬 전략 교체
 

구조.


16. 전략 패턴과 if 제거

안 좋은 코드:

 
if (discountType == FIXED)

if (discountType == RATE)
 

좋은 구조:

 
DiscountStrategy
 

구현체 분리.


17. 전략 패턴과 테스트

테스트가 매우 쉬워집니다.

예시:

 
MockPaymentStrategy
 

주입 가능.

즉:

실제 구현체 없이 테스트 가능
 

18. 전략 패턴과 유지보수

새 기능 추가 시:

새 구현체 추가
 

만 하면 됨.

기존 코드 수정 최소화 가능.


19. 전략 패턴과 런타임 교체

전략은 실행 중 교체 가능.

 
service.setStrategy(
    new KakaoPaymentStrategy()
);
 

즉:

동적 알고리즘 교체
 

가능.


20. 전략 패턴과 캡슐화

각 전략 내부 구현은 외부에서 모름.

즉:

행동 캡슐화
 

구조.


21. 전략 패턴과 객체지향 핵심

전략 패턴은:

  • 다형성
  • 인터페이스
  • OCP
  • DIP(의존 관계 역전 원칙)

전부 활용하는 대표적인 객체지향 패턴입니다.


22. 실무에서 자주 하는 실수

1) 전략 없이 if/switch 남발

유지보수 급격히 어려워짐.


2) 전략 객체 상태 공유

Thread-safe 문제 가능.


3) 너무 작은 전략까지 분리

클래스 폭발 가능.


23. 전략 패턴 남용 문제

예:

단순 로직 하나
↓
인터페이스
구현체
팩토리
설정 클래스
 

과도한 추상화 가능.


24. 언제 전략 패턴을 쓰는 게 좋을까?

추천 상황:


상황 적합 여부
알고리즘 여러 개 매우 좋음
런타임 교체 필요 매우 좋음
if/switch 많음 좋음
확장 가능성 높음 좋음

25. 전략 패턴 vs 상속

상속 기반:

강한 결합
 

전략 패턴:

조합(Composition)
 

기반.

즉:

상속보다 유연
 

합니다.


26. 전략 패턴과 조합(Composition)

핵심 구조:

 
class Service {

    private Strategy strategy;
}
 

즉:

has-a 관계 (포함관계: 자동차와 엔진)
 

입니다. (반대개념 is-a 상속관계: 학생은 사람이다)


27. 전략 패턴과 함수형 프로그래밍

Java 8 이후:

 
lambda
 

로 간단히 구현 가능.

예시:

 
PaymentStrategy strategy =
    amount -> System.out.println(amount);
 

28. Spring Boot 실무 예시

대표 사례:

로그인 전략
암호화 전략
파일 저장 전략
메시지 발송 전략
 

등 거의 everywhere 사용.


29. 전략 패턴의 진짜 목적

핵심 목적은:

변경에 강한 구조
 

입니다.

즉:

  • 구현 교체 쉬움
  • 확장 쉬움
  • 유지보수 쉬움

구조를 만들기 위한 패턴.


30. 정리

전략 패턴(Strategy Pattern)은 단순 디자인 패턴이 아닙니다.

실제로는:

  • 다형성
  • 인터페이스 기반 설계
  • Spring DI
  • OCP
  • 유지보수성

과 깊게 연결되는 핵심 객체지향 설계 패턴입니다.

특히 실무에서는:

  • 결제 시스템
  • 인증 시스템
  • 할인 정책
  • Comparator
  • Spring Bean 전략 구조

등에서 매우 많이 사용됩니다.

다음 글에서는:

템플릿 메서드 패턴(Template Method Pattern)

을 Spring Framework 내부 구조와 함께 실무 관점까지 포함해서 정리해보겠습니다.

반응형

댓글