본문 바로가기

Design/Design Pattern

[Design Pattern] Prototype Pattern

이번 장에서는 프로토타입(Prototype) 패턴에 대해서 알아보도록 한다.
샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다.


이번 프로토타입 패턴은 하나의 어플리케이션에서 여러 데이터베이스에 접속하는 경우 공통되는 정보는 복사하고 변경되어야하는 정보만 수정하는 방식으로 진행하며 프로토타입 적용 전과 후의 성능을 비교해본다.

프로토타입 패턴이란?

생성할 객체들의 타입이 프로토타입인 인스턴스로부터 결정되도록 하며, 인스턴스는 새 객체를 만들기 위해 자신을 복제하는 패턴이다.
쉽게 말해서 최초에 프로토타입 인스턴스를 생성하고 이후에 생성되는 인스턴스는 새로 만드는 것이 아니라 최초의 프로토타입 인스턴스를 복사하는 패턴이다.

GoF Design Patterns에 따르면 아래와 같은 Class Diagram이 그려진다.

Prototype 추상클래스는 Clone 메서드를 명시하고 있다.
이를 확장(상속)한 ConcretePrototype1과 ConcretePrototype2는 Clone 메서드를 구현하고 있다.

Prototype을 DB Client에 적용시켜보면 아래와 같은 그림이 나온다.

DBClient 추상클래스는 Clone 메서드를 명시하고 있다.
이를 확장(상속)한 MariaClient는 Clone 메서드를 구현하고 있다.

코드를 보면서 자세하게 살펴보도록 한다.

DBClient Abstract Class
DBClient는 Cloneable 인터페이스를 구현하고 있으며 실제로 구현하는 메서드는 추상 메서드(copy)로 만들어서 자신을 확장(상속)한 클래스가 작성하도록 하고있다. 자신을 생성할 때 1초간의 지연을 두어 생성 시 소요되는 시간을 강제로 1초로 하였다.

MariaClient Class
DBClient를 확장(상속)하고 있으며 자신을 복사할 때 connectionName과 address를 파라미터로 받아서 수정하고 복사하고 있다.
select를 호출하면 자신의 정보를 출력하도록 하였다.


프로토타입 패턴 적용 전

프로토타입 패턴이 적용되지 않았고 어플리케이션이 총 다섯 개의 MariaDB에 연결하는 클라이언트가 필요하다면 아래와 같이 총 다섯 개의 클라이언트를 생성하게 될 것이다. 아래는 총 다섯 개의 클라이언트를 생성하고 select하는 시간을 구하는 코드다.

실행 결과는 아래와 같다.
DBClient를 생성할 때 1초의 시간이 소요되기 때문에 총 5초의 시간이 소요된 것을 확인할 수 있다.

프로토타입 패턴 적용 후

프로토타입 패턴이 적용되면 192.168.0.1 서버에 접속하는 최초의 프로토타입 클라이언트를 만들고 이후의 클라이언트들은 새로운 접속주소를 입력받아서 기존의 클라이언트를 복사하게 된다. 아래는 하나의 프로토타입 클라이언트를 생성하고 네 개의 복사본을 만들어서 selectr하는 시간을 구하는 코드다.

실행 결과는 아래와 같다.
DBClient를 생성할 때 1초의 시간이 소요되었지만 이후에 만들어진 클라이언트들은 새로 생성하는 것이 아니라 복사하는 것이기 때문에 총 1초가 소요된 것을 확인할 수 있다.


지금까지 하나의 어플리케이션이 다중 DB에 접속해야하는 경우를 예로들어서 프로토타입 패턴에 대해서 알아보았다.