어떤 기능을 실행할 때, 행동(전략)을 외부에서 주입해서 바꿀 수 있게 만든 패턴 즉, “어떤 일을 어떻게 할지는 바깥에서 결정하고, 실행만 맡는다”는 구조이다.
점원이 햄버거를 만든다고 해보자
점원은 “전략”만 바뀌면 똑같은 방식으로 만들 수 있다.
interface LoginStrategy {
login(data: any): AuthResult;
logout(): void;
}
class EmailLoginStrategy implements LoginStrategy {
login(data: any) {
// 이메일 로그인 로직
}
logout() {
// 이메일 로그아웃 로직
}
}
class GoogleLoginStrategy implements LoginStrategy {
login(data: any) {
// 구글 OAuth 로그인
}
logout() {
// 구글 로그아웃
}
}
@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();
}
}
장점
| 장점 | 설명 |
|---|---|
| 🔁 유연성 | 런타임에 전략을 바꿀 수 있음 (예: 이메일 ↔ 구글) |
| ✂ 책임 분리 | 각 전략은 독립 클래스이므로 SRP 잘 지킴 |
| 🧪 테스트 용이 | 전략마다 따로 테스트 가능 |