응집도와 결합도 (cohesion and coupling)

컴퓨터과학·AI
한 줄 정의: 모듈 내부가 하나의 목적으로 뭉친 정도와 모듈들이 서로 얽힌 정도를 뜻하는 설계 척도입니다.

쉽게 풀면

좋은 설계의 오래된 기준 두 가지입니다. 응집도는 한 모듈 안의 코드들이 같은 목적을 위해 모여 있는지를 보고, 결합도는 그 모듈이 다른 모듈의 사정을 얼마나 많이 알아야 하는지를 봅니다. 응집도는 높고 결합도는 낮을수록, 한 곳을 고칠 때 다른 곳이 덩달아 깨지는 일이 줄어듭니다.

왜 중요한가

변경의 파급 범위를 예측 가능하게 만드는 것이 설계의 목적이라면, 이 두 척도가 그 목적을 가장 직접적으로 표현합니다. 모듈 분할, 계층 구조, 마이크로서비스 경계 설정 등 규모를 막론하고 같은 원리가 적용됩니다. 소프트웨어 설계 교과서에서 가장 먼저 배우는 개념 쌍입니다.

논문에서는 이렇게 쓰입니다

"모듈 간 결합도를 낮추기 위해 구체 구현 대신 인터페이스에 의존하도록 변경하고 응집도가 낮은 모듈을 분리하였다."

서로의 내부 사정을 덜 알게 만들고 성격이 다른 코드를 갈라놓았다는 뜻입니다.

조금 더 깊게 보면

1970년대 구조적 설계 연구에서 응집도는 우연적·논리적·시간적에서 기능적 응집까지, 결합도는 내용·공통 결합에서 데이터 결합까지 단계로 분류되었습니다. 결합도를 낮추는 표준 수단은 인터페이스를 통한 의존과 의존성 주입이며, 응집도를 높이는 수단은 한 모듈이 한 가지 이유로만 바뀌도록 책임을 나누는 것입니다. 이 두 원리가 SOLID 원칙마이크로서비스 아키텍처의 경계 설정 지침으로 이어집니다.

주의할 점

결합도를 낮추려고 추상화 계층을 과도하게 넣으면 코드 흐름을 따라가기 어려워져 오히려 이해 비용이 커집니다. 두 척도 모두 정확한 수치가 아니라 설계 판단을 돕는 정성적 기준이라는 점을 유념해야 합니다.

관련 용어