๋ฐฑ์—”๋“œ(Back-End) ๊ฐœ๋ฐœ/Java

[JAVA] ๋””์ž์ธ ํŒจํ„ด - ์ „๋žต ํŒจํ„ด (Strategy)

rabo93 2025. 5. 28. 13:23

์ „๋žต ํŒจํ„ด (Strategy)

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์œ ์—ฐํ•˜๊ฒŒ ๊ต์ฒด ๊ฐ€๋Šฅ
// ์ „๋žต ํŒจํ„ด
// => ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ์•Œ๊ณ ๋ฆฌ์ฆ˜(์ „๋žต)์„ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์คŒ
// => Spring์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋“ค์„ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  Map์œผ๋กœ ์ฃผ์ž…๋ฐ›์•„ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌ


// ๊ฒฐ์ œ๋ฐฉ์‹ ์„ ํƒ ์˜ˆ์ œ
// 1. ์ „๋žต ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜
public interface PaymentStrategy {
	void pay(int amount);
}

// 2. ์ „๋žต ๊ตฌํ˜„์ฒด๋“ค (@Component๋กœ Bean๋“ฑ๋ก)
@Component("card") // key๊ฐ’์ด ๋œ๋‹ค (Map ์ฃผ์ž… ์‹œ)
class CardPayment implements PaymentStrategy {
	public void pay(int amount) {
		System.out.println("Card๋กœ " + amount + "์› ๊ฒฐ์ œ");
	}
}

@Component("Kakao")
class KakaoPay implements PaymentStrategy {
	public void pay(int amount) {
		System.out.println("Kakao pay๋กœ " + amount + "์› ๊ฒฐ์ œ");
	}
}
// 3. ์ „๋žต์„ map์œผ๋กœ ์ฃผ์ž…๋ฐ›์•„ ๋™์ ์œผ๋กœ ์‚ฌ์šฉ
@Service
public class PaymentService {
	//์˜์กด์„ฑ ์ถ”๊ฐ€
	private final Map<String, PaymentStrategy> strategyMap;
	
	// ๋ชจ๋“  PaymanetStrategy Bean์ด ์ฃผ์ž…๋จ (key = @Component("name"))
	public PaymentService(Map<String, PaymentStrategy> strategyMap) {
		this.strategyMap = strategyMap;
	}
	
	public void pay(String method, int amount) {
		PaymentStrategy strategy = strategyMap.get(method); // ex: "card", "kakao"
		strategy.pay(amount); // ์ „๋žต์— ๋”ฐ๋ผ ์‹คํ–‰
	}
}
@RestController
public class PaymentController {
	// ์˜์กด์„ฑ ์ถ”๊ฐ€
	private final PaymentService paymentService;
	
	public PaymentController(PaymentService paymentService) {
		this.paymentService = paymentService;
	}	
	
	// ex) /pay?method=card&amount=10000
	@PostMapping("/pay")
	public String pay(@RequestParam String method, @RequestParam int amount) {
		paymentService.pay(method, amount);
		return "๊ฒฐ์ œ์™„๋ฃŒ";
	}
	
}