βοΈ μμ±μ: μ΄νμ°
π μμ±μμ νλ§λ: μ²μ μ¬μ©νλ νλ μμν¬λλΌλ λ€ κ°μ νλ‘κ·Έλλ°μ΄λλΌ
λ€μ΄μ΄ν°λ€μ μΈμ κ±±μ μ μ€μ¬μ£Όλ λ€μ΄μ΄νΈ μλΉ μ§λ μ±, ν¬νΈλ―Έμ μμ λ‘κ·ΈμΈ κΈ°λ₯μ ꡬννλ©΄μ μλμ κ°μ΄ λ‘κ·ΈμΈ μλΉμ€ μ 곡μμ λΆκΈ°μ λ°λΌ λΆκΈ° μ²λ¦¬κ° λλ κ²μ 보μλ€.
// UserService.ts
import auth from "../config/auth";
export type SocialPlatform = "kakao" | "naver" | "apple";
const getUser = async (social: SocialPlatform, accessToken: string) => {
try {
let user;
switch (social) {
case "naver":
user = await auth.naverAuth(accessToken);
break;
case "kakao":
user = await auth.kakaoAuth(accessToken);
break;
case "apple":
user = await auth.appleAuth(accessToken);
break;
}
return user;
} catch(error) {
// ETC
}
}
μ΄ μ½λ μ€λν«μμ λ€μκ³Ό κ°μ λ¬Έμ μ μ λλ μ μμλ€.
μ΄ λ¬Έμ μ λ€μ ν΄κ²°νκΈ° μν΄ μ λ΅ ν¨ν΄(Strategy Pattern)μ μ μ©νμ¬ μ½λ 리ν©ν λ§μ νκΈ°λ‘ νλ€.
μ λ΅ ν¨ν΄
κ°μ²΄λ€μ΄ ν μ μλ νμ κ°κ°μ λν΄ μ λ΅ ν΄λμ€λ₯Ό μμ±νκ³ , μ μ¬ν νμλ€μ μΊ‘μν νλ μΈν°νμ΄μ€λ₯Ό μ μ,κ°μ²΄μ νμλ₯Ό λμ μΌλ‘ λ°κΎΈκ³ μΆμ κ²½μ° μ§μ νμλ₯Ό μμ νμ§ μκ³ μ λ΅μ λ°κΏμ£ΌκΈ°λ§ ν¨μΌλ‘μ¨ νμλ₯Ό μ μ°νκ² νμ₯νλ λ°©λ²
κ²μμ μμλ₯Ό λ€μ΄λ³΄μ.
κ²μμμ νΉμ μ λμ 곡격 νμλ₯Ό Attack
μ΄λΌκ³ νμ. μ΄λ€ μ λμ μΉΌλ‘ κ³΅κ²©μ ν μ μκ³ , μ΄λ€ μ λμ μ΄μΌλ‘ 곡격μ ν μ μλ€. κ·Έλ λ€λ©΄ λ¬΄κΈ°λ‘ κ³΅κ²©μ νλ νμ
λ₯Ό μμ μ μμ λ°λΌ μΊ‘μνλ₯Ό ν΄λ³Έλ€λ©΄
interface Weapon {
// 곡격λ ₯μ 리ν΄νλ€.
attack(): number;
}
무기
λ‘ κ³΅κ²©
μ νλ κ²μ΄κΈ°μ μμ κ°μ΄ ν μ μλ€. κ·Έλ λ€λ©΄ μΉΌλ‘ κ³΅κ²©
νλ νμμ μ΄μΌλ‘ 곡격
νλ νμλ₯Ό μμ μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€λ‘ μκ°μ νλ€λ©΄ μλμ κ°μ΄ ꡬνμ ν μ μμ κ²μ΄λ€.
interface Weapon {
attack(): number;
}
class Gun: Weapon {
attack(): number {
return 5;
}
}
class Swrod: Weapon {
attack(): number {
return 3;
}
}
// μ¬μ€ μμ κ°μ΄ νμμ μ΄λ¦/Input Parameter/return νμ
λ±μ λ€ λ§μ·λ€λ©΄
// Union Type λ§μΌλ‘λ μ λ΅ν¨ν΄μ νμ©ν μ μλ€.
// νμ§λ§ μΈν°νμ΄μ€λ₯Ό νμ©νμ¬ ν΄λμ€μ ꡬν μμλ₯Ό κ°μ ν¨μΌλ‘μ¨
// λ°μν μ μλ Human Errorλ₯Ό μ€μΌ μ μκΈ°μ μΈν°νμ΄μ€λ₯Ό νμ©νκ³ μ νλ€.
μμ κ°μ΄ νΉμ νμλ₯Ό μΆμννλ€λ©΄, λ€λ₯Έ ν΄λμ€μμ μ΄ νμλ₯Ό ν λ, νμμ κ΄λ ¨λ μ½λλ₯Ό μ λ©΄ μμ νλ κ²μ΄ μλλΌ νμκ° κ΅¬νλ ν΄λμ€λ§ κ΅μ²΄λ₯Ό ν΄μ£Όλ©΄ λμ΄μ μ½λ μμ μ λμ± μ©μ΄νκ² ν μ μλ€.
// λ§μ½ μ λ΅ν¨ν΄μ μ μ©νμ§ μμλ€λ©΄?
// λμΌ μ½λμ λ°λ³΅
class Human {
healthPoint = 100;
constrctor(point: number) {
this.healthPoint = point;
}
hurt(weapon: any) {
if (weapon instanceof Gun) {
healthPoint -= weapon.attack()
} else if (weapon instanceof Sword) {
healthPoint -= weapon.attack()
}
}
}
// μ λ΅ ν¨ν΄μ μ μ©νμλ€λ©΄
class Human {
let healthPoint = 100;
hurt(weapon: Weapon) {
healthPoint -= weapon.attack()
}
}
μ°μ Auth λͺ¨λμ μλ νμλ€μ μΆμνν μ μλ μΈν°νμ΄μ€λ₯Ό μ μνλ€. ν¬νΈλ―Έμ κ²½μ° SocialAuthStrategy
λΌλ μΈν°νμ΄μ€λ‘ μ΄ νμλ₯Ό μΆμννμλ€.
export interface SocialAuthStrategy {
execute(accessToken: string): Promise<any>;
}
μ΄μ κ° νμλ€μ μΆμννλ ν΄λμ€λ€μ λ§λ€λλ‘ νμ.
class NaverAuthStrategy implements SocialAuthStrategy {
execute(accessToken: string): Promise<any> {
return auth.naverAuth(accessToken);
}
}
class KakaoAuthStrategy implements SocialAuthStrategy {
execute(accessToken: string): Promise<any> {
return auth.kakaoAuth(accessToken);
}
}
class AppleAuthStrategy implements SocialAuthStrategy {
execute(accessToken: string): Promise<any> {
return auth.appleAuth(accessToken);
}
}
μ΄μ μ΄ κ΅¬ν체λ₯Ό μμ λ‘κ·ΈμΈμ νμ©ν μ μκ² Pathμ λΈλ €μ€λ μμ λ‘κ·ΈμΈ μ 곡μμ λ°λΌμ μ λ΅μ μ 곡ν΄μ€ μ μλ κ°μ²΄λ₯Ό λ§λ€μ΄λ³΄λλ‘ νμ.
JSκ³μ΄μμ κ°μ²΄λ κΈ°λ³Έμ μΌλ‘ Dictionary νμ μ΄κΈ°μ JS μΈμ΄ νΉμ±μ λ§μΆ°μ Keyκ° SocialPlatform type("naver", "kakao", "apple"μ 리ν°λ΄ μ λμ¨ νμ )μ΄κ³ valueκ° SocialAuthStrategyμΈ Mapped Typeμ λ§λ λ€λ©΄
// export type SocialPlatform = "kakao" | "naver" | "apple";
type AuthType = {
[social in SocialPlatform]: SocialAuthStrategy;
};
μλμ κ°μ΄ Keyμ λ°λΌμ νμλ₯Ό κ°μ Έμ¬ μ μλ κ°μ²΄λ₯Ό λ§λ€ μ μλ€.
export const authStrategy: AuthType = {
naver: new NaverAuthStrategy(),
kakao: new KakaoAuthStrategy(),
apple: new AppleAuthStrategy(),
};
μ΄μ μ΄λ₯Ό μ€μ μ½λμ μ μ©νλ©΄?
import { authStrategy } from "./SocialAuthStrategy";
export type SocialPlatform = "kakao" | "naver" | "apple";
const getUser = async (social: SocialPlatform, accessToken: string) => {
try {
const user = await authStrategy[social].execute(accessToken);
return user;
} catch (error) {
// ETC
}
};
μμ κ°μ΄ λΆκΈ°λ₯Ό μ²λ¦¬νμ§ μκ³ μμ
λ‘κ·ΈμΈ μΈμ¦μ μνν μ μλ€. λν μμ
λ‘κ·ΈμΈ μ 곡μμ λ³λμ΄ μλλΌλ SocialPlatform
μ 리ν°λ΄ νμ
μ μΆκ°/μμ νκ³ SocialAuthStrategy
λ₯Ό ꡬννλ νμ ν΄λμ€(λ¬Όλ‘ μ΄μ λ°λ₯Έ μΈμ¦ κΈ°λ₯λ ꡬνν΄μΌνλ€)λ§ κ΅¬ννλ©΄ λκΈ°μ κ³ μ λΉμ¦λμ€ λ‘μ§μ ν° λ³λ μμ΄ κΈ°λ₯μ μμ ν μ μλ€.
μ§μ§ λ°°μκ°λλ€