본문으로 건너뛰기

컴포넌트 응집도

· 약 10분

보통 모듈의 독립성을 판단하는 지표로 응집도와 결합도를 이야기합니다. 응집도는 높을수록 좋고 결합도는 낮을수록 좋다는 이야기를 많이 들어봤는데 프론트엔드에서 어떻게 적용할 수 있을지 적어보았습니다.

응집도란

응집도는 모델이 책임지는 역할을 위해서 필요한 데이터와 메소드들이 얼마나 밀접하게 연관되어 있는지를 이야기 합니다.

왜 응집도가 높아야 할까?

응집도가 높으면 다음과 같은 장점이 있습니다.

1. 이해하기 쉽다.

높은 응집도는 컴포넌트의 목적을 명확히 합니다. 모듈은 하나의 기능만 하고 모듈의 요소들은 이 하나의 기능을 위해서 함께 작동하게 됩니다.

2. 테스트하기 쉽다.

위의 내용과 연관되지만 컴포넌트가 하나의 일만 하기에 테스트하기 쉽습니다. 응집도가 높은 컴포넌트는 하나의 기능만 수행하기에 예측하기 쉽고, input에 대해 혹은 interface를 바탕으로 컴포넌트가 예측한 일을 수행하고 있는지만 테스트하면 됩니다.

3. 재사용하기 쉽다.

응집도가 높은 컴포넌트는 뒤죽박죽 임의로 선택된 데이터와 메소드로 구성되지 않고 컴포넌트를 구성하는 모든 요소들은 서로 공유하는 중요한 목적이 있습니다.

4. 유지보수하기 쉽다.

응집도가 높은 컴포넌트는 컴포넌트 변경의 이유가 한 개이고, 코드의 변경이 발생했을 때 변경이 여러 컴포넌트로 분산되지 않고 단일 컴포넌트에서 발생하기에 유지보수하기 쉽습니다.

응집도를 높히는 법

테스트를 먼저 작성하라

테스트코드를 내 코드가 올바르게 동작하도록 검증해주는 단순한 도구가 아니라 응집도 있는 설계, 사용하기 좋은 코드를 만드는데 도움이 되는 도구로 활용할 수 있습니다. 높은 응집도를 가진 모듈은 이해하기 쉽고 의도를 파악하기 쉬우며 테스트하기 쉽다고 했습니다. 그렇다고 높은 응집도를 가진 것이 좋은게 아니라 그 목적에 맞게 필요한 만큼만 응집되어 있어야 합니다. 그리고 응집도는 컴포넌트를 나누는 기준이 됩니다.

만약 하나의 컴포넌트를 테스트하는 테스트코드가 늘어나면 컴포넌트를 더 작게 나눠야하는 신호로 받아들여야 합니다.

REP: 재사용/릴리즈 등가 원칙

재사용 단위는 릴리즈 단위와 같다.

노트

해당 내용은 클린 아키텍처 책에서 가져온 내용입니다. 클린 아키텍처에서는 컴포넌트를 프론트엔드와는 조금 다르게 설명하지만(클래스들의 묶음) 본질적인 내용은 같기에 프론트엔드 컴포넌트의 관점으로 설명하겠습니다.

이 원칙은 소프트웨어 설계와 아키텍처 관점에서 보면 단일 컴포넌트는 응집성 높은 요소들(데이터 & 함수)로 구성되어야 함을 뜻합니다. 단순히 뒤죽박죽 임의로 선택된 요소들로 구성되어서는 안됩니다. 컴포넌트를 구성하는 모든 요소는 서로 공유하는 중요한 목적이 있어야 합니다.

CCP: 공통 폐쇄 원칙

동일한 시점에 동일한 이유로 변경하는 것들을 한데 묶어라. 서로 다른 시점에 다른 이유로 변경되는 것들을 서로 분리하라.

동일한 이유로 동일한 시점에 변경되는 요소를 같은 컴포넌트로 묶어야하고 서로 다른 시점에 다른 이유로 변경되는 클래스는 다른 컴포넌트로 분리해야 합니다. 이 원칙은 단일 책임 원칙(SRP)를 컴포넌트 관점에서 다시 쓴 것입니다. SRP에서 단일 클래스는 변경의 이유가 여러 개 있어서는 안 된다고 말하듯이, 공통 폐쇄 원칙에서도 마찬가리로 하나의 컴포넌트는 변경의 이유가 여러 개 있어서는 안 됩니다.

대다수의 애플리케이션에서 유지보수성은 재사용성보다 훨씬 중요합니다. 코드가 반드시 변경되어야 한다면, 이러한 변경이 여러 컴포넌트에 분산되어 발생하기 보다는, 차리리 변경 모두가 단일 컴포넌트에서 발생하는 편이 낫습니다.

CCP는 이런 이유로 변경될 가능성이 있는 요소는 모두 한 곳으로 묶을 것을 권합니다. 물리적 또는 개념적으로 강하게 결합되어 항상 함께 변경되는 클래스들은 하나의 컴포넌트에 속해야 합니다.

이 원칙은 개방 폐쇄 원칙(OCP)와도 밀접하게 연관되어 있습니다. 실제로 CCP에서 말하는 폐쇄는 OCP에서 말하는 폐쇄와 그 뜻이 같습니다. CCP에서는 동일한 유형의 변경에 대해 닫혀 있는 클래스들을 하나의 컴포넌트로 묶음으로써 OCP에서 얻은 교훈을 그대로 적용할 수 있습니다. 따라서 변경이 필요한 요구사항이 발생했을 때, 그 변경이 영향을 주는 컴포넌트들이 최소한으로 한정될 가능성이 높아지게 됩니다.

CRP: 공통 재사용 원칙

필요하지 않는 것에 의존하게 강요하지 말라.

CRP도 요소들을 어느 컴포넌트에 위치시킬지 결정할 때 도움이 되는 원칙입니다. CRP에서는 같이 재사용되는 경향이 있는 요소들은 같은 컴포넌트에 포함해야 한다고 말합니다. 대체로 재사용 가능한 요소들은 재사용 컴포넌트의 일부로써 해당 컴포넌트의 다른 요소들과 상호작용하는 경우가 많습니다. CRP에서는 이런 요소들이 동일한 컴포넌트에 포함되어야 한다고 말합니다. 이러한 컴포넌트 내부에서는 요소들 사이에 수많은 의존성이 있으리라고 예상할 수 있습니다.

다른 컴포넌트와 의존성이 조금이라도 발생하면 재사용성이 떨어지게 됩니다. 따라서 CRP는 강하게 결합되지 않는 요소들을 동일한 컴포넌트에 위치시켜서는 안된다고 말합니다.

Reference

  • FEConf2021 한윤석님의 "우리는 응집도에 대하여 이야기할 필요가 있다"
  • [클린 아키텍처] 로버트 C. 마틴