전략패턴

원문: https://www.notion.so/1c8bf506e99480e6b5c8e13e0509a8cc

[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. 장점

  2. 정리

  3. 한 줄 요약

(2) Springboot

1) 전략 인터페이스

public interface LoginStrategy {
    AuthResult login(UserData data);
    void logout();
}

2) 각각의 전략 구현

@Component("emailStrategy")
public class EmailLoginStrategy implements LoginStrategy {
    public AuthResult login(UserData data) {
        // 이메일 로그인 로직
    }

    public void logout() {
        // 이메일 로그아웃
    }
}
@Component("googleStrategy")
public class GoogleLoginStrategy implements LoginStrategy {
    public AuthResult login(UserData data) {
        // 구글 로그인 로직
    }

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

3) 전략을 사용하는 AuthService

  • 방법1. @Qualifier 사용 (전략 한 개 고정)

  • 방법 2. 전략 여러 개를 맵으로 받아서 런타임에 선택 (🔥 실무에서 자주 씀)

(3) Springboot + Lombok

1) 전략 구현

@Component("emailStrategy")
@RequiredArgsConstructor
public class EmailLoginStrategy implements LoginStrategy {
    private final UserRepository userRepository;

    @Override
    public AuthResult login(UserData data) {
        // 이메일 로그인 로직
    }

    @Override
    public void logout() {
        // ...
    }
}

2) 전략을 사용하는 AuthService

  1. @RequiredArgsConstructor + final로 생성자 자동 생성

  2. 전략 여러 개 주입 (Map) 

Comments