CS 공부

# 전략 패턴

박태정 입니다. 2025. 2. 20. 15:46
반응형

🎯 전략 패턴(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를 수정해야 하는 번거로움이 생긴다.

전략 패턴을 사용하면 이러한 문제를 해결할 수 있다!
즉, 각 로그인 방식을 별도의 "전략" 클래스로 분리하여 확장성을 높이고, 런타임에 원하는 전략을 선택할 수 있도록 한다.


💡 전략 패턴의 핵심 아이디어

전략 패턴의 핵심 개념을 정리하자면 다음과 같다.

  1. 여러 개의 알고리즘(전략)을 인터페이스로 정의한다.
  2. 각 전략을 별도의 클래스로 구현한다.
  3. 컨텍스트(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