본문 바로가기

개발이야기

객체지향의 사실과 오해 | 6장

유일하게 변하지 않는 것은 모든 것이 변한다는 사실뿐이다. - Heraclitus of Ephesus

 

객체지향은 자주 변경되는 기능이 아니라 안정적인 구조를 기반으로 시스템을 구조화한다.

역할,책임,협력을 기반으로 시스템의 기능을 구현하는 책임-주도 설계의 본질을 이해하는 데도 도움이 될 것이다.

 

기능 설계 대 구조 설계

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

하나는 기능 측면의 설계이고, 다른 하나는 구조측면의 설계이다.

설계의 가장 큰 도전은 기능과 구조라는 두가지 측면을 함께 녹여 조화를 이루도록 만드는 것.

 

훌륭한 기능이 훌륭한 소프트웨어를 만드는 충분조건이라 한다면 훌륭한 구조는 훌륭한 소프트웨어를 만들기 위한 필요조건이다.

 

미래에 대비하는 가장 좋은 방법은 변경을 예측하는 것이 아니라 변경을 수용할 수 있는 선택의 여지를 설계에 마련해 놓는 것이다. 

 

전통적인 기능 분해(functional decomposition)는 자주 변경되는 기능을 중심으로 설계한 후 구조가 기능에 따르게 한다.

이것이 전통적인 기능분해 방법이 변경에 취약한 이유이다. 

기능 분해 방법의 경우 시스템 기능은 더 작은 기능으로 분해되고 각 기능은 서로 밀접하게 관련된 하나의 덩어리를 이루기 때문에 기능이 변경도리 경우 기능의 축을 따라 설계된 소프트웨어가 전체적으로 요동치게 된다.

 

객체지향 접근 방법은 자주 변경되지 않는 안정적인 객체 구조를 바탕으로 시스템 기능을 객체간 책임으로 분배한다. 

시스템 기능은 더 작은 책이믕로 분할되고 적절한 객체에게 분배되기 때문에 기능이 변경되더라도 객체간의 구조는 그대로 유지된다.

안정적인 객체 구조는 변경을 수용할 수 있는 유연한 소프트웨어를 만들 수 있는 기반을 제공한다.

구조

도메인 모델

소프트웨어를 사용하는 사람들은 자신이 관심을 가지고 있는 특정한 분야의 문제를 해결하기 위해 소프트웨어를 사용한다.

이처럼 사용자가 프르그램을 사용하는 대상 분야를 도메인이라고 한다.

 

도메인 모델에서 모델이란 대상을 단순화해서 표현한 것이다.

모델을 사용하면 현재의 문제와 관련된 측면은 추상화하고 그 밖의 관련 없는 세부사항에 대해서는 무시할 수 있다.

 

도메인이란 사용자가 프로그램을 사용하는 대상 영역에 대한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태이다.

도메인 모델은 소프트웨어 개발과 관련된 이해관계자들이 도메인에 대해 생각하는 관점이다. 

도메인 모델은 도메인에 대한 사용자모델, 디자인모델, 시스템 이미지를 포함하도록 추상화한 소프트웨어 모델.

도메인 모델은 소프트웨어에 대한 멘탈 모델이다.

 

개발된 최종 코드는 사용자가 도메인을 바라보는 관점을 반영해야한다. 이것은 곧 애플리케이션이 도메인 모델을 기반으로 설계돼야 한다는 것을 의미한다. 

도메인 모델이란 사용자들이 도메인을 바라보는 관점이며,

설계자가 시스템의 구조를 바라보는 관점인 동시에 소프트웨어 안에 구현된 코드의 모습 그 자체이다.

 

소프트웨어 객체를 창조하기 위해 우리가 은유해야하는 대상은 바로 도메인 모델이다.

도메인 모델을 기반으로 설계하고 구현하는 것은 사용자가 도메인 모델을 바라보는 관점을 그대로 코드에 반영할 수 있게 한다.

결과적으로 표현적 차이는 줄어들 것이며 사용자의 멘탈 모델이 그대로 코드에 녹아 스며들게 될 것이다.

 

소프트웨어의 존재이유는 사용자가 원하는 목표를 달성할 수 있는 다양한 기능을 제공하는 것이다. 

사용자에게 제공할 기능을 기술할 정보가 필요한데, 이것을 유스케이스라고 한다. 

 

유스케이스는 시스템의 이앻관계자들 간의 계약을 행위 중심으로 파악한다. 

유스케이스는 이해관계자들 중에서 일차 액터라 불리는 행위자의 요청에 대한 시스템의 응답으로서, 다양한 조건하에 있는 시스템의 행위를 서술한다.

시스템은 모든 이해관계자들의 요구에 응답하고, 이해관계를 보호해야한다. 

특별한 요청과 관계되는 조건에 따라 서로 다른 일련의 행위 혹은 시나리오가 전개될 수 있다.

유스케이스는 이렇게 서로다른 시나리오를 묶어준다.

 

유스케이스의 가치는 사용자들의 목표를 중심으로 시스템의 기능적인 요구사항들을 이야기 형식으로 묶을 수 있다는 점이다.

산발적으로 흩어져 있는 기능에 사용자 목표라는 문맥을 제공함으로써 각 기능이 유기적인 관계를 지닌 체계를 이룰 수 있게 한다.

 

사용자 목표가 유스케이스의 핵심이다. 유스케이스는 공통의 사용자 목표를 통해 강하게 연관된 시나리오의 집합이다.(마틴파울러)

 

유스케이스는 사용자와 시스템 간의 상호작용을 보여주는 텍스트이다. 유스케이스는 다이어그램이 아니다. 

유스케이스의 핵심은 사용자와 시스템 간의 상호작용을 일련의 이야기 흐름으로 표현하는 것이다.

시나리오를 유스케이스 인스턴스(use case instance)라고도 한다.

 

유스케이스의 강점은 단순히 기능을 나열하는 것이 아니라 이야기를 통해 연관된 기능을 함께 묶을 수 있다는 점이다.

유스케이스는 사용자 인터페이스와 관련된 세부정보를 포함하지 말아야한다.

사용자 관점에서 시트멩의 행위에 초점을 맞춘다. 

유스케이스는 내부 설계와 관련된 정보를 포함하지 않는다.

유스케이스의 목적은 연관된 시스템의 기능을 이야기형식으로 모으는 것이지 내부설계를 설명하는것이 아니다.

유스케이스는 단지 사용자가 시스템을 통해 무엇을 얻을 수 있고 어떻게 상호작용 할 수 있느냐에 관한 정보만 기술한다.

 

유스케이스는 단지 기능적인 요구사항을 사용자의 목표라는 문맥을 중심으로 묶기 위한 정리 기법일 뿐이다.

유스케이스는 객체의 구조나 책임에 대한 어떠한 정보도 제공하지 않는다.

 

도메인 모델은 안정적인 구조를 개념화하기 위해, 유스케이스는 불안정한 기능을 서술하기 위해 가장 일반적으로 사용하는 도구이다.

 

유스케이스는 사용자에게 제공할 기능을 시스템의 책임으로 보게 함으로써 객체간의 안정적인 구조에 책임을 분배.

도메인 모델은 기능을 수용하기 위해 은유할 수 있는 안정적인 구조를 제공.

책임-주도 설계는 유스케이스로부터 사용자가 달성하려는 목표를, 도메인 모델로부터 기능을 수용할 수 있는 안정적인 구조를 제공받아 실제로 동작하는 객체들의 협력 공동체를 창조한다.

 

안정적인 도메인 모델을 기반으로 시스템의 기능을 구현할 경우 시스템의 기능이 변경되더라도 비즈니스의 핵심 정책이나 규칙이 변경되지 않는한 전체적인 구조가 한번에 흔들리지 않음.

객체지향의 가장 큰 장점은 도메인을 모델링하기 위한 기법과 도메인을 프로그래밍하기위해 사용하는 기법이 동일하다는 것.

따라서 도메인 모델링에서 사용한 객체와 개념을 프로그래밍 설계에서의 객체와 클래스로 매끄럽게 변환할 수 있다.

이것을 연결 완전성이라고 한다.

 

객체지향이 강력한 이유는 연결완전성의 역방향 역시 성립한다는 것이다. 

즉 코드의 변경으로부터 도메인 모델의 변경 사항을 유추할 수 있다.

이것은 객체 지향 이전의 대부분의 개발 방법이 대응하지 못하고 쉽게 무너졌던 영역이다.

객체지향에서는 도메인 모델과 코드 모두 동일한 모델링 패러다임을 공유하기 때문에 코드의 수정이 곧 모델의 수정이 된다.

이처럼 모델에서 코드로의 매끄러운 흐름을 의미하는 연결완전성과 반대로 코드에서 모델로의 매끄러운 흐름을 의미하는 것을 가역성(Reversibility)이라고 한다.

 

도메인 모델은 코드와 분리된 별도의 산출물이 아니다.

도메인 모델은 문서나 다이어그램이 아니다. 

도메인 모델은 사람들의 머릿속에 들어있는 공유된 멘탈 모델이다.

코드의 변경이 곧 도메인 모델의 변경이다.

도메인 모델과 코드를 밀접하게 연관시키기 위해 노력하라.