소프트웨어 설계 시 자주 나는 미래의 변화를 좀더 쉽게 수용하기 위해 지금 당장 디자인 패턴을 적용할 것인지에 대해 고민한다. 프로젝트의 성격과 조직의 특성에 따라 선택의 결과가 때로는 좋았을 수도 그렇지 않았던 경우도 있었다. 그러면 도대체 언제 디자인 패턴을 적용하는 것이 좋을까? 패턴을 적용하는 것이 과연 항상 좋은 결과를 가져다 주는 것일까? 고민에 빠지게 된다.

내가 생각한 결론은 다음과 같다. 디자인 패턴을 적용한 설계가 올바른 설계일 경우도 있고 그렇지 않을 경우도 있다는 것이다. 다음과 같은 3가지 측면에서 생각해 볼 수 있다. 첫 번째로 코드 재사용 측면이다. 디자인 패턴을 적용하게 되면 중복인 코드는 제거되고 코드 재사용 가능한 구조로 바뀌게 된다. 중복된 코드를 제거한다는 것은 그만큼 오류를 줄인다는 것으로 생각할 수도 있다. 결국 많은 부분에서의 코드 커버리지(Code Coverage)를 할 수 있다는 것을 의미한다. 코드 커버리지란 소프트웨어 테스트 시 사용되는 측정 기준 중 하나고, 얼마만큼 그 소프트웨어가 테스트되었는지를 나타낸다. 따라서 코드 커버리지를 증가시킬 수록 그 만큼 테스트가 많이 되었다는 것을 의미한다. 실제로 중복코드와 오류밀도의 관계에 대한 내용이 알려진바 있었다. 1 2

두 번째는 성능 측면이다. 디자인 패턴을 이용하게 되면 그렇지 않을 때보다 코드는 간결해 지지만 많은 상속(inheritance)과 구현, 컴포지션(composition) 등으로 인해 복잡한 구조를 갖게 될 수 있었다. 이러한 복잡한 구조는 객체 생성에 필요한 오버헤드가 필요하므로 성능저하의 원인이 된다. 실제로 같은 코드를 class와 상속 구조로 만들어 필요할 때마다 새로운 객체를 생성한 코드보다 그렇지 않은 코드가 빠르다는 것을 확인 할 수 있다.3 성능이 아주 중요한 소프트웨어라면 복잡한 패턴 적용은 신중히 생각해야 한다.

세 번째는 생산성 측면이다. 디자인 패턴에서 말하는 “확장 가능하고 유지보수하기 수월한” 코드라는 것은 코드 작성시 미래를 염두 해 작성한다는 것을 의미한다. 이는 현재에는 필요 없는 코드라 할지라도 미래에 변경될 것을 예측하여 수정한다는 것을 의미하는데 이것은 엄밀히 따지면 현재 불필요한 일을 하게 되므로 생산성을 저해하게 된다. XP(Extreme Programming)4 에서는 생산성 향상을 위해서는 두 번까지의 코드 중복이 일어나기 전까지는 기존 방식을 유지하고 세 번째 중복이 발생할 때 구조를 변경해 보는 것이 생산성 향상에 도움이 된다고 말하고 있다.

References