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 내부 구조와 함께 실무 관점까지 포함해서 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java JVM 구조 이해 완벽 정리 (0) | 2026.05.26 |
|---|---|
| Java 템플릿 메서드 패턴(Template Method Pattern) 완벽 이해하기 (0) | 2026.05.22 |
| Java Builder Pattern 완벽 이해하기 (0) | 2026.05.22 |
| Java 불변 객체(Immutable Object) 완벽 이해하기 (0) | 2026.05.22 |
| 객체지향 설계 원칙 SOLID 완벽 이해하기 (0) | 2026.05.22 |
댓글