쇼핑몰 할인 계산 코드를 맡게 됐는데 회원 등급별 할인 로직이 이런 식으로 되어 있어요.


if (type.equals("vip")) {
  return price * 0.8;
} else if (type.equals("gold")) {
  return price * 0.9;
} else if (type.equals("silver")) {
  return price * 0.95;
} else {
  return price;
}


문제는 등급이 계속 추가돼요. 얼마 전에 "platinum"이 생겼고 다음 달엔 또 뭐가 생긴다는데, 그때마다 이 함수를 열어서 else if를 끼워넣고 있거든요. 이게 개방폐쇄 원칙(OCP) 위반이라는 건 알겠는데 어떻게 걷어내야 깔끔한지 모르겠어요.


검색하다 보니 전략 패턴(Strategy Pattern)이랑 마틴 파울러가 말한 "조건문을 다형성으로 바꾸기(Replace Conditional with Polymorphism)"가 딱 이 상황이라던데요. 각 등급 계산을 전략 객체로 따로 빼서 런타임에 갈아끼우고, 새 등급이 생기면 기존 코드 안 건드리고 전략 클래스만 하나 추가하는 그림으로 이해했어요.


혹시 실무에서 이렇게 바꿔보신 분 계신가요? 전략을 고르는 부분(등급 문자열 받아서 어떤 전략 쓸지 결정)은 결국 어딘가엔 남아야 할 텐데, 그 부분은 보통 어떻게들 처리하시는지 궁금합니다.