๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

์ „๋žต ํŒจํ„ด์ด๋ž€?

๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ๋ฐฉ์‹(์ „๋žต)์œผ๋กœ ๊ตฌํ˜„ํ•ด๋‘๊ณ ,
์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํŒจํ„ด

์‹ค๋ฌด ๋น„์œ 

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒฐ์ œ ์„œ๋น„์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

 

  • ์นด์นด์˜คํŽ˜์ด ๊ฒฐ์ œ
  • ๋„ค์ด๋ฒ„ํŽ˜์ด ๊ฒฐ์ œ
  • Toss ๊ฒฐ์ œ

์ „๋žต๋งˆ๋‹ค ๊ตฌํ˜„์ด ๋‹ค๋ฅด์ง€๋งŒ, ์‚ฌ์šฉ์ž๋Š” “๊ฒฐ์ œํ•œ๋‹ค”๋Š” ๊ธฐ๋Šฅ๋งŒ ์š”์ฒญํ•˜๋ฉด ๋œ๋‹ค.

 

Spring Boot์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์ ์šฉ๋จ

 

1. ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜

public interface PayStrategy {
    void pay(int amount);
}

 

 

2.์ „๋žต ๊ตฌํ˜„์ฒด ๋งŒ๋“ค๊ธฐ

@Component("kakaoPay")
public class KakaoPayStrategy implements PayStrategy {
    public void pay(int amount) {
        System.out.println("์นด์นด์˜คํŽ˜์ด๋กœ " + amount + "์› ๊ฒฐ์ œ");
    }
}

@Component("naverPay")
public class NaverPayStrategy implements PayStrategy {
    public void pay(int amount) {
        System.out.println("๋„ค์ด๋ฒ„ํŽ˜์ด๋กœ " + amount + "์› ๊ฒฐ์ œ");
    }
}

 

3.์ฃผ์ž… ๋ฐ›์•„์„œ ์‹คํ–‰

@Service
public class PayService {
    private final Map<String, PayStrategy> strategyMap;

    public PayService(Map<String, PayStrategy> strategyMap) {
        this.strategyMap = strategyMap;
    }

    public void pay(String method, int amount) {
        PayStrategy strategy = strategyMap.get(method);
        if (strategy != null) strategy.pay(amount);
        else throw new IllegalArgumentException("์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฐ์ œ ๋ฐฉ์‹: " + method);
    }
}

 

4.์ปจํŠธ๋กค๋Ÿฌ์—์„œ ํ˜ธ์ถœ

@RestController
@RequiredArgsConstructor
public class PayController {
    private final PayService payService;

    @PostMapping("/pay")
    public void pay(@RequestParam String method, @RequestParam int amount) {
        payService.pay(method, amount);
    }
}

 

์‹คํ–‰ ์˜ˆ์‹œ

POST /pay?method=kakaoPay&amount=1000
→ ์นด์นด์˜คํŽ˜์ด๋กœ 1000์› ๊ฒฐ์ œ

POST /pay?method=naverPay&amount=2000
→ ๋„ค์ด๋ฒ„ํŽ˜์ด๋กœ 2000์› ๊ฒฐ์ œ

 

Spring์ด ์ „๋žต ํŒจํ„ด์„ ๋” ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์ด์œ 

๊ธฐ๋Šฅ ์„ค๋ช…
@Component ์ž๋™์œผ๋กœ Bean ๋“ฑ๋ก (์ „๋žต ๊ตฌํ˜„์ฒด ์‰ฝ๊ฒŒ ๋“ฑ๋ก๋จ)
Map<String, Interface> ์ฃผ์ž… ์ „๋žต ์ด๋ฆ„ ↔ ์ „๋žต ๊ฐ์ฒด ์—ฐ๊ฒฐ ์ž๋™ ์ฒ˜๋ฆฌ๋จ
DI + IoC ์œ ์—ฐํ•œ ํ™•์žฅ ๊ฐ€๋Šฅ (์ƒˆ ์ „๋žต ์ถ”๊ฐ€๋งŒ ํ•˜๋ฉด ๋)

 

์ฃผ์˜ํ•  ์ 

  • ์ „๋žต ์ด๋ฆ„(@Component("kakaoPay"))์„ ์‹ค์ˆ˜ํ•˜๋ฉด ์ฃผ์ž… ์•ˆ ๋จ
  • strategyMap.get(...)์— ๋ฐฉ์–ด ๋กœ์ง ํ•„์ˆ˜
  • ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๋ฉด ์˜คํžˆ๋ ค ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›Œ์ง
์ „๋žต ํŒจํ„ด์€ “๋กœ์ง์„ ๊ฐˆ์•„ ๋ผ์šฐ๋Š” ์„ค๊ณ„”
์Šคํ”„๋ง์—์„œ๋Š” Map<String, ์ „๋žต>๋งŒ ๋ฐ›์•„๋„ ๋ฐ”๋กœ ์ „๋žต ํŒจํ„ด์ด ๋œ๋‹ค!

 

๋ฐ˜์‘ํ˜•