brunch

소프트웨어 커플링의 종류

"Balancing Coupling in Software Design"

by 심야서점
제목을 입력해주세요_-001 (18).png


소프트웨어 모듈러 디자인은 어떻게 수행해야 하는가 질문을 받으면 비슷하게 대답합니다. "소프트웨어 구조적 설계 원칙"만 지켜도 모듈러 디자인의 원리 대부분을 지키는 것이라고 말합니다.


이번 글에서는 "Balancing Coupling in Software Design"에서 나온 Software Module Coupling의 종류에 대해서 소개하고자 합니다.


모듈러 디자인에서 좋은 모듈은 모듈 간의 의존성을 최소화한 모듈이라고 말합니다. 이를 위해서는 소프트웨어 영역에서는 모듈 간의 의존성, 즉 커플링을 어떻게 분류하는지 아는 것이 중요합니다. 그리고, 그 분류는 소프트웨어 구조적 설계 고전에서 제시됐을 만큼 고전에 가깝습니다.


모듈 간 의존성, 커플링의 분류를 알아봄으로써 좋은 소프트웨어 모듈을 어떻게 만들지 힌트를 얻는다면 이번 글의 목적을 충분히 했다고 볼 수 있겠습니다. 모듈 간의 의존성의 분류는 모듈 간의 연결성 수준에 따라서 이루어집니다.


1. 콘텐츠 의존성 (Content Coupling)


콘텐츠 의존성은 모듈 별로 공개된 인터페이스가 아니라, 모듈 내부를 구성하는 숨겨진 인터페이스 또는 내부 구현 코드를 활용하여 모듈 간의 연결이 이루어지는 것입니다.


이것은 모듈을 블랙박스로 보는 것이 아니라, 내부를 훤히 볼 수 있는 화이트박스로 바라보고 활용하는 겁니다. 의존성 중에 가장 높은 수준이라고 볼 수 있겠죠.


콘텐츠 의존성을 활용할 경우, 서비스를 제공하는 모듈은 모르겠지만, 서비스를 제공받는 모듈은 제공하는 모듈에 강한 의존 관계를 갖기 때문에 서비스를 제공하는 모듈의 변경이 일어나면 크게 바뀌게 됩니다.


2. 공통 데이터 의존성 (Common Coupling)


두 개 이상의 모듈이 모듈 외부에 있는 전역 변수를 공유함으로써 상호 간의 연계하는 의존성이 공통 데이터 의존성입니다. 전역 저장 위치에 있는 데이터를 읽고 쓰는 작업을 통해서 모듈들이 상호 제어되는 형태입니다.


얼핏 보면 데이터가 모듈 외부에 있으니까 의존성이 낮아 보이지만, 모듈들이 서로 연계를 위해서 데이터 구조를 사전에 합의해야 하고, 확장을 위해서는 데이터 구조를 변경하고, 기존에 만든 모듈들도 영향을 받기 때문에 의존성이 높은 모듈 의존성 분류로 볼 수 있습니다.


게다가 모듈 내부에 공통 데이터에 대한 코드를 확인하기가 어렵기 때문에 모듈 단독으로 로직이나 기능을 변경하기가 쉽지 않습니다.


3. 외부 의존성 (External Coupling)


다음 외부 의존성은 모듈 간의 연계를 위해서 외부 데이터를 활용한다는 점에서 공통 데이터 의존성과 유사하지만, 공통 데이터 의존성과 달리 모든 데이터를 공개하진 않습니다. 대신, 외부에 있는 데이터 중에서 일부를 모듈 간의 연계를 위해서 공개를 합니다.


4. 제어 의존성 (Control Coupling)


하나의 모듈이 다른 모듈의 내부 실행 흐름을 제어할 때, 서로 제어 의존성을 갖는다고 말합니다. 하나의 모듈이 제공하는 데이터 값에 따라서 또 다른 모듈이 수행해야 하는 실행 흐름이 달라지게 됩니다. 이와 같은 의존성을 갖는 모듈들은 적절하게 추상화가 된 모듈이라고 볼 수 없습니다. 하나의 모듈이 또 다른 모듈 내부의 로직에 대해서 상당한 지식을 가지고 있어야만 가능한 의존성입니다.


그래서, 하나의 모듈이 다른 모듈에 영향을 미치지 않고, 모듈의 수정을 작업할 수 없습니다. 그렇지만, 제어 의존성은 외부 의존성보다는 낮은 연결관계를 갖는다고 볼 수 있습니다.


5. 스탬프 의존성 (Stamp Coupling)


스탬프 의존성은 모듈 간에 약속된 데이터 구조를 주고받음으로써 연계가 이루어질 때 갖는 의존성을 말합니다. 일반적으로 이러한 의존성을 위해서 활용되는 데이터 구조에는 어느 정도 구현에 대한 지식이 포함되어 있습니다. 즉, 서로 주고받는 약속을 해야만 하는 의존성입니다. 그렇지만, 앞선 제어 의존성보다는 낮은 연결관계를 갖습니다. 그리고, 스탬프 의존성에 사용되는 데이터 구조에는 비즈니스 로직이 포함되지 않습니다. 그렇기 때문에 상대적으로 모듈 별로 수정이 용이한 편입니다.


6. 데이터 의존성 (Data Coupling)


가장 낮은 연결관계를 갖는 의존성은 데이터 의존성입니다. 데이터 의존성은 비즈니스 로직에 대해서 모듈 상호 간의 사전 지식이 필요가 없습니다. 그리고, 모듈 간의 연계를 위해서 알아야 할 정보도 최소화됩니다.


종합하면, 콘텐츠 의존성 > 공통 데이터 의존성 > 외부 의존성 > 제어 의존성 > 스탬프 의존성 > 데이터 의존성 순으로 연결관계가 작아집니다. 즉, 그만큼 모듈 간의 의존성이 낮아짐을 의미합니다.


- 콘텐츠 의존성은 모듈 간의 구현 상세 내용을 공유하므로 가장 높은 의존성을 보입니다.

- 공통 데이터 의존성은 모듈 간의 전역 변수를 공유함으로써 그다음으로 높은 의존성을 보입니다.

- 외부 의존성은 공통 데이터 의존성보다 꼭 필요한 전역 변수를 공유함으로써 그다음으로 높은 의존성을 보입니다.

- 제어 의존성은 설계 결정, 비즈니스 로직을 모듈 간에 공유함으로 그다음으로 높은 의존성을 보입니다.

- 스탬프 의존성은 데이터 구조를 공유함으로 그다음으로 높은 의존성을 보입니다.

- 마지막으로 데이터 의존성은 연계에 필요한 데이터, 데이터 구조를 선별하여 공유함으로써 가장 낮은 의존성을 보입니다.


이번 글에서는 "Balancing Coupling in Software Design"에 나온 모듈 의존성의 종류를 알아보았습니다. 모듈러 디자인을 소프트웨어 적용한다는 것은 구조적인 설계를 잘한다는 말과 일맥상통합니다. 냄새나지 않는 코드, 냄새나지 않은 설계를 하는 것이야 말로 진정한 모듈러 디자인을 수행하는 것으로 볼 수 있지 않을까요?

keyword
매거진의 이전글현대기아자동차그룹의 X-Shoulder 사례