Eternity's Chit-Chat

aeternum.egloos.com



유연한 설계를 위한 패턴과 원리 - 5.시간, 돈, 그리고 분석 패턴 2부 Supple Design

TEMPORAL 분석 패턴을 적용한 환율 개선

‘변하지 않는 것은 모든 것이 변한다는 사실 뿐이다’라는 격언이 있다. 시간은 흐르고 모든 것은 변한다. 현재의 사실은 어느새 과거의 기억이 되고, 과거의 기억을 찾기 위해서는 시간을 거슬러 올라갈 필요가 있다. 시간의 가역성과 비가역성에 관한 논란은 인류 역사 내내 중요한 종교, 철학, 과학의 화두가 되어 왔다. 다른 분야와 달리 소프트웨어 영역에 있어서 시간은 항상 가역성을 가진다. 과거의 상태를 보관해 놓으면 언제라도 과거의 상태로 돌아갈 수 있다.

문제는 과거의 상태를 보존하는 방법이다. 시간을 거슬러 올라가기 위해서는 최종 상태 뿐만 아니라 변경이 일어나기 전의 과거 상태 역시 보관해야 한다. 상태를 보존하는 방법 뿐만 아니라 상태를 확인하는 방법도 변경해야 한다. 시간이라는 개념을 고려할 경우 “사시는 곳이 어디예요?”라는 질문보다는 “1993년에 사시던 곳이 어디였나요?”나 “지금 사시는 곳이 어디예요?”라는 질문이 더 적절하다. 객체의 상태를 변경하거나 조회하기 위해 필요한 인터페이스는 시간을 파라미터로 받게 되며 객체는 현재의 상태 뿐만 아니라 각 시간에 따른 상태 변화를 보관해야 한다.

시간의 흐름에 따른 상태 변화를 관리할 수 있도록 객체를 설계하는데 사용하는 분석 패턴을 TEMPORAL 패턴 또는 HISTORICAL MAPPING 패턴이라고 한다. 다양한 형태의 TEMPORAL 패턴이 존재하지만 여기에서는 시간에 따른 환율의 변경을 반영하기 위해 TEMPORAL PROPERTY 패턴을 사용하기로 한다.

앞에서 살펴 보았던 Money의 환율 변환 예제에서는 환율이 변경되지 않고 고정되어 있다고 가정했다. 그러나 현실에서의 환율은 매일 변경되며 실제 환전을 할 경우에는 최종적으로 변경된 환율을 적용해야 한다. 따라서 시스템은 매일의 환율 변화 상태를 시스템에 저장하고 있어야 한다. 환율과 관련된 요구사항은 TEMPORAL 패턴을 적용해야 하는 전형적인 예이다.

환율을 변환하는 ChangeBooth 클래스의 코드를 살펴 보자. 과거에 작성한 코드를 살펴볼 때는 테스트 케이스부터 살펴 보는 것이 좋다. ChangeBooth를 사용하기 위한 다양한 방법을 문서화하고 있기 때문이다. 게다가 이 문서는 실행 가능하며 ChangeBooth가 문서화된 그대로 실행된다는 것을 보장해 준다.

TEMPORAL 패턴을 적용할 때 가장 큰 변화는 객체의 인터페이스에 시간과 관련된 파라미터가 추가된다는 점이다. ChangeBooth의 exchange() 메소드에서는 환율을 적용할 기준 일자를 파라미터로 받아야 한다. 이런 경우 기준 일자를 파라미터로 받지 않는 기존의 exchange() 메소드를 수정하기 보다는 새로운 메소드를 추가하는 것이 좋은데 그 이유는 사용 상의 편의를 위해 기준 일자를 전달하지 않는 경우 암묵적으로 최종 환율을 사용하도록 하기 위해서이다.

환율 계산 뿐만 아니라 환율을 저장하는 방식 역시 변경해야 한다. 기존의 exchange() 메소드의 경우 변경을 수행할 통화 쌍과 환율만을 파라미터로 받는다. 그러나 시간을 고려할 경우 어떤 시점의 환율을 적용할 지도 함께 다루어야 한다. 또한 시스템에 저장된 환율을 쉽게 변경할 수 있는 방법도 지원해야 한다.

환율을 추가하는 가장 간단한 방법은 현재 수정(current update) 방식을 사용하는 것이다. 이것은 추가되는 환율이 항상 최종 환율이라는 특성을 이용하는 것으로 DayOfYear 파라미터 없이 addExchangeRate() 메소드를 사용하여 환율을 추가할 경우 항상 현재일의 환율로 저장하는 것이다. 즉, 특별히 시간을 지정하지 않을 경우 목록의 마지막에 환율이 추가된다.

환율의 적용 기간을 변경하는 가장 간단한 방법은 추가 수정(additive update) 방식이다. 평일에는 매일 환율이 변경되지만 주말에는 변경되지 않는다. 따라서 핸드폰 요금에 대한 환율을 계산하기 위해서는 금요일의 환율 정보를 토요일과 일요일에도 적용해야 한다. 따라서 환율을 저장할 때 환율의 유효 기간도 함께 저장할 필요가 있다.

추가 수정 방식을 사용하면 환율을 저장할 때 종료 일자 없이 시작 일자와 환율 정보만 저장해도 된다. 즉, 2008년 10월 31일의 환율은 1USD당 1250원이라고만 저장하는 것이다. 만약 그 다음 데이터가 11월 3일의 환율 정보라면 10월 31일의 환율 정보를 11월 1일과 11월 2일에도 소급 적용하면 된다. 즉, 추가 수정 방식은 환율의 유효 기간을 시작 일자부터 그 다음 데이터의 시작일자 이전까지로 적용하는 방식이다.

TEMPORAL PROPERTY 패턴은 TEMPORAL 패턴의 하나로 어떤 객체의 일부 속성이 시간에 따라 변할 경우 적용할 수 있는 패턴이다. 만약 객체 전체가 시간에 따라 변경된다면 TEMPORAL PROPERTY 패턴보다는 SNAPSHOT이나 TEMPORAL OBJECT 패턴이 적합하다. ChangeBooth의 경우 객체의 일부 속성만이 시간에 따라 변경되기 때문에 TEMPORAL PROPERTY 패턴을 사용하기로 한다. TEMPORAL PROPERTY 패턴을 구현하기 위해서는 EFFECTITY 패턴과 TEMPORAL COLLECTION 패턴을 사용할 수 있는데, 여기에서는 시간에 따라 환율을 손쉽게 추출할 수 있도록 하기 위해 TEMPORAL COLLECTION 패턴을 적용하기로 한다.