우아한 프로그래밍
article thumbnail

안녕하세요.

오늘은 프록시 패턴에 대해서

이야기 하려고 합니다.

 

프록시(Proxy)라는 단어의 사전적 의미를 살펴보면

"대리인" 이라는 뜻이 입니다.

 

자바 코드에서 생각하면 어떤 클래스의

대리를 수행하는 클래스 정도로 생각 해 볼 수 있습니다.

 

Proxy패턴을 사용하는 경우는 실제 객체의 생성시간이 오래 걸리는

경우 일을 분업하여 간단한 초기 작업들은 Proxy에서 수행을 하고

가장 중요한 마지막 작업에서 Proxy객체는 실제 객체를

생성하고 위임시키게 됩니다.

 

아래에서 Mail과 MailProxy클레스를 가지고 Proxy패턴에 대해서

설명 해보도록 하겠습니다.

 

MailProxy는 보내는 사람(formName)과 받는 사람(toName)을 설정하고

실제 메일을 보낼때 Mail 객체를 생성하여 위임 시키게 됩니다.

 

예제로 MailProxy 클래스를 작성해 보도록 하겠습니다.

 

[클래스 다이어그램]

 

 

[Main]

 

public class Main {

             public static void main(String[] args) throws InterruptedException {

                           MailProxy mailProxy = new MailProxy();

                           mailProxy.setFromName("피터팬");

                           mailProxy.setToName("팅커벨");

                           mailProxy.send();

             }

}

[MailProxy]

 

public class MailProxy implements Senderble {

            

             private Mail mail;

             private String toName;

             private String fromName;

 

             @Override

             public void setFromName( String name) {

                           if( mail != null){

                                        mail.setFromName( name );

                           }

                          

                           this.fromName = name;

                          

             }

 

             @Override

             public void setToName( String name) {

                           if( mail != null){

                                        mail.setToName( name );

                           }

                           this.toName = name;

             }

            

             // 실제 Mail의 객체를 거치지 않고도 대리인 만으로 사용가능

             public String getToName() {

                           return toName;

             }

 

             // 실제 Mail의 객체를 거치지 않고도 대리인 만으로 사용가능

             public String getFromName() {

                           return fromName;

             }

 

             @Override

             // 여러 사용자가 사용하기 때문에 객체가 여러번 생성이 될 수 있습니다.

             // 따라서 동기화 synchronized를 사용 했습니다.

             public synchronized  void send() throws InterruptedException {

                           if( mail == null){

                                        mail = new Mail();

                           }

                           mail.send();

             }

}

[Mail]

 

public class Mail implements Senderble {

            

             private String toName;

             private String fromName;

            

             public Mail() throws InterruptedException {

                           System.out.println("Mail 객체 생성 시작.....");

                           Thread.sleep(5000);

                           System.out.println("Mail 객체 생성 끝.....");

             }

 

             @Override

             public void setFromName(String name) {

                           this.fromName = name;

             }

 

             @Override

             public void setToName(String name) {

                           this.toName = name;

             }

 

             @Override

             public void send() {

                           //..... do somthing

             }

 

             @Override

             public String getFromName() {

                           return this.fromName;

             }

 

             @Override

             public String getToName() {

                           return this.toName;

             }

}

 

[Senderble]

 

public interface Senderble {

             void setFromName( String nam);

             void setToName( String nam);

             String getFromName();

             String getToName();

             void send() throws InterruptedException;

}

profile

우아한 프로그래밍

@자바조아!

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!