608. 전략 패턴 알고리즘 교체 용이성
핵심 인사이트 (3줄 요약)
- 본질: 전략(Strategy) 패턴은 결제 방식에 카카오페이, 네이버페이가 추가될 때마다 메인 로직 뱃속에
if-else분기문이 스파게티처럼 길어지다 괄호(}) 오타 1개에 전사 시스템이 셧다운 되는 파멸을 끊어내는 객체지향 행위 패턴이다.- 가치:
if-else코드를 도끼로 찢어발겨 여러 개의 독립된 자바 파일(Class)로 갈아 넣고, 유저가 카카오 버튼을 누르는 런타임(Runtime) 찰나에 딱 맞는 1개의 무기(결제 알고리즘)만 주입해 줘서 1줄 컷(strategy.pay())으로 실행시켜버리는 극한의 핫스왑(Hot-Swap) 교체술이다.- 융합: 이 패턴은 "수정에는 닫히고 확장에는 열려라"는 SOLID OCP(개방폐쇄원칙)를 실전 코드 100%로 구워낸 물리적 템플릿이며, 객체 생성 노가다를 분담하는 팩토리 패턴(607장) 및 스프링 빈 주입(IoC) 인프라와 융합되어 클라우드 백엔드의 1티어 뼈대 헌법으로 군림한다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
- 개념: 전쟁터(런타임)에서 상황에 맞게 꺼내 쓰는 '무기'(알고리즘). 무기들을 하나의 뚱뚱한 클래스 뱃속에 구겨 넣지 않고, 각각 날렵한 클래스로 찢어버린 뒤 상황에 맞춰 장착해서 쓰는 객체 지향 캡슐화의 꽃.
- 필요성: 쿠팡 결제 서버
public void pay() { if(신용카드) {..} else if(무통장) {..} }. 3년 뒤 결제 수단이 50개로 늘어나며 파일이 1만 줄짜리 괴물이 됐다. "새로운 기능을 '추가'할 건데 왜 멀쩡히 돌던 기존 코드를 '수정'하는 지뢰밭에 기어 들어가야 해?!" 기존 코드는 안 건드리고 새 기능만 1초 컷 조립하는 꼼수가 필요했다. - 💡 비유:
if-else통짜 코딩은 **'드라이버 10개를 테이프로 다 묶어놓은 거대한 고철 덩어리'**입니다. 전략 패턴은 '전동 드릴 1개(Context)와 10개의 갈아 끼우는 예쁜 앞코(Strategy 비트)' 세트입니다. 세모 나사(토스페이)가 나와도 드릴은 안 부수고, 세모 비트 1개만 사 와서 찰칵 꽂으면 끝나는 무적 교체술입니다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
1. if-else 도끼로 찢어내는 3박자 콤보 💥
[ 👑 정답: 전략 패턴 3박자 가위질 ]
- Strategy (전략 껍데기 헌법):
interface PaymentStrategy { void pay(); } - Concrete Strategy (알맹이 칼과 총들):
class KakaoPay implements PaymentStrategy { public void pay() { 진짜 로직 } }class NaverPay implements ... - Context (사용자 뼈대 껍데기):
class Order { private PaymentStrategy strategy; // 알맹이는 모름. 껍데기만 쥠 public void setStrategy(PaymentStrategy s) { this.strategy = s; } public void checkout() { strategy.pay(); // 💥 if-else 1만 줄이 단 1줄 컷으로 압축 증발!! } }
2. 치명적 흑마법: 런타임(Runtime) 동적 스위칭 교체술 💥
내 뱃속에 들어온 무기(strategy)는 단순한 '객체 변수'일 뿐이다!! 유저가 12시에 '카카오' 눌렀다 ➡ order.setStrategy(new KakaoPay()) 장착! 12시 1분에 '네이버'로 바꿨다 ➡ order.setStrategy(new NaverPay()) 서버 재부팅 없이 메모리 위에서(Runtime) 실시간으로 뇌를 갈아 끼우는 핫스왑 교체술이 폭발한다.
Ⅲ. 융합 비교 및 다각도 분석
1. 객체지향 3대 패턴 족보 찢기 (Strategy vs State vs Template Method)
| 척도 | 1. 전략 (Strategy) 👑 | 2. 상태 (State) 🚦 | 3. 템플릿 메서드 (Template) 🪨 |
|---|---|---|---|
| 설계 뼈대 | 인터페이스 + 조립 | 인터페이스 + 조립 | 부모 자식 상속(extends) 떡칠 |
| 목적의 차이 | 유저가 1개를 직접 선택해서 밖에서 꽂아줌 (클라이언트 주도 픽). | 자기들끼리 룰(Rule)에 따라 자동으로 상태가 스위칭 넘어감. | 뼈대 순서는 아빠가 잡고, 빈칸만 자식이 채움 (코드 중복 제거). |
과목 융합 관점
- 소프트웨어 공학 (SOLID 중 OCP 헌법 100% 락인): 전략 패턴은 OCP(개방 폐쇄 원칙)를 눈에 보이는 코드로 증명해 낸 도면이다. 내일 당장 "애플페이" 추가 오더가 떨어져도, 코어 파일은 1바이트도 수정하지 않고(Closed)
ApplePay.java새 파일을 파서 던져두면(Open) 끝난다. - 클라우드 스프링 프레임워크 (IoC 컨테이너와 DI 융합): 개발자가 밖에서
setStrategy쳐주는 것도 사실 스파게티다. 스프링은 팩토리 컨테이너(ApplicationContext)를 띄워, 런타임에 유저가kakao문자열 던지면 0.001초 컷으로 알맞은 빈(Bean)만 핀셋으로 뽑아 푹 꽂아주는(DI) **'무인 오토 팩토리 융합기'**로 생태계를 통일했다.
Ⅳ. 실무 적용 및 기술사적 판단
실무 시나리오
-
시나리오 — '파라미터 뚱땡이 늪' 오버엔지니어링 파국: 10개의 검색 엔진 로직을 찢었다. 1번 봇은
(검색어, 날짜, 필터)3개가, 2번 봇은 5개 파라미터가 필요했다. 껍데기 룰을 맞추다 보니void search(a, b, c, d, e...)구멍을 15개 뚫어버렸다.- 아키텍트의 해결책: 인터페이스 파라미터 개수가 2개를 넘어가면 죽은 거다. 15개 파라미터를 1개 금고 객체
SearchContext로 빚는다(Parameter Object Pattern). 그리고void search(SearchContext ctx)1개로 닫아건 뒤, 자식 봇들은 금고에서 자기 반찬만 꺼내 먹게 해야 무적의 클린 코드가 성립된다.
- 아키텍트의 해결책: 인터페이스 파라미터 개수가 2개를 넘어가면 죽은 거다. 15개 파라미터를 1개 금고 객체
-
시나리오 — '람다(Lambda) 함수형 프로그래밍'의 클래스 찢기 노가다 종말: 고작 "오름, 내림차순 정렬" 전략 2개 만들자고 클래스 껍데기 3개 파는 보일러플레이트 지옥.
- 아키텍트의 해결책: 함수형 프로그래밍(Lambda) 1줄 컷 흡수 통일이다. 클래스 파일 파지 말고,
order.setStrategy( (a, b) -> a.price - b.price )화살표 함수 1줄을 허공에 던져 익명 전략 객체로 스위칭 치면, 전략 패턴은 인류 최고의 가성비 무기로 재림한다.
- 아키텍트의 해결책: 함수형 프로그래밍(Lambda) 1줄 컷 흡수 통일이다. 클래스 파일 파지 말고,
안티패턴
- "전략 봇 뱃속에 똑같은 DB 찌르기 중복 코드를 1,000줄 복붙하기": 카카오, 네이버페이로 찢었는데 90줄은 DB 커넥션 맺는 똑같은 노가다 코드였다 (DRY 원칙 위반). "패턴은 섞어 써야 갓(God)이다!
템플릿 메서드를 멱살 잡아 와서 90줄의 DB 통신 뼈대는 아빠 클래스에 1번 박아두고, 자식 전략 봇들은 오직 10줄짜리 알맹이 로직(API 호출)만 구멍에 채워 넣어야 진정한 다이어트가 성립한다."
Ⅴ. 기대효과 및 결론
정량/정성 기대효과
| 구분 | switch-case 1만 줄 로직 강결합 쌩코딩 시절 | Strategy 껍데기 파서 봇으로 찢고 DI 융합 | 개선 효과 |
|---|---|---|---|
| 정량 | 신규 연동 시, 기존 1만 줄 똥밭 수정 ➡ 버그율 30% 폭발 | 기존 파일 1바이트 수정 없이 10줄 파일 추가 1시간 컷 | 비즈니스 변경 요구 대응 확장 스피드 99% 단축 |
| 정성 | "아 옆자리 김 대리가 괄호 지워서 내 로직까지 뻗었어!!" | "응 내 파일 남남이니까 서로 1도 타격 없음 ㅋ 굿" | 도메인 관심사 격리를 통한 팀워크 병목 파괴 |
미래 전망
- Feature Flag (피처 플래그)와 인프라 런타임 A/B 스위칭 대통합: 이제는 576장의 **피처 플래그 툴(LaunchDarkly)**이 백엔드 코드의 스위치 멱살을 잡는다. 사장님이 주말에 대시보드 웹 페이지에서 스위치를 누르면 0.1초 찰나에 10%의 유저들에게만 스르륵
V2 전략 봇으로 핫스왑 스위칭을 쳐서 트래픽을 굴려버리는 10,000% 무중단 런타임 도박장이 표준으로 군림하고 있다. - 머신러닝(AI) 주도형 동적 전략 선택: 아키텍트는 100개의 할인 알고리즘(전략 봇)을 K8s 허공에 던져놓고 퇴근한다. 유저 트래픽이 몰려오면 AI 문지기(Agent)가 0.001초 찰나에 유저의 1년 치 로그를 씹어 먹고 지 맘대로 수백 개의 전략 봇 중 1개를 실시간 픽(Pick)해서 다이렉트로 인터페이스 주사기 바늘을 꽂아버리는 무인화 강화학습 트래픽 스위칭 팩토리가 최전방 무기다.