✅ Part 2: 전략 패턴 (Strategy Pattern)
📌 1. 개념 요약
전략 패턴(Strategy Pattern) 은 행위(로직/알고리즘)를 객체화해서 외부에서 주입하고 교체할 수 있도록 만든 구조입니다.
즉, 어떤 기능(전략)이 상황에 따라 달라져야 할 때,
- 조건문(if/else) 대신
- 전략 인터페이스 + 구현체를 만들어
- 필요 시점에 교체해서 실행
🔧 2. 구조 및 키포인트
[인터페이스] : 전략 규칙 정의
[구현 클래스들] : 전략별 로직 분리
[컨텍스트 객체] : 전략을 주입받아 실행
- 실행을 담당하는 컨텍스트 객체는 전략에 대해 알지 못함
- 전략 인터페이스만 알고 있으므로 전략 교체가 자유로움
✅ 3. 예제: 정렬 알고리즘 선택
🔹 전략 인터페이스
interface SortStrategy {
void sort(List<String> list);
}
🔹 구현 클래스 1: 버블 정렬
class BubbleSort implements SortStrategy {
public void sort(List<String> list) {
System.out.println("버블 정렬 알고리즘 수행");
}
}
🔹 구현 클래스 2: 퀵 정렬
class QuickSort implements SortStrategy {
public void sort(List<String> list) {
System.out.println("퀵 정렬 알고리즘 수행");
}
}
🔹 컨텍스트 클래스: 전략 실행자
class SortService {
private SortStrategy strategy;
public SortService(SortStrategy strategy) {
this.strategy = strategy;
}
public void executeSort(List<String> list) {
strategy.sort(list);
}
}
🔹 실행 코드
public class Main {
public static void main(String[] args) {
List<String> data = List.of("C", "A", "B");
SortService bubbleService = new SortService(new BubbleSort());
bubbleService.executeSort(data);
SortService quickService = new SortService(new QuickSort());
quickService.executeSort(data);
}
}
🧠 4. 실무 적용 포인트
실무 상황 |
전략 패턴 도입 효과 |
정책마다 처리 방식이 달라야 할 때 |
if/else 대신 구현체 분리 |
기능을 외부에서 바꿔서 넣고 싶을 때 |
동적으로 전략 교체 가능 |
테스트, 유지보수 편하게 하고 싶을 때 |
전략을 Mock으로 대체 가능 |
예시: 할인 정책, 추천 알고리즘, 로그인 방식 |
Strategy 로 구현 클래스 분리 |
🛠️ 5. 확장: Spring DI + 전략 패턴
@Component
public class EmailNotification implements NotificationStrategy {
public void send(String message) {
System.out.println("이메일 발송: " + message);
}
}
@Service
public class NotificationService {
private final NotificationStrategy strategy;
public NotificationService(NotificationStrategy strategy) {
this.strategy = strategy;
}
public void notifyUser(String msg) {
strategy.send(msg);
}
}
- Spring에서는 전략을 빈(Bean) 으로 관리하고 자동 주입할 수 있음
- 테스트 시에는 다른 전략으로 교체도 손쉬움 (Mock, Stub, 다른 구현체 등)
📝 6. 정리
항목 |
설명 |
설계 목적 |
로직을 외부로 분리해 교체/확장 가능하게 함 |
구성 요소 |
인터페이스 + 구현체 + 실행 컨텍스트 |
효과 |
조건문 제거, 테스트 용이성, 전략 교체 용이 |
실무 사용 예 |
할인 정책, 정렬, 필터링, 결제 수단, 인코딩 방식, 알림 방식 등 |
댓글