🎯 전략 패턴(Strategy Pattern)이란?
오늘은 디자인 패턴 중 하나인 전략 패턴(Strategy Pattern)에 대해 정리해보려고 한다.
전략 패턴이란, 전략이라고 부르는 '캡슐화한 알고리즘'을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 디자인 패턴이라고 한다.
🔑 로그인 방식과 전략 패턴
우리가 인프런 같은 사이트에 로그인할 때 여러 가지 방법이 있다.
- 아이디 & 비밀번호 로그인 (이메일 가입)
- 카카오 로그인
- 구글 로그인
- 깃허브 로그인
- 애플 로그인
즉, "로그인"이라는 같은 행위를 수행하지만, 로그인 방식(전략)이 다를 수 있다.
이때, 그냥 아이디 & 비밀번호를 입력하는 방식을 "로컬 전략(Local Strategy)"이라고 부른다.
반면, 카카오나 구글 같은 외부 서비스를 통해 로그인하는 방식은 "소셜 로그인(Social Login)" 전략이라고 할 수 있다.
이것을 코드로 생각해 보면, "로그인"이라는 하나의 동작(컨텍스트)은 동일하지만, 내부적으로 실행되는 "전략"이 다를 뿐이다.
전략 패턴을 적용하면 이런 로그인 방식을 유연하게 교체할 수 있다!
🤔 왜 전략 패턴을 사용할까?
그런데, 굳이 이렇게 전략 패턴을 사용할 필요가 있을까?
예를 들어, 로그인 방식을 if-else로 분기 처리하면 되지 않을까?
if (loginType.equals("local")) {
// 로컬 로그인 처리
} else if (loginType.equals("kakao")) {
// 카카오 로그인 처리
} else if (loginType.equals("google")) {
// 구글 로그인 처리
}
이렇게 하면 되긴 하는데... 만약 로그인 방식이 더 추가된다면?
예를 들어, "네이버 로그인"이나 "페이스북 로그인"이 추가된다면?
매번 if-else를 수정해야 하는 번거로움이 생긴다.
전략 패턴을 사용하면 이러한 문제를 해결할 수 있다!
즉, 각 로그인 방식을 별도의 "전략" 클래스로 분리하여 확장성을 높이고, 런타임에 원하는 전략을 선택할 수 있도록 한다.
💡 전략 패턴의 핵심 아이디어
전략 패턴의 핵심 개념을 정리하자면 다음과 같다.
- 여러 개의 알고리즘(전략)을 인터페이스로 정의한다.
- 각 전략을 별도의 클래스로 구현한다.
- 컨텍스트(Context)에서 전략을 선택하여 실행할 수 있도록 한다.
로그인 예제를 코드로 표현하면 대략 이런 구조가 될 것이다.
// 1. 전략 인터페이스 정의
public interface LoginStrategy {
void login();
}
// 2. 로컬 로그인 전략
public class LocalLoginStrategy implements LoginStrategy {
@Override
public void login() {
System.out.println("아이디와 비밀번호로 로그인합니다.");
}
}
// 3. 카카오 로그인 전략
public class KakaoLoginStrategy implements LoginStrategy {
@Override
public void login() {
System.out.println("카카오 계정으로 로그인합니다.");
}
}
// 4. 컨텍스트 (로그인 실행)
public class LoginContext {
private LoginStrategy loginStrategy;
public void setLoginStrategy(LoginStrategy loginStrategy) {
this.loginStrategy = loginStrategy;
}
public void executeLogin() {
loginStrategy.login();
}
}
// 5. 실행 코드
public class Main {
public static void main(String[] args) {
LoginContext context = new LoginContext();
// 로컬 로그인 전략 사용
context.setLoginStrategy(new LocalLoginStrategy());
context.executeLogin();
// 카카오 로그인 전략 사용
context.setLoginStrategy(new KakaoLoginStrategy());
context.executeLogin();
}
}
이렇게 하면 새로운 로그인 방식을 추가할 때마다 기존 코드를 수정하지 않고 새로운 전략 클래스를 추가하기만 하면 된다!
즉, OCP(개방-폐쇄 원칙, Open-Closed Principle)을 만족하는 코드가 된다.
🧐 마무리하며...
전략 패턴을 학습하면서 가장 중요하다고 느낀 점은,
"같은 행위를 여러 방식으로 구현할 때 전략 패턴을 사용하면 유연한 설계를 할 수 있다"는 것이다.
'CS 공부' 카테고리의 다른 글
# 프록시 패턴 (0) | 2025.02.20 |
---|---|
# 옵저버 패턴 (0) | 2025.02.20 |
# 의존성 주입과 의존관계 역전 원칙 (0) | 2025.02.20 |
# 이터레이터(iterator) 패턴 (0) | 2025.02.20 |
# 팩토리 패턴 (1) | 2025.02.20 |