전략패턴
전략패턴
원문: 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) 결론
-
장점
-
정리
-
한 줄 요약
(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
-
@RequiredArgsConstructor + final로 생성자 자동 생성
-
전략 여러 개 주입 (Map)
Comments