(μ΄λ―Έμ§ μΆμ² : 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λ₯Ό μν΄μ κ³μ° μλ£κΉμ§ λ¨μ μμ μκ°μ μλ €μ£Όλ μ½λλ₯Ό μμ±ν΄λ³΄μ. λ¬Όλ‘ , μ΄λ―Έ μμ±ν κ³μ°κΈ° μ½λλ μΌμ²΄ μμ νμ§ μμ μνλ‘ λ§μ΄λ€.
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
ν€λ νΌμ€νΈ λμμΈ ν¨ν΄
λΆμ‘±ν κΈ μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€. νλ¦° κ°λ μ΄λ μ©μ΄κ° μλ€λ©΄ μΈμ λ μ§ λκΈλ‘ λ¨κ²¨μ£ΌμΈμπ. κ°μ¬ν©λλ€.