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

ํ”„๋ก์‹œ ํŒจํ„ด์ด๋ž€?

์–ด๋–ค ๊ฐ์ฒด ์•ž์— ๋Œ€๋ฆฌ์ธ(proxy) ์„ ํ•˜๋‚˜ ๋‘๊ณ ,
๊ทธ ๊ฐ์ฒด์˜ ์‹คํ–‰ ์ „ํ›„์— ๋‹ค๋ฅธ ํ–‰๋™์„ ๋ง๋ถ™์ด๋Š” ๊ตฌ์กฐ

์‹ค๋ฌด ๋น„์œ 

  • ์นด์นด์˜คํŽ˜์ด์— ๊ฒฐ์ œ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค
  • ๊ทธ๋Ÿฐ๋ฐ ๊ทธ ์š”์ฒญ์€ ์นด์นด์˜ค API๋กœ ๋ฐ”๋กœ ๊ฐ€์ง€ ์•Š๊ณ ,
    ์ค‘๊ฐ„์—์„œ “ํ”„๋ก์‹œ ์„œ๋ฒ„”๊ฐ€ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ๊ฒ€์ฆํ•œ ๋’ค ์นด์นด์˜ค์— ๋„˜๊ฒจ์คŒ

์ด ํ”„๋ก์‹œ๊ฐ€ ๋ฐ”๋กœ ์ค‘๊ฐ„์—์„œ ๋Œ€์‹  ์ผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ฐ์ฒด

 

์˜ˆ์ œ: ๋กœ๊ทธ๋ฅผ ์ž๋™์œผ๋กœ ๋‚จ๊ธฐ๋Š” ํ”„๋ก์‹œ ํŒจํ„ด

 

1. ์ง„์งœ ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค

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

 

2.์‹ค์ œ ๊ตฌํ˜„์ฒด

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

 

3.ํ”„๋ก์‹œ ํด๋ž˜์Šค

public class PayServiceProxy implements PayService {

    private final PayService target;

    public PayServiceProxy(PayService target) {
        this.target = target;
    }

    public void pay(int amount) {
        System.out.println("[ํ”„๋ก์‹œ] ๊ฒฐ์ œ ์š”์ฒญ ๋กœ๊ทธ ์‹œ์ž‘");
        target.pay(amount); // ์‹ค์ œ ๊ฐ์ฒด ํ˜ธ์ถœ
        System.out.println("[ํ”„๋ก์‹œ] ๊ฒฐ์ œ ์š”์ฒญ ๋กœ๊ทธ ๋");
    }
}

 

4.์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ

public class Main {
    public static void main(String[] args) {
        PayService realService = new KakaoPayService();
        PayService proxy = new PayServiceProxy(realService);

        proxy.pay(1000);
    }
}

 

๊ฒฐ๊ณผ

[ํ”„๋ก์‹œ] ๊ฒฐ์ œ ์š”์ฒญ ๋กœ๊ทธ ์‹œ์ž‘
์นด์นด์˜คํŽ˜์ด๋กœ 1000์› ๊ฒฐ์ œ
[ํ”„๋ก์‹œ] ๊ฒฐ์ œ ์š”์ฒญ ๋กœ๊ทธ ๋

 

์ด๊ฑธ Spring์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์“ธ๊นŒ?

๋ฐ”๋กœ๋ฐ”๋กœ AOP (Aspect-Oriented Programming) ๊ตฌ์กฐ์— ๋…น์•„ ์žˆ๋‹ค.

 

๋Œ€ํ‘œ์ ์ธ ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜ ๊ธฐ๋Šฅ๋“ค

์–ด๋…ธํ…Œ์ด์…˜ ์„ค๋ช…
@Transactional ํŠธ๋žœ์žญ์…˜ ํ”„๋ก์‹œ๊ฐ€ ๊ฐ์‹ธ์„œ begin/commit ์ฒ˜๋ฆฌ
@Cacheable ์บ์‹œ ํ”„๋ก์‹œ๊ฐ€ ๊ฐ์‹ธ์„œ ๊ฒฐ๊ณผ ์ €์žฅ
@Secured ๋ณด์•ˆ ์ฒดํฌ ํ”„๋ก์‹œ
@LogExecutionTime (์ปค์Šคํ…€ AOP ์˜ˆ์ œ๋„ ๊ฐ€๋Šฅ) ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ • ํ”„๋ก์‹œ

 

์˜ˆ) @Transactional๋„ ์‚ฌ์‹ค ํ”„๋ก์‹œ๋‹ค!

@Service
public class OrderService {
    @Transactional
    public void placeOrder() {
        // ์ด ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ „ํ›„๋กœ ํ”„๋ก์‹œ๊ฐ€ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌํ•ด์คŒ
    }
}

 

ํ”„๋ก์‹œ ํŒจํ„ด ์ •๋ฆฌ

  • ๋ชฉ์  : ์‹คํ–‰ ์ „/ํ›„์— ๋ถ€๊ฐ€๊ธฐ๋Šฅ ๋ผ์›Œ๋„ฃ๊ธฐ
  • ๊ตฌ์กฐ : ์‹ค์ œ ๊ฐ์ฒด๋ฅผ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ๊ฐ์‹ธ์„œ ๋Œ€์‹  ํ˜ธ์ถœ
  • ์Šคํ”„๋ง ์ ์šฉ : ํŠธ๋žœ์žญ์…˜, ๋กœ๊น…, ์บ์‹ฑ, ๋ณด์•ˆ ๋“ฑ AOP ๊ธฐ๋Šฅ์ด ์ „๋ถ€ ํ”„๋ก์‹œ ๊ธฐ๋ฐ˜

 

๋ฐ˜์‘ํ˜•