전략 패턴(Strategy Pattern)은 객체의 행위를 변경할 때, 알고리즘을 캡슐화하여 컨텍스트 내부에서 동적으로 교체할 수 있도록 만드는 패턴입니다. 즉, 객체가 수행하는 기능(행위)을 미리 정의된 여러 알고리즘 중 하나로 변경할 수 있도록 설계하는 방식입니다.
이 패턴을 활용하면 동일한 문제를 해결하는 다양한 알고리즘을 독립적으로 구현할 수 있으며, 런타임에서 원하는 전략을 선택하여 실행할 수 있습니다. 이는 코드의 유지보수성을 높이고, 확장성을 극대화하는 데 유용합니다.
전략 패턴의 필요성
어떤 애플리케이션이 다양한 방식으로 동작할 수 있도록 하려면, 다음과 같은 문제를 해결해야 합니다.
조건문 남발: if-else나 switch 문을 통해 여러 가지 동작을 구현하면 코드가 복잡해지고 유지보수성이 떨어집니다.
유연하지 않은 설계: 객체의 행위를 변경하려면 기존 코드에 직접적인 수정이 필요하며, 이는 OCP(개방-폐쇄 원칙) 위반으로 이어질 수 있습니다.
중복 코드 발생: 서로 다른 방식으로 동작하는 코드가 반복적으로 등장하면 유지보수가 어려워집니다.
전략 패턴을 사용하면 위 문제를 해결할 수 있으며, 객체가 다양한 동작을 필요로 하는 경우에도 코드의 재사용성을 극대화할 수 있습니다.
전략 패턴과 템플릿 메소드 패턴의 차이점
전략 패턴은 행위를 동적으로 변경할 수 있도록 하는 패턴이며, 각 알고리즘을 별도의 클래스로 분리하여 필요에 따라 선택적으로 사용할 수 있습니다.
반면, 템플릿 메소드 패턴(Template Method Pattern)은 기본적인 알고리즘 구조를 정의하고, 일부 세부 사항을 하위 클래스에서 구현하도록 하는 패턴입니다. 즉, 전략 패턴은 실행 중에 알고리즘을 바꿀 수 있는 반면, 템플릿 메소드 패턴은 상속을 통해 일부 동작을 변경하는 구조입니다.
전략 패턴 예제
전략 패턴을 활용하여 소셜 로그인 시스템을 설계해보겠습니다. 사용자는 Google, Kakao, GitHub 등의 로그인 방법을 선택할 수 있으며, 각 로그인 방식은 전략 패턴을 이용해 독립적으로 구현됩니다.
전략 패턴을 활용하면 객체의 행위를 동적으로 변경할 수 있어 유지보수성과 확장성이 향상됩니다. 위 예제처럼 로그인 방식뿐만 아니라 검색 필터링, 결제 방식, 추천 시스템 등 다양한 곳에서 활용할 수 있습니다.
다양한 플랫폼별 프로토타입 동작 구현
만약 여러분의 서비스가 웹, 모바일, 태블릿 등 여러 플랫폼을 지원한다고 가정해봅시다. 각 플랫폼마다 사용자 경험과 인터랙션 패턴이 다를 수 있으므로, 플랫폼별로 다른 동작 방식을 전략 패턴을 통해 구현할 수 있습니다. 이를 통해 코드의 재사용성을 높이고, 유지보수를 용이하게 할 수 있습니다.