'지도'와 객체지향
'지도'라는 존재는 길을 찾는데 필요한 구체적인 '기능'을 알려주기보다는, 길을 찾을 수 있는 '구조'를 제공하는 도구이다. 또한, 어떤 하나의 요구만을 충족시켜주는데에 불과하지 않고 여러 목적으로 활용될 수 있는, 범용적인 도구이다.
지도가 범용적인 이유는 지도를 사용하려는 사람들이 원하는 '기능'에 비해 지도의 '구조'가 더 안정적이기 때문이다. 이런 식의 안정적인 '구조'중심에 기능을 종속시키는 방법은 범용적이고 재사용 가능하며 변경에 유연하게 대처할 수 있는 모델을 만든다. 객체지향 역시 이런 구조에 기능을 덧대는 방식과 유사하다. 자주 변경되는 기능보단 안정적인 구조를 기반으로 시스템을 구조화한다.
기능 설계 VS 구조 설계
모든 소프트웨어의 기본적인 존재 이유는 사용자에게 훌륭한 기능을 제공하기 위해서이다. 하지만 훌륭한 기능이 소프트웨어의 충분조건이라고 한다면 훌륭한 '구조'는 훌륭한 소프트웨어를 위한 필요조건이다. 깔끔하고 단순하며 유지보수하기 쉬운 설계는 사용자의 변하는 요구사항을 반영할 수 있도록 쉽게 확장 가능한 소프트웨어를 창조할 수 있는 기반이 된다.
하지만 소프트웨어 분야에서는, 요구사항은 언제나 변경된다. 개발자는 계속 변화하는 요구에 맞춰 요구사항의 변경에 유연하게 대처할 수 있는 안정적인 구조를 제공할 수 있어야 한다. 이러한 알 수 없는 불확실한 미래에 대처하는 가장 좋은 방법은 변경을 예측하기 보다는 변경을 수용할 수 있는 여지를 설계에 마련해 놓는 것이다. 객체지향 역시 이러한 구조를 따르며, 구조에 집중하고 기능이 구조를 따르게 만든다.

따라서 객체지향 세계를 구축하기 위해서는 '기능'과 기능을 담을 안정적인 '구조'가 준비되어 있어야 한다. 기능을 수집하고 표현하기 위한 기법을 유스케이스 모델링이라고 하고 구조를 수집하고 표현하기 위한 기법을 도메인 모델링이라고 한다.
도메인 모델
도메인이란, 사용자가 프로그램을 사용하는 대상 분야를 말한다. 따라서 도메인 모델이란, 사용자가 프로그램을 사용하는 대상 영역에 관한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태이다. 이는 단순한 다이어그램이 아니다. 이해관계자들이 바라보는 멘탈 모델이다.

도메인 모델은 이러한 사용자 모델, 디자인 모델, 시스템 이미지를 포괄한 멘탈 모델을 추상화한 소프트웨어 모델이다.
객체지향은 이러한 멘탈 모델의 요구사항을 가장 범용적으로 만족시킬 수 있는 거의 유일한 모델링 패러다임이다. 객체지향은 사람들이 만지고 느끼고 볼 수 있는 실체를 시스템 안의 객체로 재창조할 수 있게 해준다.
따라서 소프트웨어 객체를 창조할 때 우리는 도메인 모델을 은유한다. 도메인 모델은 도메인의 구조를 반영하기에 코드를 짜기에도 훨씬 수월하고, 동시에 도메인 모델이 제공하는 구조는 비교적 안정적이다. 이런 안정적인 구조를 제공하는 도메인 모델을 기반으로 소프트웨어의 구조를 설계하면 변경에 유연하게 대응할 수 있는 탄력적인 소프트웨어를 만들어낼 수 있다.

유스케이스
유스케이스란, 사용자의 목표를 달성하기 위해 사용자와 시스템 간에 이뤄지는 상호작용의 흐름을 텍스트로 정리한 것을 말한다. 유스케이스의 가치는 사용자들의 목표를 중심으로 시스템의 기능적인 요구사항들을 이야기 형식으로 묶을 수 있다는 점에 있다.
유스케이스는 몇 가지 대표적인 특징들이 있다. 먼저, 유스케이스는 사용자와 시스템 간의 상호작용을 보여주는 '텍스트'이다. 다이어그램 보다는 유스케이스에 담겨있는 이야기에 집중해야 한다. 둘째, 유스케이스는 하나의 시나리오가 아닌 여러 시나리오들의 집합이다. 위의 예시를 참고해봤을 때도, 당일까지의 이자액 계산과 계좌 선택 후 특정일까지의 이자액 계산이라는 두 가지 시나리오가 존재한다. 셋째, 단순한 기능을 나열한 목록이 아니다. 단순 기능 나열이 아닌 이야기를 통해 연관된 기능들을 함께 묶을 수 있다. 넷째, 유스케이스는 사용자 인터페이스와 관련된 세부 정보를 포함하지 말아야 하며, 내부 설계와 관련된 정보를 포함하지 않는다.
유스케이스는 사실상 객체지향과도 상관이 없다. 그저 기능적 요구사항을 사용자의 목표라는 문맥을 중심으로 묶기 위한 정리 기법일 뿐이다. 객체의 구조나 책임에 대한 어떤 정보도 제공하지 않는다.
도메인 모델, 유스케이스, 그리고 책임-주도 설계
변경에 유연한 소프트웨어를 만들기 위해서는 유스케이스에 정리된 시스템의 기능을 도메인 모델을 기반으로 한 객체들의 책임으로 분배해야 한다.
객체 설계를 할 때 도메인 모델, 유스케이스, 그리고 책임-주도 설계가 함께 이루어져야 한다. 요구사항들을 식별해 도메인 모델을 생성한 후, 소프트웨어 클래스에 메서드들을 추가하고, 요구사항을 충족시키기 위해 객체들 간의 메시지 전송을 정의해야 한다. 책임-주도 설계 방법은 시스템의 기능을 역할과 책임을 수행하는 객체들의 협력 관계로 바라보게 함으로써 두 가지 기본 재료인 유스케이스와 도메인 모델을 통합한다. 객체의 이름 역시 도메인 모델에 포함된 개념으로부터 차용하고, 책임은 도메인 모델에 정의한 개념의 정의에 부합하도록 할당한다.
객체지향의 가장 큰 장점은 도메인을 모델링하기 위한 기법과 도메인을 프로그래밍하기 위해 사용하는 기법이 동일하다는 것이다. 따라서 도메인 모델링에서 사용한 객체를 프로그래밍 설계에서의 객체와 클래스로 매끄럽게 변환할 수 있다. 이를 '연결 완정성'이라고 한다. 또한 이 역방항 역시 성립한다. 코드의 변경이 곧 도메인 모델의 변경이라고 할 수 있다.
안정적인 도메인 모델을 기반으로 시스템의 기능을 구현하는 것이, 유지보수하기 쉽고 유연한 객체지향 시스템을 만드는 첫걸음이다.
이미지 출처: [객체지향의 사실과 오해] - 조영호