반응형

인상깊은 부분

응집에 대한 정의

이 책에서는 응집을 아래와 같이 정의하였다. 언뜻 직관적으로 표현하였지만, 해석의 여지가 많아보인다. 코드 레벨의 설계에 대한 공부를 하려면 다른 책을 읽는 게 좋겠다.

응집은 한 모듈의 파트가 동일한 모듈 안에 얼마나 포함되어 있는지를 나타냅니다. 다시 말해, 모듈을 구성하는 파트가 서로 얼마나 연관되어 있는가, 하는 것입니다. 이상적으로 응집된 모듈이라면 모든 파트가 함께 패키징되어 있겠죠.

오브젝트 책에서는 응집도와 결합도에 대해 아래와 같은 질문을 던졌다.
오브젝트 책에서 말한 응집도, 결합도에 대한 정의와 질문에 대한 답은 별도 포스팅할 예정이다.

모듈 내의 요소가 얼마나 강하게 연관돼 있어야 응집도가 높다고 말할 수 있는가? 모듈 사이에 어느 정도의 의존성만 남겨야 결합도가 낮다고 말할 수 있는가?


요약

모듈성에 대한 공인된 정의는 따로 없으니, 이 책에서 나름대로 정의를 내려본다. 모듈성은 일종의 구성 원리(organizing principle)이다.

3.1 모듈성 정의

  • 코드를 어떻게 패키징 하는지는 아키텍처에 중요한 영향을 미친다
  • 커플링된 구조의 코드라면 모놀리스를 나누는 데(= 아키텍처를 재구축) 걸림돌이 된다

3.2 모듈성 측정

  • 모듈성은 아키텍트에게 중요한 주제이므로 이것을 이해할 도구가 필요함
  • 세가지 핵심 개념 응집, 커플링, 커네이선스를 소개
  • 응집 (cohesion)
    • 한 모듈의 파트가 동일한 모듈 안에 얼마나 포함되어 있는지를 나타냄 (=모듈을 구성하는 파트가 서로 얼마나 연관되어있는지)
    • 응집은 커플링보다 덜 정확한 매트릭이므로 아키텍트 재량에 따라 측정된 모듈의 응집도는 다름
    • 컴퓨터 과학자들은 응집의 주관성을 전제로, 응집도를 가늠할 수 있는 카이댐버와 케메러의 '객체 지향 메트릭 스위트(object-oriented metrics suite)' 메트릭을 개발
    • 메서드의 응집 결여도(Lack of Cohesion in Methods, LCOM)은 모듈(보통 컴포넌트)의 구조적 응집도를 나타냄
  • 커플링
    • 코드베이스의 커플링은 그래프 이론에 기반한 좋은 분석 도구들이 존재 (메서드의 호출과 반환은 호출 그래프를 형성하므로 수학적 분석이 가능)
    • 추상도 : 추상체와 구현체의 비율, 즉 구현 대비 추상화 정도 (= 작성한 코드의 추상화율을 수치화함)
    • 불안정도 : 원심 커플링과 (구심 커플링 + 원심 커플링)의 비율 (= 코드베이스의 변동성을 의미)
    • 메인 시퀀스로부터의 거리 : 불안정도와 추상도를 이용하여 계산 (아키텍처 구조를 평가하는 메트릭스 중 하나)
  • 커네이선스
    • 두 컴포넌트 중 한쪽이 변경될 경우 다른 쪽도 변경해야 전체 시스템의 정합성의 맞는다면 이돌은 커네선스를 갖고 있는 것이다. (= 변경 의존성, 결합된 상태)
    • 정적 커네이선스 : 실행 시간 커플링과 반대인 소스 코드 레벨의 커플링
    • 동적 커네이선스 : 런타임 시점
    • 커네이선스 속성
      • 강도 : 개발자가 어떤 유형의 커네이선스를 얼마나 쉽게 리팩터링 할 수 있는지에 따라 커네이선스 강도를 결정 (동적 커네이선스보다 정적 커네이선스가 리팩토링하기 쉽다)
      • 지역성 : 코드베이스의 모듈들이 서로 얼마나 가까이 있는가 (근접한 코드는 더 분리된 코드보다 높은 형태의 커네이선스를 가짐)
        • 모듈은 서로 떨어뜨렸을 떄 커플링이 형편없는 형태의 커네이선스는 모듈을 서로 가까이 붙여 놓는 식으로 개선할 수 있음 (?)
        • 강도와 함께 지역성을 고민해야함. 동일한 모듈에서 더 강한 형태의 커네이선스가 발견된다면 그와 동일한 커네이선스가 널리 흩어져 있는 것보다는 코드 스멜이 덜하다는 증거임 (?)
      • 정도 : 커네이선스가 미치는 영향의 규모 (값이 작을수록 바람직)
        • 페이지 존스가 제안한, 커네이선스를 이용한 시스템의 모듈성을 개선하는 세 가지 방법
          • 시스템을 캡슐화한 요소들로 잘게 나누어 전체 커네이선스를 최소화한다.
          • 캡슐화 경계를 벗어나는 나머지 커네이선스를 모조리 최소화한다.
          • 캡슐화 경계 내부에서 커네이선스를 최대화한다.
    • 커플링과 커네이선스 메트릭을 통합
      • 그림 3-6 구조적 프로그래밍의 커플링 개념은 왼쪽, 커네이선스 특성은 오른쪽에 표시
    • 1990년대 커네이선스의 문제점 (이런 메트릭을 적용하여 시스템 분석/설계 시의 문제점)
      • 아키텍처 구조보다는 저수준 코드의 세부를, 코드 품질 및 정리 상태 위주로 관찰함. 아키텍트 입장에서는 커플링 저도 보다는 모듈이 어떻게 커플링 되어있는지가 더 궁금한 관심사. 동기 통신 or 비동기 통신이냐를 고민하지 그것을 어떻게 구현할지는 별로 관심사가 아님
      • 요즘 아키텍트가 내려야할 근본적인 결정(마이크로서비스 같은 분산 아키텍처에서 동기 통신이냐, 비동기 통신이냐 등의)에 관한 문제는 다루지 않음
    • 커네이선스를 바라보는 새로운 사고 방식은 7장에서 다룰 예정
반응형