개발의 편의 및 효율성을 위한 여러 가지 디자인 패턴과 형상 관리 기법들이 있다. 하지만 개발 중 가장 먼저 눈에 들어오고 직접적으로 가장 자주 보게 되는 것은 본인의 현재 개발 중인 디렉토리 일 것이다. 모두 각자 자신만의 정리 방식과 파일 분할 기준이 있을 것이다. 하지만 이 과정을 좀 더 정형화하여 정리하고자 할 때 아래 개념들이 도움이 될 수 있다.
관심사의 분리(separation of concerns, SoC)
이 관심사(concerns)라는 것은 어떻게 보면 추상적일 수 있다. 하지만 의미는 명확하다.
가장 낮은 레벨(실제 프로그래밍 코드)에서 SoC는 긴 복잡한 함수를 쓰지 말라고 이야기하고는 한다. 이는 함수의 크기가 커지기 시작하면 함수가 너무 많은 작업을 처리하게 되기 때문이다. 결국 이는 함수를 분리해야 하는 의미가 된다. 따라서 SoC를 통해 리팩토링하여 더 간결한 모양으로 만들어야 한다. 이 프로세스 중에 원래 알고리즘의 일부가 내보내지고 개인 액세스 수준을 가진 별도의 작은 함수로 캡슐화된다. 이 과정에서 코드는 보다 명확해지고 다른 부분에서 재사용할 수 있게 된다. 이 SoC는 Horizontal Separation과 Vertical Separation이 있다.
수평적 분리(Horizontal Separation)
수평적 분리는 애플리케이션 내에 동일한 롤을 수행하는 기능의 논리적 레이어 단위로 앱을 분리하는 프로세스를 말한다.
GUI 애플리케이션들이 공통적으로 분리하는 케이스는 Presentation, Business, Resource Access 레이어로 이뤄진 분리이다. 이런 카테고리 레이어들은 대부분의 애플리케이션이 필요한 주요 타입의 관심사를 포함하고 있고, 어플리케이션 내에 의존성 레벨을 최소화하는 관심사 구성에 해당한다.
- Presentation 레이어 주요 목표는 애플리케이션 도메인이 독립적으로 다변화될 수 있게 하기 위해 모든 UI 관심사를 캡슐화하는 것이다.
오직 필요한 시각적 디스플레이와 관련된 프로세스와 컴포넌트들만 포함해야 한다.(그 외 다른 컴포넌트와 프로세스는 배제해야 한다.) - Business 레이어는 애플리케이션 도메인과 관련된 컴포넌트와 프로세스를 포함한다.
객체 모델을 정의하고, 비즈니스 로직을 다루고, 시스템의 워크플로우를 통제하는 컴포넌트들을 포함한다. - Resource Access 레이어는 외부 정보 접근과 관련된 컴포넌트와 프로세스들을 포함한다.
로컬 데이터 스토어나 외부 서비스 인터페이스를 가진 컴포넌트를 포함한다.
수직적 분리(Vertical Separation)
관심사에 대한 수직적 분리는 애플리케이션을 기능 모듈로 분리하는 프로세스를 뜻한다. 수직적 분리는 전체 관점에서 애플리케이션의 기능들을 분리하고, 단일 경계 내에서 interface, business, resource access 관심사를 서로 연결시킨다.
뿐만 아니라 애플리케이션의 기능을 모듈 단위로 분리함으로써 기능의 의존성과 책임을 분명하게 할 수 있다. 이 경계들은 구조를 논리적으로 잡을 수 있게 도움을 주며 독립적인 개발과 유지 보수를 물리적으로 가능하게 해 준다. 이건 애플리케이션의 유지보수성을 향상하는데 도움을 줄 수 있고 테스트시에도 보다 효율적이다. 또한 물리적으로 기능을 분리하기 위한 미래의 노력을 줄여준다.
아래는 수직, 수평적 분리를 모두 사용하는 어플리케이션 구조의 예이다.
Cohesion and Coupling
SoC의 적용은 결합의 감소와 응집력의 증가라는 두 가지 과정을 포함한다.
- Cohesion(밀집도 or 응집도): 프로세스의 집합, 세부사항의 수준 및 지역 별 유사성의 척도
- Coupling(결합도): 시스템의 나머지 부분에 대한 부품의 의존도를 측정하는 것(저의존도 ~ 느슨한 커플링).
모듈의 재사용률이 낮아지고 몇 가지 다른 필수 구성요소를 가지게 될 수 있음.
따라서 SoC 적용 시 Decoupling(loose coupling)과 높은 응집력을 목표로 하는 것이 바람직하다. 만약 소스 코드의 로직이 기능이나 모듈의 경계를 모호하게 된다면 이는 코드의 응집도가 낮다는 것을 의미하는데, 이런 식의 코드가 남발하게 되면 자신의 코드가 스파게티 코드 또는 에일리언 코드라 불리게 되는 것을 지켜봐야 할지도 모른다.
참고 자료
https://velog.io/@seanlion/soc1
https://kaki104.tistory.com/725