[1] 전략 패턴이란?

(1) 의미

어떤 기능을 실행할 때, 행동(전략)을 외부에서 주입해서 바꿀 수 있게 만든 패턴 즉, “어떤 일을 어떻게 할지는 바깥에서 결정하고, 실행만 맡는다”는 구조이다.

(2) 예시

햄버거 가게 예시

점원이 햄버거를 만든다고 해보자

점원은 “전략”만 바뀌면 똑같은 방식으로 만들 수 있다.

[2] 코드 예시 - (로그인)

(1) Nest.js

1) 전략 인터페이스

interface LoginStrategy {
  login(data: any): AuthResult;
  logout(): void;
}

2) 각각의 전략 구현

class EmailLoginStrategy implements LoginStrategy {
  login(data: any) {
    // 이메일 로그인 로직
  }

  logout() {
    // 이메일 로그아웃 로직
  }
}

class GoogleLoginStrategy implements LoginStrategy {
  login(data: any) {
    // 구글 OAuth 로그인
  }

  logout() {
    // 구글 로그아웃
  }
}

3) 전략을 사용하는 AuthService

@Module({
  providers: [
    {
      provide: LoginStrategy,
      useClass: EmailLoginStrategy,
    },
    AuthService,
  ],
})
class AuthService {
  constructor(private readonly strategy: LoginStrategy) {}

  login(data: any) {
    return this.strategy.login(data);
  }

  logout() {
    return this.strategy.logout();
  }
}

4) 결론

  1. 장점

    장점 설명
    🔁 유연성 런타임에 전략을 바꿀 수 있음 (예: 이메일 ↔ 구글)
    ✂ 책임 분리 각 전략은 독립 클래스이므로 SRP 잘 지킴
    🧪 테스트 용이 전략마다 따로 테스트 가능