π νλ‘μλ 무μμΈκ°?
νλ‘μ(Proxy)λ ν΄λΌμ΄μΈνΈκ° μλ²μ μ§μ μμ²νμ§ μκ³ , μ€κ°μ λ리 κ°μ²΄λ₯Ό ν΅ν΄ κ°μ μ μΌλ‘ μμ²μ μννλ ꡬ쑰μ΄λ€. μ΄λ μ€κ°μ λ리 κ°μ²΄κ° λ°λ‘ 'νλ‘μ'μ΄λ€. νλ‘μλ ν΄λΌμ΄μΈνΈμ μλ² μ¬μ΄μ μμΉνμ¬ μμ²μ κ°λ‘μ±κ±°λ, λΆκ°μ μΈ μμ μ μννκ±°λ, μμ²μ μ μ΄ν μ μλ€.
μΌλ°μ μΌλ‘ ν΄λΌμ΄μΈνΈλ μμ μ΄ μμ²νλ λμμ΄ μ€μ μλ²μΈμ§, νλ‘μμΈμ§λ₯Ό μμ§ λͺ»νλ€. λ°λΌμ νλ‘μλ μλ²μ λμΌν μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ νλ€. μ΄λ‘ μΈν΄ ν΄λΌμ΄μΈνΈλ νλ‘μλ μλ²λ λμΌν λ°©μμΌλ‘ νΈμΆν μ μμΌλ©°, κ΅¬μ‘°κ° λ³κ²½λμ΄λ ν΄λΌμ΄μΈνΈ μ½λλ μ ν μν₯μ λ°μ§ μλλ€.

ποΈ νλ‘μ ν¨ν΄μ ꡬ쑰
νλ‘μ ν¨ν΄μ κΈ°λ³Έ ꡬ쑰λ λ€μκ³Ό κ°λ€.
- Client: μμ²μ 보λ΄λ 주체μ΄λ€.
- Proxy: μλ² λμ μμ²μ λ°μ μ²λ¦¬νκ±°λ, μλ²μκ² μ λ¬νλ μ€κ° κ°μ²΄μ΄λ€.
- RealSubject (Server): μ€μ λΉμ¦λμ€ λ‘μ§μ μ²λ¦¬νλ μλ² κ°μ²΄μ΄λ€.

μ΄ μΈ κ°μ²΄λ λ€μκ³Ό κ°μ μΈν°νμ΄μ€ ꡬ쑰λ₯Ό κ°λλ€.
public interface Subject {
String operation();
}
public class RealSubject implements Subject {
public String operation() {
return "μ€μ κ°μ²΄ νΈμΆ κ²°κ³Ό";
}
}
public class Proxy implements Subject {
private RealSubject realSubject;
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
public String operation() {
// λΆκ° κΈ°λ₯ μν
System.out.println("νλ‘μμμ μΆκ° μμ
μν");
return realSubject.operation();
}
}
μ΄λ κ² κ΅¬μ±λλ©΄ ν΄λΌμ΄μΈνΈλ μλμ²λΌ μ¬μ©ν μ μλ€.
public class Client {
private Subject subject;
public Client(Subject subject) {
this.subject = subject;
}
public void execute() {
String result = subject.operation();
System.out.println("κ²°κ³Ό: " + result);
}
}
μ΄ κ΅¬μ‘°μμ ν΄λΌμ΄μΈνΈλ Proxy
λ₯Ό μ£Όμ
λ°μλ, RealSubject
λ₯Ό μ£Όμ
λ°μλ μ ν μ μ μμΌλ©°, μ½λμ μμ μμ΄ λμΌνκ² λμνλ€.
νλ‘μ ν¨ν΄κ³Ό λ°μ½λ μ΄ν° ν¨ν΄
GOF λμμΈ ν¨ν΄μμλ νλ‘μ ν¨ν΄κ³Ό λ°μ½λ μ΄ν° ν¨ν΄μ ꡬλΆνλ€. λ λ€ κ΅¬μ‘°μ μΌλ‘λ μ μ¬νμ§λ§, μλ(intent)κ° λ€λ₯΄λ€.

1. νλ‘μ ν¨ν΄ - μ κ·Ό μ μ΄ λͺ©μ
νλ‘μ ν¨ν΄μ λ³΄ν΅ μ κ·Όμ μ μ΄νκΈ° μν΄ μ¬μ©λλ€.
- κΆνμ λ°λ₯Έ μ κ·Ό μ°¨λ¨
- κ²°κ³Όλ₯Ό μΊμ±ν΄μ μ±λ₯ ν₯μ
- μ§μ° λ‘λ©
μμ: μΊμ νλ‘μ
public class CacheProxy implements Subject {
private Subject target;
private String cache;
public CacheProxy(Subject target) {
this.target = target;
}
public String operation() {
if (cache == null) {
cache = target.operation();
}
return cache;
}
}
ν λ²λ§ μλ²μ μ κ·Όνκ³ , μ΄νμλ μΊμλ κ²°κ³Όλ₯Ό 리ν΄νλ€.
2. λ°μ½λ μ΄ν° ν¨ν΄ - κΈ°λ₯ νμ₯ λͺ©μ
λ°μ½λ μ΄ν° ν¨ν΄μ κΈ°μ‘΄ κΈ°λ₯μ μλ‘μ΄ κΈ°λ₯μ μΆκ°νλ λ° μ¬μ©λλ€. ꡬ쑰λ νλ‘μμ κ±°μ λμΌνμ§λ§, λͺ©μ μ΄ λ€λ₯΄λ€.
μμ: λ©μμ§ λ³κ²½ λ°μ½λ μ΄ν°
public class MessageDecorator implements Subject {
private Subject target;
public MessageDecorator(Subject target) {
this.target = target;
}
public String operation() {
String result = target.operation();
return "[λ°μ½λ μ΄μ
] " + result;
}
}
νλ‘μλ₯Ό μ°μμ μΌλ‘ μ°κ²°νλ μ²΄μΈ ννλ‘λ κ°λ₯νλ€.
Subject realSubject = new RealSubject();
Subject decorator1 = new MessageDecorator(realSubject);
Subject decorator2 = new TimeDecorator(decorator1);
Client client = new Client(decorator2);
client.execute();
μ΄μ²λΌ λ°μ½λ μ΄ν°λ 체μΈμ ꡬμ±ν΄μ μ μ κΈ°λ₯μ μΆκ°ν΄ λκ° μ μλ€. νλ‘μ μμ λ§μ°¬κ°μ§λ‘ νλ‘μ 체μΈμ ꡬμ±ν μ μλ€.
νλ‘μ ν¨ν΄μ ν΅μ¬ μ 리
- νλ‘μλ μλ²μ λμΌν μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌ νλ€.
- νλ‘μλ₯Ό λμ ν΄λ ν΄λΌμ΄μΈνΈ μ½λλ λ³κ²½ μμ΄ λμν΄μΌ νλ€.
- νλ‘μλ μ²΄μΈ ννλ‘ μ¬λ¬ κ° μ°κ²°ν μ μλ€.
- μ κ·Ό μ μ΄λ λΆκ° κΈ°λ₯ μΆκ° λ±μ μν μ μνν μ μλ€.
- νλ‘μλ μ€νλ§ AOPλ νλ‘μ κΈ°λ° DI ꡬνμμ λ§€μ° μ€μνλ€.
μ€νλ§μμμ μ€μ νλ‘μ ꡬν μμ
μλλ μ€νλ§μμ μΈν°νμ΄μ€ κΈ°λ°μΌλ‘ νλ‘μλ₯Ό ꡬνν μ½λμ΄λ€.
@RequiredArgsConstructor
public class OrderServiceInterfaceProxy implements OrderServiceV1 {
private final OrderServiceV1 target;
private final LogTrace logTrace;
public void orderItem(String itemId) {
TraceStatus status = null;
try {
status = logTrace.begin("OrderService.orderItem()");
target.orderItem(itemId);
logTrace.end(status);
} catch (Exception e) {
logTrace.exception(status, e);
throw e;
}
}
}
μ΄λ° λ°©μμΌλ‘ OrderController
, OrderRepository
λ νλ‘μ ꡬν체λ₯Ό λ§λ€μ΄, κΈ°μ‘΄ ꡬν체λ₯Ό κ°μΈλ λ°©μμΌλ‘ κΈ°λ₯μ νμ₯ν μ μλ€.
κ²°λ‘
νλ‘μ ν¨ν΄μ λ¨μν ꡬ쑰 κ°μ§λ§, μ€κ³μ μ μ°μ± μΈ‘λ©΄μμ λ§€μ° μ€μν ν¨ν΄μ΄λ€. μ κ·Όμ μ μ΄νκ±°λ, μ±λ₯μ κ°μ νκ±°λ, κΈ°λ₯μ νμ₯νλ λ° μ μ©νκ² μ¬μ©λλ€. νΉν μ€νλ§μμλ AOP, νΈλμμ μ²λ¦¬, λ‘κΉ λ± λ§μ λΆλΆμ΄ νλ‘μ κΈ°λ°μΌλ‘ λμνκ³ μλ€. νλ‘μλ₯Ό μ΄ν΄νλ κ²μ μ€νλ§μ μ΄ν΄νλ λ° λ§€μ° ν° λμμ΄ λλ€.
'Design Pattern' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ λ΅ ν¨ν΄(Strategy Pattern) μ 리 - ν νλ¦Ώ λ©μλ ν¨ν΄κ³Όμ μ°¨μ΄μ (0) | 2025.03.27 |
---|---|
[λμμΈ ν¨ν΄] ν νλ¦Ώ λ©μλ ν¨ν΄ (0) | 2025.03.24 |
[λμμΈ ν¨ν΄] Builder ν¨ν΄ (0) | 2025.03.23 |
λκΈ