π‘ νλ‘μ ν¨ν΄μ΄λ?
λμ μλ³Έ κ°μ²΄λ₯Ό λ리νμ¬ λμ μ²λ¦¬νκ² ν¨μΌλ‘μ¨ λ‘μ§μ νλ¦μ μ μ΄νλ νλ ν¨ν΄μ λλ€. “νλ‘μ”μ μ¬μ μ μΈ μλ―ΈμΈ ‘λ리츒μ²λΌ, ν΄λΌμ΄μΈνΈκ° λμ κ°μ²΄λ₯Ό μ§μ μ¬μ©νλ κ² μλλΌ μ€κ°μ νλ‘μ(λ리μΈ)μ κ±°μ³μ μ¬μ©νλ μ½λ ν¨ν΄μ λλ€.
λ°λΌμ λμ κ°μ²΄(Subject)μ λ©μλλ₯Ό μ§μ μ€ννλ κ²μ΄ μλ, λμ κ°μ²΄μ μ κ·ΌνκΈ° μ μ νλ‘μ(Proxy) κ°μ²΄μ λ©μλλ₯Ό μ κ·Όν ν μΆκ°μ μΈ λ‘μ§μ μ²λ¦¬νλ€ μ κ·Όνκ² λ©λλ€. νλ‘μλ μ€μ κ°μ²΄μ μ‘μΈμ€νμ§ μκ³ , μ μμ λλ λΉμ μμ μΈ λ©μμ§λ₯Ό μ²λ¦¬ν μ μκ²λ ν©λλ€.
π‘ νλ‘μ ν¨ν΄μ μ°λ μ΄μ
νλ‘μ ν¨ν΄μ λμ ν΄λμ€κ° λ―Όκ°ν μ 보λ₯Ό κ°μ§κ³ μκ±°λ μΈμ€ν΄μ€ν νκΈ°μ 무κ²κ±°λ μΆκ° κΈ°λ₯μ κ°λ―Ένκ³ μΆμλ°, μλ³Έ κ°μ²΄λ₯Ό μμ ν μ μλ μν©μΌ λ μ¬μ©ν©λλ€.
- 보μ(Security) : νλ‘μλ ν΄λΌμ΄μΈνΈκ° μμ μ μνν μ μλ κΆνμ΄ μλμ§ νμΈνκ³ κ²μ¬ κ²°κ³Όκ° κΈμ μ μΈ κ²½μ°μλ§ μμ²μ λμμΌλ‘ μ λ¬ν©λλ€.
- μΊμ±(Caching) : νλ‘μκ° λ΄λΆ μΊμλ₯Ό μ μ§νμ¬ λ°μ΄ν°κ° μΊμμ μμ§ μ‘΄μ¬νμ§ μλ κ²½μ°μλ§ λμμμ μμ μ΄ μ€νλλλ‘ ν©λλ€.
- λ°μ΄ν° μ ν¨μ± κ²μ¬(Data validation) : νλ‘μκ° μ λ ₯μ λμμΌλ‘ μ λ¬νκΈ° μ μ μ ν¨μ±μ κ²μ¬ν©λλ€.
- μ§μ° μ΄κΈ°ν(Lazy initialization) : λμμ μμ± λΉμ©μ΄ λΉμΈλ€λ©΄ νλ‘μλ κ·Έκ²μ νμλ‘ ν λκΉμ§ μ°κΈ°ν μ μμ΅λλ€.
- λ‘κΉ (Logging) : νλ‘μλ λ©μλ νΈμΆκ³Ό μλ λ§€κ° λ³μλ₯Ό μΈν°μ νΈνκ³ μ΄λ₯Ό κΈ°λ‘ν©λλ€.
- μ격 κ°μ²΄(Remote objects) : νλ‘μλ μ격 μμΉμ μλ κ°μ²΄λ₯Ό κ°μ Έμμ λ‘컬μ²λΌ 보μ΄κ² ν μ μμ΅λλ€.
π‘ ν΄λμ€ λ€μ΄μ΄κ·Έλ¨μΌλ‘ λ³Έ νλ‘μ ν¨ν΄
- Subject(Service Interface) : νλ‘μ κ°μ²΄μ μλΉμ€ κ°μ²΄λ₯Ό νλλ‘ λ¬Άλ μΈν°νμ΄μ€λ‘, ν΄λΌμ΄μΈνΈκ° νλ‘μμ μλΉμ€μ μ°¨μ΄λ₯Ό μμνμ§ μμλ λλ€. λμ κ°μ²΄μ νλ‘μ μν μ λμΌνκ² νλ μΆμ λ©μλ operation() λ₯Ό μ μνλ€. νλ‘μκ° μλΉμ€ κ°μ²΄λ‘ μμ₯ν μ μμΌλ €λ©΄ μ΄ μΈν°νμ΄μ€λ₯Ό λ°λΌμΌ νλ€.
- Real Subject(Service) : μλ³Έ λμ κ°μ²΄
- Proxy : λμ κ°μ²΄λ₯Ό μ€κ³νλ λ리μ κ°μ²΄λ‘, λμ κ°μ²΄λ₯Ό ν©μ±(composition)νλ€. μλΉμ€ κ°μ²΄λ€μ μ 체 μλͺ μ£ΌκΈ°λ₯Ό κ΄λ¦¬νμ§λ§, νλ¦ μ μ΄λ§ ν λΏ κ²°κ³Όκ°μ μ‘°μνκ±°λ λ³κ²½μν€λ©΄ μλλ€.
- Client : μΈν°νμ΄μ€λ₯Ό μ΄μ©νμ¬ νλ‘μ κ°μ²΄λ₯Ό μμ±ν΄ μ΄μ©νλ€.
π‘ νλ‘μ ν¨ν΄ ꡬν
interface ISubject {
void operation();
}
class RealSubject implements ISubject {
public void operation() {
System.out.println("μλ³Έ κ°μ²΄ μ‘μ
!!");
}
}
class Proxy implements ISubject {
private RealSubject subject; // λμ κ°μ²΄λ₯Ό composition
boolean access; // μ κ·Ό κΆνμΌλ‘ λ³΄νΈ κ°λ₯
Proxy(RealSubject subject, boolean access) {
this.subject = subject;
this.access = access;
}
public void operation() {
// 1. λ‘κΉ
κΈ°λ₯ μΆκ°
// 2. μ κ·Ό κΆνμΌλ‘ λ³΄νΈ κΈ°λ₯ μΆκ°
if(!access) {
System.out.println("μ κ·Ό κΆν μλ¬!"); return;
}
// 3. μ§μ° μ΄κΈ°ν κΈ°λ₯ μΆκ°
if(subject == null){
subject = new RealSubject();
}
subject.operation(); // μμ
/* do something */
System.out.println("νλ‘μ κ°μ²΄ μ‘μ
!!");
}
}
class Client {
public static void main(String[] args) {
ISubject sub = new Proxy(new RealSubject());
sub.operation();
}
}
π‘ λ§λ¬΄λ¦¬
νλ‘μ ν¨ν΄μ
- μ κ·Όμ μ μ΄νκ±°κ° κΈ°λ₯μ μΆκ°νκ³ μΆμλ°, κΈ°μ‘΄μ νΉμ κ°μ²΄λ₯Ό μμ ν μ μλ μν©μΌ λ
- μ΄κΈ°ν μ§μ°, μ κ·Ό μ μ΄, λ‘κΉ , μΊμ± λ±, κΈ°μ‘΄ κ°μ²΄ λμμ μμ μμ΄ κ°λ―Ένκ³ μΆμ λ
μ μ¬μ©ν μ μμ΅λλ€.
νλ‘μ ν¨ν΄μ μ¬μ©νλ©΄ κΈ°μ‘΄ λμ κ°μ²΄μ μ½λλ₯Ό λ³κ²½νμ§ μκ³ μλ‘μ΄ κΈ°λ₯μ μΆκ°ν μ μκ³ (OCP μ€μ), λμ κ°μ²΄λ μμ μ κΈ°λ₯μλ§ μ§μ€ νκ³ , κ·Έ μ΄μΈ λΆκ° κΈ°λ₯μ μ 곡νλ μν μ νλ‘μ κ°μ²΄μ μμνμ¬ λ€μ€ μ± μμ ννΌ ν μ μμ΅λλ€(SRP μ€μ).