πŸ‘₯ ν”„λ‘μ‹œ νŒ¨ν„΄(Proxy Pattern)

κΉ€μ„ ν˜ΈΒ·2022λ…„ 10μ›” 28일
0

λ””μžμΈ νŒ¨ν„΄

λͺ©λ‘ 보기
1/1
post-thumbnail

(이미지 좜처 : javatutorial.net)

λ“€μ–΄κ°€λ©°

κ³ μ‚¬μ–‘μ˜ 3Dκ²Œμž„μ„ ν”Œλ ˆμ΄ν•  λ–„ κ²Œμž„ 맡의 κ°€κΉŒμš΄ λ°°κ²½λΆ€ν„° λ‘œλ”© λœλ‹€κ±°λ‚˜, ν˜Ήμ€ μˆ˜κ°•μ‹ μ²­ μ‹œ λŒ€κΈ° 인원이 λͺ‡ λͺ… λ‚¨μ•˜λŠ”μ§€λ₯Ό ν™•μΈν•˜λ©° F5 λ₯Ό λˆ„λ₯ΌκΉŒ 말까 κ³ λ―Όν–ˆλ˜ κ²½ν—˜μ„ ν•˜κ³€ ν–ˆλ‹€.

μ΄λŸ¬ν•œ μƒν™©λ“€μ—λŠ” proxy κ°œλ…μ΄ λ…Ήμ•„μžˆλŠ”λ°, μ†Œν”„νŠΈμ›¨μ–΄ λ””μžμΈ νŒ¨ν„΄μ—λ„ μ΄λŸ¬ν•œ κ°œλ…μ„ ν™œμš©ν•˜λŠ” νŒ¨ν„΄μ΄ μžˆλ‹€. 였늘의 주인곡 ν”„λ‘μ‹œ νŒ¨ν„΄ 이 λ°”λ‘œ κ·Έ κ²½μš°μ΄λ‹€. 이 κΈ€μ—μ„œλŠ” λ¨Όμ € μš©μ–΄ proxy의 사전적 μ •μ˜λ₯Ό μ‚΄νŽ΄λ³΄κ³ , ν”„λ‘μ‹œ νŒ¨ν„΄μ„ μ™œ μ‚¬μš© ν•˜λŠ”μ§€, μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ κ°€λ³κ²Œ ν›‘μ–΄λ³Έλ‹€.

ν”„λ‘μ‹œ?

(좜처: 넀이버 μ˜μ–΄μ‚¬μ „)

λ¨Όμ € μš©μ–΄λΆ€ν„° μ‚΄νŽ΄λ³΄μž. 사전에 λ‚˜μ™€μžˆλ“―μ΄, proxyλž€ μ–΄λ–€ 사물, μ‚¬λžŒμ˜ λŒ€λ¦¬ 역할을 ν•˜λŠ” 무언가(λ˜λŠ” μ‚¬λžŒ)λ₯Ό μ˜λ―Έν•œλ‹€.

λˆ„κ΅°κ°€λ₯Ό λ§Œλ‚˜μ•Όν•˜λŠ”λ°, κ·Έ μ‚¬λžŒμ˜ λΉ„μ„œ 뢄을 ν†΅ν•΄μ„œ λ¨Όμ € 연락을 μ·¨ν•΄μ•Όν•˜λŠ” κ²½μš°μ—λŠ” λΉ„μ„œ 뢄이 proxyκ°€ λœλ‹€.

μ†Œμ†‘μ„ 진행 쀑이라면 λ³€ν˜Έμ‚¬ 뢄이 λ‚΄ 법λ₯ μ  λŒ€λ¦¬μΈ, 즉 proxyκ°€ λœλ‹€. (λ“œλΌλ§ˆλ‚˜ μ˜ν™”μ—μ„œ β€˜λ‚΄ λ³€ν˜Έμ‚¬λ₯Ό ν†΅ν•΄μ„œ μ „λ‹¬ν•˜μ„Έμš”β€™ λ“±μ˜ λŒ€μ‚¬λ₯Ό μ‹¬μ‹¬μΉ˜ μ•Šκ²Œ μ°Ύμ•„λ³Ό 수 μžˆλ‹€.)

λ””μžμΈ νŒ¨ν„΄μ—μ„œ μ‚¬μš©λ˜λŠ” proxy λŠ” 사전적 μ •μ˜μ˜ 3번, 즉 β€˜μΈ‘μ •Β·κ³„μ‚°ν•˜λ €λŠ” λ‹€λ₯Έ 것을 λŒ€ν‘œν•˜λ„λ‘ μ΄μš©ν•˜λŠ” λŒ€μš©λ¬Όβ€™μ— 가깝닀고 λ³Ό 수 μžˆλŠ”λ°, λ‹€μŒμ˜ μ„€λͺ…κ³Ό μ˜ˆμ œλ“€μ„ 톡해 ν•„μžκ°€ μ™œ κ·Έλ ‡κ²Œ μƒκ°ν•˜κ²Œ λ˜μ—ˆλŠ”μ§€ μ˜κ²¬μ„ λ‚˜λˆ„κ³ μž ν•œλ‹€.

μ™œ μ‚¬μš©ν•˜λŠ”κ°€

직접 μ‚¬μš©ν•˜λŠ” 것은 λΆ€λ‹΄μŠ€λŸ½λ‹€.

(이미지 좜처: Refactoring.Guru)

μ—¬κΈ°, μ–΄λ§ˆμ–΄λ§ˆν•˜κ²Œ 데이터가 많고, 쿼리 μ‹œκ°„ λ˜ν•œ 맀우 κΈ΄ κ°€μƒμ˜ λ°μ΄ν„°λ² μ΄μŠ€(객체)λ₯Ό μ‚¬μš©ν•΄μ•Όν•œλ‹€κ³  κ°€μ •ν•˜μž. 이 DBκ°μ²΄λŠ” μš”μ²­λ°›μ€ 쿼리λ₯Ό μˆ˜ν–‰λ§Œ ν•˜κ³  λ‹€λ₯Έ μž‘μ—…μ€ μΌμ²΄ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, μš°λ¦¬λŠ” β€˜ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ μž‘μ—…μ΄ 잘 μˆ˜ν–‰λ˜κ³  μžˆλŠ”μ§€β€™, β€˜μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ 남은 μ‹œκ°„μ€ μ–Όλ§ˆμΈμ§€β€™λŠ” μ•Œ 길이 μ—†λ‹€. 심지어 μž‘μ—…μ„ μ™„λ£Œν•˜λŠ” 것 μžμ²΄λ„ λ§Žμ€ μ‹œκ°„μ„ ν•„μš”λ‘œ ν•˜λ‹ˆ 점차 이 DB객체λ₯Ό μ‚¬μš©ν•˜λŠ” 것쑰차 λΆ€λ‹΄μŠ€λŸ¬μ›Œμ§„λ‹€. 문득 이런 생각이 λ“ λ‹€. β€˜λ°μ΄ν„°λ² μ΄μŠ€(객체)λ₯Ό μˆ˜μ •ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ, μž‘μ—…μ˜ 진행상황 등을 μ•Œλ €μ£ΌλŠ” 객체가 있으면 μ°Έ 쒋을텐데...'라고 말이닀. 자, 이제 이λ₯Ό 해결해쀄 Proxy κ°€ λ“±μž₯ν•  μ°¨λ‘€λ‹€.

쀑간에 λˆ„κ°€ μžˆμ—ˆμœΌλ©΄β€¦

(이미지 좜처: Refactoring.Guru)

방금의 문제(’진행 쀑인 μž‘μ—… 상황을 μ•Œ 수 μ—†λ‹€.’ λ“±)λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ Proxy κ°€ λ“±μž₯ν•œλ‹€. 이 μΉœκ΅¬λŠ” μ›λž˜μ˜ DB객체λ₯Ό μˆ˜μ •ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ, λ‚΄κ°€ ν•„μš”ν•˜λ˜ κΈ°λŠ₯을 νƒ‘μž¬ν•œ 그런 이상적인 객체이닀. 이 μΉœκ΅¬λŠ” λ‚΄κ°€ μš”μ²­ν–ˆλ˜ β€˜μΏΌλ¦¬β€™ μž‘μ—…μ„ DBκ°μ²΄ν•œν…Œ β€˜λŒ€μ‹ β€™ μš”μ²­ν•˜κ³ , 쀑간 쀑간 μž‘μ—…μ΄ μ–΄λ–»κ²Œ μ§„ν–‰λ˜λŠ”μ§€, μž‘μ—…μ΄ μ™„λ£Œλ˜κΈ°κΉŒμ§€λŠ” μ‹œκ°„μ΄ μ–Όλ§ˆλ‚˜ λ‚¨μ•˜λŠ”μ§€ λ“±μ˜ 정보도 μ•Œλ €μ€€λ‹€. 객체에 λŒ€ν•œ μˆ˜μ • 없이, μž‘μ—…μ— λŒ€ν•œ μš”μ²­μ„ λŒ€μ‹  μ „λ‹¬ν•˜κ³ , λΆ€κ°€κΈ°λŠ₯ λ˜ν•œ κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€μ–΄μ£ΌλŠ” 것. 이것이 λ°”λ‘œ Proxy 객체λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ μ΄λ‹€.

ν”„λ‘μ‹œ νŒ¨ν„΄

νŠΉμ • 객체에 λŒ€ν•œ 접근을 μ œμ–΄ν•˜κ±°λ‚˜ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆλŠ” νŒ¨ν„΄
(좜처: ν—€λ“œνΌμŠ€νŠΈ λ””μžμΈνŒ¨ν„΄)

μ΄λ²ˆμ—λŠ” 이 Proxy λ₯Ό ν™œμš©ν•œ ν”„λ‘μ‹œ νŒ¨ν„΄ 을 μ•Œμ•„λ³΄μž.

ν”„λ‘μ‹œ νŒ¨ν„΄μ΄λž€, ν΄λΌμ΄μ–ΈνŠΈκ°€ μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” 객체(κΈ°λŠ₯)에 직접 μ ‘κ·Όν•˜λŠ” 것이 μ•„λ‹Œ, Proxy 객체λ₯Ό 톡해 μ ‘κ·Ό(μ‚¬μš©)ν•˜λŠ” νŒ¨ν„΄μ„ λ§ν•œλ‹€.

μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ 객체에 λŒ€ν•œ 접근을 μ œμ–΄ν•˜κ±°λ‚˜, 객체λ₯Ό 생성 μ‹œ λ§Žμ€ λΉ„μš©μ΄ λ“€μ–΄κ°„λ‹€λ©΄ 지연 μ΄ˆκΈ°ν™” λ₯Ό 톡해 μ›ν•˜λŠ” μ‹œμ μ— 객체λ₯Ό 생성할 μˆ˜λ„ μžˆλ‹€. κ·Έ 밖에도 μ‹€μ œλ‘œ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κΈ° μ „ μœ νš¨μ„±μ„ κ²€μ¦ν•œλ‹€κ±°λ‚˜ λ‘œκΉ…μ„ ν•˜λŠ” λ“±μ˜ 좔가적인 μž‘μ—…μ„ μ›λž˜ μ‚¬μš©ν•˜κ³ μž ν–ˆλ˜ 객체의 μž‘μ—… 이전/이후 에 ν•  수 μžˆκ²Œλœλ‹€. 즉, ν”„λ‘μ‹œ νŒ¨ν„΄ 은 μ•žμ„œ μ–ΈκΈ‰ν•œ Proxy 의 μž₯점을 살리기 μœ„ν•œ λ””μžμΈ νŒ¨ν„΄μ΄λ‹€. 이제, μ•„λž˜ 예제λ₯Ό λ³΄λ©΄μ„œ ν”„λ‘μ‹œ νŒ¨ν„΄μ„ κ°„λ‹¨νžˆ κ΅¬ν˜„ν•΄λ³΄μž.


ν”„λ‘μ‹œ νŒ¨ν„΄μ˜ κ΅¬ν˜„

사전 μ€€λΉ„

// Calculator μΈν„°νŽ˜μ΄μŠ€
public interface Calculator {

    int calculate();

}

// Calculator μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•˜λŠ” DefaultCalculator
public class DefaultCalculator implements  Calculator{

    @Override
    public int calculate() {
        return 0; // 이 '0' ν•˜λ‚˜λ₯Ό λ¦¬ν„΄ν•˜λŠ”λ° 무렀 10초의 μ‹œκ°„μ΄ κ±Έλ¦°λ‹€κ³  κ°€μ •ν•˜μž.
    }
}

// Calculater 객체의 caculate() κΈ°λŠ₯을 μ“°κ³  μ‹Άμ–΄ν•˜λŠ” Client
public class Client {

    public static void main(String[] args) {
        Calculator calculator = new DefaultCalculator();
        calculator.calculate();
    }
}

μ—¬κΈ°, 계산기 객체의 β€˜κ³„μ‚°β€™ κΈ°λŠ₯을 μ“°κ³  μ‹Άμ–΄ν•˜λŠ” ν•œ Clientκ°€ μžˆλ‹€. 그런데 계산 κΈ°λŠ₯을 κ΅¬ν˜„ν•΄μ•Όν•  κ°œλ°œμžκ°€ 게으λ₯Έ λ‚˜λ¨Έμ§€ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ›ν•˜λŠ” κ³„μ‚°κ³ΌλŠ” 관계없이 λͺ¨λ“  계산결과λ₯Ό 0으둜 λ°˜ν™˜ν•˜λŠ” 계산 κΈ°λŠ₯을 λ§Œλ“€κ³  λ§μ•˜λ‹€. 이보닀 더 μ΅œμ•…μΈ 것은 이 κ³„μ‚°κΈ°λŠ” ν•œ 번 계산할 λ•Œ 무렀 10μ΄ˆμ”©μ΄λ‚˜ κ±Έλ¦°λ‹€λŠ” 것이닀. (정말 μ–΄μ²˜κ΅¬λ‹ˆ μ—†λŠ” μƒν™©μ΄κΈ°λŠ” ν•˜λ‹€.)

ClientλŠ” 이제 μ˜λ¬Έλ„ λͺ¨λ₯Έ 채, 계산기λŠ₯을 μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ 10μ΄ˆμ”©μ΄λ‚˜ κ²¬λŽŒμ•Όν•˜λŠ” λ”μ°ν•œ κ²½ν—˜μ„ ν•  것이닀. 이 Clientλ₯Ό μœ„ν•΄μ„œ 계산 μ™„λ£ŒκΉŒμ§€ 남은 μ˜ˆμƒ μ‹œκ°„μ„ μ•Œλ €μ£ΌλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄μž. λ¬Όλ‘ , 이미 μž‘μ„±ν•œ 계산기 μ½”λ“œλŠ” 일체 μˆ˜μ •ν•˜μ§€ μ•Šμ€ μƒνƒœλ‘œ 말이닀.


Proxy 클래슀λ₯Ό λ§Œλ“€κ³ , μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ 레퍼런슀λ₯Ό μ„ μ–Έν•˜μž

Proxy 클래슀λ₯Ό λ§Œλ“€μž.

public class DefaultCalculatorProxy implements Calculator {

    @Override
    public int calculate() {

    }
}

첫 λ‹¨κ³„λŠ” 기쑴의 μ„œλΉ„μŠ€ 객체와 같은 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•˜λŠ” Proxy 클래슀λ₯Ό λ§Œλ“œλŠ” 것이닀. 이제 (μ•½κ°„μ˜ μž‘μ—…λ§Œ λ”ν•˜λ©΄) 이 DefaultCalculatorProxy κ°μ²΄λŠ” 기쑴의 DefaultCalculator λ₯Ό μ™„μ „νžˆ λŒ€μ²΄ν•  수 μžˆλ‹€.


μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ 레퍼런슀λ₯Ό μ„ μ–Έν•˜κ³ , μ›λž˜μ˜ μ„œλΉ„μŠ€ 객체λ₯Ό μ°Έμ‘°ν•œλ‹€.

public class DefaultCalculatorProxy implements Calculator {

    private Calculator calculator;

    public DefaultCalculatorProxy(Calculator calculator) {
        this.calculator = calculator;
    }

    @Override
    public int calculate() {
        System.out.println("믿을 수 μ—†κ² μ§€λ§Œ, 계산이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ 10초 λ‚¨μ•˜μŠ΅λ‹ˆλ‹€.");

        int calculationResult = calculator.calculate(); // DefaultCalculatorμ—κ²Œ 계산을 μš”μ²­ν•œλ‹€.

        System.out.println("계산이 μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.");
        return calculationResult;
    }
}

// DefaultCalculatorProxyκ°€ DefaultCalculatorλ₯Ό μ°Έμ‘°ν•  수 있게 Client μ½”λ“œλ₯Ό μ•½κ°„ μˆ˜μ •ν•œλ‹€. 
public class Client {

    public static void main(String[] args) {
        Calculator calculator = new DefaultCalculatorProxy(new DefaultCalculator());
        calculator.calculate();
    }
}

λ‹€μŒ λ‹¨κ³„λ‘œ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ 레퍼런슀λ₯Ό μ„ μ–Έν•˜κ³ , 이 λ ˆνΌλŸ°μŠ€κ°€ μ›λž˜ μ„œλΉ„μŠ€ 객체인 DefaultCalculator λ₯Ό μ°Έμ‘°ν•  수 있게 ν•œλ‹€. 이어 클래슀 내뢀에 ν•„μš”ν•œ κΈ°λŠ₯듀을 더 μΆ”κ°€ν•΄μ€ŒμœΌλ‘œμ¨ Proxy 클래슀λ₯Ό μ™„μ„±ν•œλ‹€. 이둜써 기쑴의 계산기 μ½”λ“œλŠ” μˆ˜μ •ν•˜μ§€ μ•Šμ€ μ±„λ‘œ 기쑴의 μ„œλΉ„μŠ€ 객체λ₯Ό μ™„μ „νžˆ λŒ€μ²΄ν•˜λŠ” Proxy κ°€ νƒ„μƒν•˜μ˜€λ‹€.(μ΄λŠ” 객체 지ν–₯ 섀계 5원칙 쀑 ν•˜λ‚˜μΈ OCPλ₯Ό μžμ—°μŠ€λŸ½κ²Œ λ§Œμ‘±ν•œλ‹€.)


객체λ₯Ό μƒμ„±ν•˜λŠ” λΉ„μš©μ΄ 크닀면

μœ„μ—μ„œ Proxy 객체가 기쑴의 μ„œλΉ„μŠ€ 객체λ₯Ό μ™„μ „νžˆ λŒ€μ²΄ν•˜λŠ” 것을 확인할 수 μžˆμ—ˆλ‹€. 그런데 μ„œλΉ„μŠ€ 객체λ₯Ό 생성할 λ•Œμ˜ λΉ„μš©μ΄ λΉ„μ‹Έλ‹€λ©΄ μ–΄λ–»κ²Œ ν•  것인가? λΉ„μš©μ΄ λΉ„μ‹Ό 객체λ₯Ό ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œλ§ˆλ‹€ μƒμ„±ν•˜λŠ” 것은 λΆ€λ‹΄μŠ€λŸ½λ‹€. 지연 μ΄ˆκΈ°ν™” λ₯Ό μ΄μš©ν•˜μ—¬ 이 문제λ₯Ό ν•΄κ²°ν•΄λ³΄μž.

public class DefaultCalculatorProxy implements Calculator {

    private Calculator calculator;

    @Override
    public int calculate() {
        System.out.println("믿을 수 μ—†κ² μ§€λ§Œ, 계산이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ 10초 λ‚¨μ•˜μŠ΅λ‹ˆλ‹€.");

        // 지연 μ΄ˆκΈ°ν™”(lazy initialization)
        if (calculator == null) {
            calculator = new DefaultCalculator();
        }
        int calculationResult = calculator.calculate(); // DefaultCalculatorμ—κ²Œ 계산을 μš”μ²­ν•œλ‹€.

        System.out.println("계산이 μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.");
        return calculationResult;
    }
}

Proxy 객체의 레퍼런슀 ν•„λ“œκ°€ κ°€λ¦¬ν‚€λŠ” 값이 없을 λ•Œ μ„œλΉ„μŠ€ 객체λ₯Ό μƒμ„±ν•΄μ€ŒμœΌλ‘œμ¨, 이전 λ³΄λ‹€λŠ” 쑰금 덜 λΆ€λ‹΄μŠ€λŸ½κ²Œ 계산 κΈ°λŠ₯을 μ΄μš©ν•  수 있게 λ˜μ—ˆλ‹€. λ˜ν•œ 더 이상 μƒμ„±μžλ₯Ό 톡해 μ„œλΉ„μŠ€ 객체λ₯Ό μ£Όμž…λ°›μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ, μƒμ„±μžλ₯Ό μ œκ±°ν•˜μ˜€λ‹€.


μž₯단점

λ¬Όλ‘  ν”„λ‘μ‹œ νŒ¨ν„΄ 에도 μž₯점과 단점이 κ³΅μ‘΄ν•œλ‹€. λ¨Όμ € μž₯점은 λ‹€μŒκ³Ό κ°™λ‹€.

μž₯점

  • SOLID 원칙 쀑 OCP 와 SRP λ₯Ό λ§Œμ‘±ν•œλ‹€.
    • μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€(ν™•μž₯)ν•˜μ§€λ§Œ κΈ°μ‘΄ μ„œλΉ„μŠ€ 객체의 변경은 μ—†μ—ˆλ‹€(변경에 λŒ€ν•΄ λ‹«ν˜€μžˆλ‹€). ➑ OCP
    • Proxy 객체λ₯Ό λ”°λ‘œ λ‘ μœΌλ‘œμ¨, κΈ°μ‘΄ μ„œλΉ„μŠ€ 객체 DefaultCalculator의 μ±…μž„μ€ κ·ΈλŒ€λ‘œ μœ μ§€ν•˜μ˜€λ‹€. ➑ SRP
  • 지연 μ΄ˆκΈ°ν™” λ₯Ό μ΄μš©ν•˜κ±°λ‚˜, λ‹€μ–‘ν•œ λΆ€κ°€κΈ°λŠ₯(μœ νš¨μ„± 검증, λ‘œκΉ… λ“±)을 μΆ”κ°€ν•¨μœΌλ‘œμ¨ μœ μ—°ν•œ 섀계가 κ°€λŠ₯해진닀.

단점

  • (기쑴의 ν΄λž˜μŠ€κ°€ λ‹¨μˆœν•  수둝) μƒˆλ‘œμš΄ 클래슀λ₯Ό 많이 μΆ”κ°€ν•΄μ•Όν•˜λ―€λ‘œ, μ½”λ“œμ˜ λ³΅μž‘λ„κ°€ λ†’μ•„μ§ˆ 수 μžˆλ‹€.
    • μ„œλΉ„μŠ€μ˜ 응닡이 느렀질 수 μžˆλ‹€.

마치며

ν”„λ‘μ‹œ νŒ¨ν„΄μ€ κΈ°μ‘΄ μ„œλΉ„μŠ€ μ½”λ“œλŠ” λ³€κ²½ν•˜μ§€ μ•Šμ€ μ±„λ‘œ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆλ‹€λ³΄λ‹ˆ λ³΄μ•ˆ , λ‘œκΉ… , μœ νš¨μ„± 검증 λ“± λ‹€μ–‘ν•œ κΈ°λŠ₯을 Proxy 객체λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•  μˆ˜λ„ μžˆλ‹€. Java의 λ‹€μ΄λ‚˜λ―Ή ν”„λ‘μ‹œ, Spring AOP μ—μ„œλ„ ν”„λ‘μ‹œ νŒ¨ν„΄ 을 μ°Ύμ•„λ³Ό 수 있으며, 이에 λŒ€ν•΄μ„œλŠ” μΆ”ν›„ λ‹€λ₯Έ ν¬μŠ€νŒ…μ—μ„œ μ‹¬λ„μžˆκ²Œ 닀뀄보도둝 ν•˜κ² λ‹€.


더 곡뢀해야할 것

  • 지연 μ΄ˆκΈ°ν™”
  • λ‹€μ΄λ‚˜λ―Ή ν”„λ‘μ‹œ
  • μŠ€ν”„λ§ AOP

μ°Έκ³ 

[Design Pattern] ν”„λ‘μ‹œ νŒ¨ν„΄(Proxy Pattern)에 λŒ€ν•˜μ—¬
μ½”λ”©μœΌλ‘œ ν•™μŠ΅ν•˜λŠ” GoF의 λ””μžμΈ νŒ¨ν„΄ - μΈν”„λŸ° | κ°•μ˜
Proxy - Refactoring.Guru
ν—€λ“œ 퍼슀트 λ””μžμΈ νŒ¨ν„΄

λΆ€μ‘±ν•œ κΈ€ μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. ν‹€λ¦° κ°œλ…μ΄λ‚˜ μš©μ–΄κ°€ μžˆλ‹€λ©΄ μ–Έμ œλ“ μ§€ λŒ“κΈ€λ‘œ λ‚¨κ²¨μ£Όμ„Έμš”πŸ™. κ°μ‚¬ν•©λ‹ˆλ‹€.

profile
Every Run, Learn Counts.

0개의 λŒ“κΈ€