์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- ํญํดํ๋ฌ์ค ํ๊ธฐ
- ํญํดํ๋ฌ์ค
- ํญํดํ๋ฌ์คํ๊ธฐ
- fanout on write
- API Aggregation
- ํญํ ํ๊ธฐ
- ํญํด+
- ๊ธฐ๋ฅ ํ ์คํธ
- ํผ๋ ๊ตฌํ
- ํญํดํ๋ฌ์ค ํ๊ณ
- ์ฑ๊ธํค ๋น
- ๋ฐ์ดํฐ ์ฟผ๋ฆฌ
- ํญํด ๋ฐฑ์๋
- TDD
- ํญํดํ๋ฌ์ค ๋ฐฑ์๋
- ๋์์ธ ํจํด
- fanout on read
- ๋น ์ค์ฝํ
- ํญํ
- ํญํ ๋ฐฑ์๋
- ํ๋กํ ํ์ ๋น
- push model
- pull model
- OOP
- ์์ฐจ์งํฅ
- ์์ฑ ํจํด
- ํญํด
- ํญํด ํ๊ธฐ
- ํญํดํ๋ฌ์ค๋ฐฑ์๋
- ํญํด ํ๋ฌ์ค ํ๊ธฐ
- Today
- Total
deVlog
[๋์์ธ ํจํด] ํ์ ํจํด - Strategy Pattern (์ ๋ต ํจํด) ๋ณธ๋ฌธ
[๋์์ธ ํจํด] ํ์ ํจํด - Strategy Pattern (์ ๋ต ํจํด)
์๋ฃจ๋ฐ 2024. 6. 10. 22:54๋ชฉ์ฐจ
๐ ๊ฐ์
์ ๋ต ํจํด(Strategy Pattern)์ ์๊ณ ๋ฆฌ์ฆ์ ์บก์ํํ์ฌ ์คํ ์ค์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ๊ณ ๊ต์ฒดํ ์ ์๊ฒ ํ๋ ๋์์ธ ํจํด์ด๋ค. ์ฆ, ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฌ๋ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ณ๋์ ํด๋์ค๋ก ๋ถ๋ฆฌํ๊ณ , ์ด๋ค์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ต์ฒด ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๋ฐฉ์์ด๋ค.
ํน์ง
- ํ์(์๊ณ ๋ฆฌ์ฆ)๋ฅผ ํด๋์ค๋ก ์บก์ํํ์ฌ ๋์ ์ผ๋ก ๊ต์ฒดํ ์ ์๋ค.
- ์ปจํ ์คํธ(Context)์ ์ ๋ต(Strategy)์ ๋ถ๋ฆฌํ์ฌ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.
- OCP(๊ฐ๋ฐฉ-ํ์ ์์น)๋ฅผ ์ค์ํ๋ฉฐ ์๋ก์ด ์ ๋ต์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋ค.
๐ฉ๐ป๐ป ์ฝ๋๋ก ์์๋ณด์
๋ค์ํ ๊ฒฐ์ ๋ฐฉ์์ ๊ตฌํํ๋ ์ ๋ต ํจํด ์์ ๋ฅผ ์ดํด๋ณด์.
// 1. ์ ๋ต ์ธํฐํ์ด์ค ์ ์
interface PaymentStrategy {
void pay(int amount);
}
// 2. ๊ตฌ์ฒด์ ์ธ ์ ๋ต ํด๋์ค๋ค
class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
private String name;
public CreditCardPayment(String cardNumber, String name) {
this.cardNumber = cardNumber;
this.name = name;
}
@Override
public void pay(int amount) {
System.out.println(amount + "์์ ์ ์ฉ์นด๋(" + cardNumber + ")๋ก ๊ฒฐ์ ํ์ต๋๋ค.");
}
}
class NaverPayPayment implements PaymentStrategy {
private String email;
public NaverPayPayment(String email) {
this.email = email;
}
@Override
public void pay(int amount) {
System.out.println(amount + "์์ ๋ค์ด๋ฒํ์ด(" + email + ")๋ก ๊ฒฐ์ ํ์ต๋๋ค.");
}
}
class BankTransferPayment implements PaymentStrategy {
private String bankAccount;
public BankTransferPayment(String bankAccount) {
this.bankAccount = bankAccount;
}
@Override
public void pay(int amount) {
System.out.println(amount + "์์ ๊ณ์ข์ด์ฒด(" + bankAccount + ")๋ก ๊ฒฐ์ ํ์ต๋๋ค.");
}
}
// 3. ์ปจํ
์คํธ ํด๋์ค
class ShoppingCart {
private PaymentStrategy paymentStrategy;
// ์ ๋ต ์ค์
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
// ๊ฒฐ์ ์คํ
public void checkout(int amount) {
if (paymentStrategy == null) {
System.out.println("๊ฒฐ์ ๋ฐฉ๋ฒ์ ์ ํํด์ฃผ์ธ์.");
return;
}
paymentStrategy.pay(amount);
}
}
// ์คํ ์ฝ๋
public class StrategyPatternExample {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
// ์ ์ฉ์นด๋ ๊ฒฐ์
System.out.println("๐ณ ์ ์ฉ์นด๋ ๊ฒฐ์ ");
cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9012-3456", "ํ๊ธธ๋"));
cart.checkout(80000);
// ๋ค์ด๋ฒํ์ด ๊ฒฐ์
System.out.println("\n๐ข ๋ค์ด๋ฒํ์ด ๊ฒฐ์ ");
cart.setPaymentStrategy(new NaverPayPayment("user@example.com"));
cart.checkout(50000);
// ๊ณ์ข์ด์ฒด ๊ฒฐ์
System.out.println("\n๐ฆ ๊ณ์ข์ด์ฒด ๊ฒฐ์ ");
cart.setPaymentStrategy(new BankTransferPayment("123-456-789"));
cart.checkout(100000);
}
}
- PaymentStrategy ์ธํฐํ์ด์ค๊ฐ ๋ชจ๋ ๊ฒฐ์ ์ ๋ต์ ๊ณตํต ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ค.
- ๊ตฌ์ฒด์ ์ธ ์ ๋ต ํด๋์ค๋ค(CreditCardPayment, NaverPayPayment, BankTransferPayment)์ด ๊ฐ๊ฐ์ ๊ฒฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๋ค.
- ShoppingCart๋ ์ปจํ ์คํธ ํด๋์ค๋ก, ์ค์ ๋ ์ ๋ต์ ์ฌ์ฉํ์ฌ ๊ฒฐ์ ๋ฅผ ์ฒ๋ฆฌํ๋ค.
- ์คํ ์ค์ ๋ค์ํ ๊ฒฐ์ ๋ฐฉ์์ผ๋ก ๊ต์ฒด ๊ฐ๋ฅํ๋ค.
โ๏ธ ์ฅ/๋จ์
โ ์ฅ์
- ์๊ณ ๋ฆฌ์ฆ ๊ต์ฒด ์ฉ์ด์ฑ
- ์คํ ์ค์ ์๊ณ ๋ฆฌ์ฆ์ ๊ต์ฒดํ ์ ์์ด ์ ์ฐ์ฑ์ด ๋๋ค.
- ์ฌ์ฉ์ ์๊ตฌ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ ๋ต์ผ๋ก ์ฝ๊ฒ ์ ํํ ์ ์๋ค.
- ์ฝ๋ ์ฌ์ฌ์ฉ ๋ฐ ์ค๋ณต ์ ๊ฑฐ
- ๊ฐ ์ ๋ต์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌํ๋์ด ์๊ณ ๋ฆฌ์ฆ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ค.
- ์ ์ฌํ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ํด๋์ค์์ ์ค๋ณต ๊ตฌํํ ํ์๊ฐ ์๋ค.
- ์ปจํ
์คํธ์ ์๊ณ ๋ฆฌ์ฆ ๋ถ๋ฆฌ
- ์ปจํ ์คํธ(ShoppingCart)๋ ๊ตฌ์ฒด์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๋ชฐ๋ผ๋ ๋๋ฏ๋ก ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ค.
- ์ด๋ ์ฝ๋ ์ ์ง๋ณด์์ฑ๊ณผ ํ ์คํธ ์ฉ์ด์ฑ์ ๋์ธ๋ค.
- ์๋ก์ด ์ ๋ต ์ถ๊ฐ ์ฉ์ด
- ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ก์ด ์ ๋ต์ ์ถ๊ฐํ ์ ์๋ค(OCP ์ค์).
- ์๋ฅผ ๋ค์ด, KakaoPayPayment ๊ฐ์ ์๋ก์ด ๊ฒฐ์ ๋ฐฉ์์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋ค.
โ ๋จ์
- ํด๋์ค ์ ์ฆ๊ฐ
- ๊ฐ ์๊ณ ๋ฆฌ์ฆ๋ง๋ค ๋ณ๋์ ํด๋์ค๊ฐ ํ์ํ๋ฏ๋ก ์ ์ฒด ํด๋์ค ์๊ฐ ๋ง์์ง ์ ์๋ค.
- ์์ ํ๋ก์ ํธ์์๋ ์คํ๋ ค ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํฌ ์ ์๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ต์ ์์์ผ ํจ
- ํด๋ผ์ด์ธํธ๊ฐ ์ ์ ํ ์ ๋ต์ ์ ํํ๊ณ ์ค์ ํด์ผ ํ๋ฏ๋ก ์ ๋ต์ ๋ํ ์ง์์ด ํ์ํ๋ค.
- ์ด๋ ํด๋ผ์ด์ธํธ์ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํฌ ์ ์๋ค.
- ๋ฐ์ดํฐ ๊ณต์ ๋ฌธ์
- ์ฌ๋ฌ ์ ๋ต ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํด์ผ ํ ๊ฒฝ์ฐ ๋ณต์กํด์ง ์ ์๋ค.
- ์ปจํ ์คํธ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ ์ ๋ต ํด๋์ค ๊ฐ์ ํต์ ์ด ํ์ํ ์ ์๋ค.
- ๋ฏธ์ฌ์ฉ ์ ๋ต์ผ๋ก ์ธํ ์ค๋ฒํค๋
- ๋ชจ๋ ์ ๋ต์ ๋ฏธ๋ฆฌ ๊ตฌํํด ๋์ผ๋ฉด ์ค์ ๋ก ์ฌ์ฉํ์ง ์๋ ์ ๋ต๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋๋ค.
- ์ด๋ ๋ฆฌ์์ค ๋ญ๋น๋ฅผ ์ด๋ํ ์ ์๋ค.
๐ ์ ๋ฆฌ
์ ๋ต ํจํด์ ํ์๋ฅผ ์บก์ํํ๊ณ ๋ฐํ์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๊ฟ ์ ์๊ฒ ํด์ฃผ๋ ์ ์ฐํ ๋์์ธ ํจํด์ด๋ค.
์ด ํจํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ์ปจํ ์คํธ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ํ์ฅ์ฑ์ ๋์ฌ์ค๋ค. ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ด ํ์ํ๊ณ ์คํ ์ค์ ์ด๋ฅผ ๊ต์ฒดํด์ผ ํ๋ ์ํฉ์์ ํนํ ์ ์ฉํ์ง๋ง, ํด๋์ค ์ ์ฆ๊ฐ์ ํด๋ผ์ด์ธํธ์ ์ฑ ์ ์ฆ๊ฐ๋ผ๋ ๋จ์ ๋ ๊ณ ๋ คํด์ผ ํ๋ค.
โ ์ธ์ ์ฌ์ฉํ๋ฉด ์ข์๊น?
- ๋น์ทํ ๊ธฐ๋ฅ์ ํ์ง๋ง ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ผ ํ ๋
- ๋ฐํ์์ ์๊ณ ๋ฆฌ์ฆ์ ๋์ ์ผ๋ก ๊ต์ฒดํด์ผ ํ ๋
- ์๊ณ ๋ฆฌ์ฆ์ ์ธ๋ถ ๊ตฌํ์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์จ๊ธฐ๊ณ ์ถ์ ๋
- ์กฐ๊ฑด๋ฌธ์ด ๋ง๊ณ ๋ณต์กํด์ง๋ ๊ฒฝ์ฐ(if-else ๋๋ switch-case๊ฐ ๋ง์ ๋)
โ ์ธ์ ํผํด์ผ ํ ๊น?
- ์๊ณ ๋ฆฌ์ฆ์ด ๊ฑฐ์ ๋ณ๊ฒฝ๋์ง ์์ ๋
- ์๊ณ ๋ฆฌ์ฆ์ด ๋จ์ํ์ฌ ์บก์ํํ ํ์๊ฐ ์์ ๋
- ์ ๋ต์ ์๊ฐ ๋๋ฌด ๋ง์์ ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง ๋
- ์ฑ๋ฅ์ด ์ค์ํ ๊ฒฝ์ฐ(์ถ๊ฐ์ ์ธ ๊ฐ์ฒด ์์ฑ์ผ๋ก ์ธํ ์ค๋ฒํค๋)
๐ ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด๊ณผ ๋น๊ต
ํญ๋ชฉ | ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด | ์ ๋ต ํจํด |
๊ตฌํ ๋ฐฉ์ | ์์์ ํตํด ๊ตฌํ | ํฉ์ฑ(composition)์ ํตํด ๊ตฌํ |
์๊ณ ๋ฆฌ์ฆ ๊ต์ฒด | ์ปดํ์ผ ํ์์ ๊ฒฐ์ | ๋ฐํ์์ ๋์ ์ผ๋ก ๊ต์ฒด ๊ฐ๋ฅ |
๊ตฌ์กฐ | ์์ ํด๋์ค๊ฐ ์๊ณ ๋ฆฌ์ฆ ๊ณจ๊ฒฉ ์ ์ | ์ธํฐํ์ด์ค๋ฅผ ํตํด ์๊ณ ๋ฆฌ์ฆ ์บก์ํ |
์ฝ๋ ์ฌ์ฌ์ฉ | ์์ ํด๋์ค ์ฝ๋ ์ฌ์ฌ์ฉ | ์๊ณ ๋ฆฌ์ฆ ํด๋์ค ์ฌ์ฌ์ฉ |
์ฃผ์ ๊ด๊ณ | ๋ถ๋ชจ-์์ ๊ด๊ณ(is-a) | ์ธํฐํ์ด์ค-๊ตฌํ ๊ด๊ณ(has-a) |
์ ์ฐ์ฑ | ์๋์ ์ผ๋ก ๋ฎ์ | ๋์(์คํ ์ค ๊ต์ฒด ๊ฐ๋ฅ) |
ํ์ฅ์ฑ | ํ์ ํด๋์ค ์ถ๊ฐ๋ก ํ์ฅ | ์๋ก์ด ์ ๋ต ํด๋์ค ์ถ๊ฐ๋ก ํ์ฅ |