이춘식 컬럼

이춘식pe

데이터모델링 디자인패턴

작성자 : 이춘식pe 작성일 : 2016.11.10 04:05:47 댓글수 : 1 조회수 : 675

네 명의 갱단의 의미를 가진 GoF( 컴퓨터 소프트웨어 공학 분야의 연구자인 에릭 감마, 리차드 헬름, 랄프 존슨, 존 블리시디스)가 만든 디자인패턴이 있다. 이 디자인패턴 책의 이름은 'Design Patterns: Elements of Reusable Object-Oriented Software'(재사용 가능한 객체지향 소프트웨어의 요소 - 디자인 패턴) 책으로, 이 책은 전 세계 개발자에게 정말 훌륭한 이론으로서 실질적인 고급 프로그래밍에 적용할 수 있는 훌륭한 책으로 인식되고 있다. 이 책의 영향으로 지금은 객체지향의 고급 설계를 할 때 이 디자인패턴에서 정의한 23개 패턴 중 1~2개 이상의 설계 패턴이 안들어 간 것이 별로 없을 정도이다. 필자도 GoF가 정의한 디자인패턴을 3~4번 정독해보았는데 뜯어볼수록 그렇게 정의한 사상적 흐름을 이해될 수록 ‘참 수준 높은 설계라고 하는 것이 이런 것을 이야기하는 구나!’ 라는 느낌을 받을 수 있다.

 

소프트웨어 개발 방법에서 사용되는 디자인 패턴은, 프로그램 개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나로, 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여,이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다. 알고리즘과 같이 프로그램 코드로 바로 변환될 수 있는 형태는 아니지만, 특정한 상황에서 구조적인 문제를 해결하는 방식을 설명해 준다.소프트웨어 설계에서 얻은 세세한 경험들을 기록해 놓도록 하는 것이다.

 

디자인패턴을 이용하는 목적은 설계자로 하여금 재사용을 가능하게 하는 설계를 선택하게 하고 재사용을 방해하는 설계는 배제하도록 하다. 즉 ‘올바른’ 설계를 ‘빨리’ 만들 수 있도록 도와주는 원리가 있다라고 할 수 있다.

 

GoF는 디자인패턴을 하는 원칙을 몇 가지로 정의하고 있는데 그것은…

- 바뀌는 부분은 캡슐화 한다.

- 상속보다는 위임을 활용한다.

- 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.

- 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용한다.

- 클래스 확장에 대해서는 열려 있지만 변경에 대해서는 닫혀 있어야 한다.

- 추상화된 클래스에 의존하고 구현 클래스에 의존하지 말라

이다.

 

바뀌는 부분은 한꺼번에 수정을 위해 둘러싸는 캡슐화를 하고, 강하게 결합되어 유지보수가 어려운 소스코드가 아닌 느슨한 결합의 위임(연관관계이용)을 활용하는 것이라든지, 될 수 있으면 클래스가 유연하게 확장하도록 하고 변경은 최소한의 지점에서만 하도록 하는 것 등은 실제로 객체지향 언어를 이용하여 프로그래밍을 할 때 유지보수성을 향상 시키는 매우 중요한 원리가 될 수 있다.

 

23개 중 하나인 Fly Weight Pattern 디자인패턴을 정의한 것을 예를 들어 보면, 대규모 객체들을 생성하면서 많은 자원을 소모하고 성능이 느려지는 것을 예방하기 위해 일정한 방식을 제시하고 있다. 그것은 본질적 상태(공유 가능)와 부가적 상태(공유 불가)를 구분하여 작은 객체들을 효과적으로 사용하기 위해 공유 개념을 가지게 한 것이다. 즉, 작은 객체를 만드는데 지속적으로 New하여 자원소모량이 많은 것을 방지하기 위해 공유풀(Pool)을 통해 훨씬 효율적으로 빠르게 로직이 작동되도록 한 디자인패턴이다.

내용을 읽을수록 그리고 그렇게 소스코드가 구현되도록 디자인한 클래스다이아그램을 볼 때마다 객체지향 구현 경험을 버리지 않고 지식을 보석처럼 정리한 GoF 네 사람이 존경스럽다.

 

필자도 오래 전부터 데이터베이스의 핵심설계도인 데이터모델링을 할 때 이 디자인패턴이 필요하다고 느끼고 있어왔다. 그래서 ‘아는 만큼 보이는 데이터베이스 설계와구축(한빛미디어, 이춘식)’에서도 언급한 유형들 그것을 이제 지식만을 전달하지 않고 데이터모델의 오류유형을 예방하고 훨씬 재사용성도 높고 빠른 처리를 위한 ‘데이터모델 디자인패턴’을 정리하는 계획을 가지고 있기도 하다. 이 계획을 가진 이유는 필자가 많은 프로젝트에 다녀보았는데 짧은 납기에 제한된 기술력으로 수준 높은 설계도를 완성하기가 쉽지 않다는 것을 발견했기 때문이다. 모든 분석/설계를 하는 개발자나 데이터베이스 담당자가 학습만을 통해 수준 높은 설계를 하는 것이나, 또는 공통의 관심사에 대해서 충분한 분석을 할 수 있는 물리적인 시간의 한계로 인해 설계상 문제가 많은 데이터모델이 만들어지는 경우를 많이 보았기 때문에 패턴기반 데이터모델링을 한다면 훨씬 안정적이고 높은 수준의 설계를 할 수 있지 않을까 생각해 본 것이다.

 

GoF의 디자인패턴 23가지가 정리되어 수 많은 프레임웍, 공통로직에 들어가 그것이 가치를 발휘하고 있는 것처럼, 만약 데이터모델의 유형도 잘만 정리가 된다면 수많은 분석/설계자에게는 단비와 같은 소식을 아닐 수 없을 것이다.

 

예를 들어, 데이터모델의 자주사용하는 유형을 이렇게 이름하여 패턴화하여 제공한다면 어떨까?

  •        공통코드를 설계하는 디자인패턴 : BaseCode 패턴
  •        도미노 속성에 대한 디자인패턴 : Dominos 패?ㄴ
  •        자기참조유형의 디자인패턴 : Recursive 패턴
  •        진행이력에 대한 디자인패턴 : GHistoric 패턴
  •        변경이력에 대한 디자인패턴 : CHistoric 패턴
  •        수정사항을 복구하는 디자인패턴 : Recovery 패턴
  •        공통과 개별이 분리되는 디자인패턴 : Super-sub 패턴
  •        주문등의 거래를 위한 패턴 : Order 패턴
  •        메시지 처리를 위한 패턴 : Message 패턴

… 등

물론 위와 같은 데이터모델에 대한 디자인패턴이 아직 정리된 것은 아니다. 만약 이것 유형의 데이터모델 디자인패턴이 완성 된다면 여러 프로젝트에서 데이터모델링을 하는 수많은 사람에게 단비와 같은 소식을 될 수 있을 것이다. Len Silverston, Paul Agnew는 The Data Model Resource Book vol3(SDS김태연, 박경호외 번역, 지엔선) 에서 데이터모델에 대한 패턴을 언급하기는 하였다. 업무적인 관점에서 한번 읽어보면 도움이 많이 되는 책이 될 수 있기는 하다.

 

다만 필자가 구상하고 있는 좀 더 명쾌하고 데이터모델링을 할 때 분명한 메시지와 효과를 느낄수 있는 분야와 이 책에서 정리된 데이터모델 디자인패턴과는 차이가 있어 이 부분에 대해서는 원래 계획대로 별도의 집필을 해야 할 필요를 느끼고 있다.  

 

살아 있는 지식은 실무 현장에서 수많은 고민, 그리고 적용과 분석을 통해 지속적으로 창출될 수 있다고 생각한다. GoF의 디자인패턴이 수많은 경험을 통하여 그것을 정리하여 새로운 가치를 또 다른 수많은 사람에게 제공한 것처럼, 이제 우리나라에서도 수 많은 개발자 그리고 DBA가 현장에서 경험하고 분석한 사항들이 집약되어 새로운 지식체계로 쏟아질 그 때가 되지 않았나 생각이 된다.

 

IT강국 우리나라가 지식을 가져다 쓰는 시대에서 이제 지식을 꿔주는 시대로 가면 어떨까?

데이터모델에 대한 디자인패턴도 우리가 정리하여 전세계가 쓰는 시대로 한번 더 분석하고 생각하여 체계화된 이론으로 만들어 보는 것이 멋지지 않을까 감히 생각해본다.

첨부파일

  • SQLD를 공부하다가 우연히 들어오게 됐는데, 정말 좋은 지식이 녹아진 글이 많네요. 많음 도움됐습니다. 고맙습니다.

    데이터모델링의 디자인 패턴을 구축해두는 생각을 하신다는 것 자체가 존경스럽습니다..

    제가 모델링 공부를 하면서 어려웠던 것이 실무적으로 확 와닿지가 않았던 점인데 패턴을 정리화한 책이 있다면 여러면에서 도움이 많이 될것 같습니다. 

  • 댓글을 입력 하시려면 로그인 해주세요.