Function & Structure(기능 & 구조)

모든 소프트웨어 제품의 설계에는 아래 두 가지 측면의 설계가 존재한다.

  • 기능(function) 측면 설계: 제품이 사용자를 위해 무엇을 할 수 있는지에 대한 설계

  • 구조(structure) 측면 설계: 제품의 형태가 어떠해야 하는지에 대한 설계

소프트웨어는 당연하게도 사용자에게 기능을 제공하는 것이 목적이다. 하지만 기능을 제공하기 위해서는 기능을 제공하는 데 필요한 구조가 존재해야 한다. 기능은 요구사항에 따라 계속해서 변화하기 때문에 요구사항 변경에 유연하게 대처할 수 있는 안정적인 구조를 설계하는 것이 중요하다. 안정적인 소프트웨어를 개발하기 위해 기능과 구조를 아래와 같이 적용할 수 있는 두 가지 기법은 아래와 같다.

  • 구조: 사용자나 이해관계자들이 도메인에 관해 생각하는 개념과 개념들 간의 관계로 표현(= 도메인 모델링)

  • 기능: 사용자의 목표를 만족시키기 위해 책임을 수행하는 시스템의 행위로 표현(= 유스케이스 모델링)

구조 - 안정적인 재료

안정적인 구조를 설계하기 위해서는 우선 개발하고자 하는 대상을 이해하고 단순화해서 표현할 수 있어야 한다. 이를 도메인 모델링이라고 하며, 도메인 모델을 통해 도메인의 복잡성을 단순화하여 바라볼 수 있다. 도메인 모델은 단순화되고 본질적인 측면이 담겨 있기 때문에 안정적인 구조를 설계하는 데에 유용하다. 안정적인 구조를 제공하는 도메인 모델을 기반으로 소프트웨어 구조를 설계하면 요구사항의 변경에 유연하게 대처할 수 있다.

기능 - 불안정적인 재료

기능은 사용자들에게 달성하고자 하는 목표를 제공해주고, 목표를 달성하기 위해선 시스템 간의 상호작용 관점에서 시스템을 바라봐야 한다. 사용자는 목표를 달성하기 위해 계속해서 시스템과 상호작용을 이루는데, 이 흐름을 텍스트로 정리한 것을 유스케이스라고 한다.

유스케이스

유스케이스는 사용자들의 목표를 중심으로 시스템의 기능적인 요구사항을 이야기 형식으로 묶을 수 있기 때문에 요구사항을 이해하는 데에 중요한 역할을 하며 특성은 아래와 같다.

  1. 사용자와 시스템 간의 상호작용을 보여주는 텍스트로, 다이어그램으로 표현되지 않는다.

  2. 하나의 시나리오가 아닌 여러 시나리오의 집합으로, 시스템의 기능적인 요구사항을 이야기 형식으로 묶을 수 있다.

  3. 단순한 기능 목록이 아닌 사용자의 목표를 중심으로 여러 기능을 포함하는 이야기를 제공함으로 써 요구사항을 이해하는 데에 중요한 역할을 한다.

  4. 사용자 인터페이스와 관련된 세부정보를 포함하지 않고 시스템의 행위에 초점을 맞춘다.

  5. 내부 설계와 관련된 정보를 포함하지 않고 시스템의 기능을 이야기 형식으로 표현하는 것에 초점을 맞춘다.

유스케이스는 설계 기법, 객체지향 기법이 아닌 그저 요구사항을 이해하는 데에 도움을 주는 정보만 제공한다. 때문에 시스템이 외부에 제공해야 하는 목표만 포함하기 때문에 객체의 구조나 책임에 대한 어떤 정보도 제공하지 않기 때문에 약간의 힌트로 사용하여 설계에 도움을 줄 뿐이다.

기능 + 구조

도메인 모델은 안정적인 구조를, 유스케이스는 불안정한 기능을 서술하고 있다. 변경에 유연한 소프트웨어를 만들기 위해서는 유스케이스에 정리된 시스템 기능을 도메인 모델로 기반을 한 객체들의 책임으로 분배해야 한다. 이를 책임-주도 설계로 아래와 같은 프로세스를 거쳐 구현할 수 있다.

  1. 시스템이 사용자에게 제공할 기능을 시스템의 책임으로 할당

  2. 시스템에 할당된 커다란 책임을 시스템 안의 작은 규모의 객체들이 수행해야 할 작은 규모의 책임으로 세분화

  3. 세분화된 책임을 도메인 모델 중 수행할 수 있는 객체에게 할당

  4. 필요한 기능들을 식별하면서 각 객체들에게 책임을 할당

  5. 객체를 구현하기 위해 클래스를 추가하고 속성과 함께 메서드로 구현

위와 같은 프로세스를 거치면 불안정한 기능을 수용할 수 있는 안정적인 구조에 기반하여 코드로 구현할 수 있다.

참고자료

Last updated