brunch

응집도와 결합도와 현실

표현력과 확장성

by 김영빈


높은 응집도(Cohesion)와 낮은 결합도(Coupling)는 소프트웨어 설계의 기본적인 목표다. 이는 시스템을 명확하고 유지보수하기 쉽게 만들며, 변화하는 요구사항에 유연하게 대응할 수 있도록 한다. 응집도는 모듈 내부의 구성 요소들이 얼마나 강하게 관련되어 있는지를 나타내며, 결합도는 모듈 간의 의존성이 얼마나 적은지를 나타낸다.

응집도와 결합도는 소프트웨어 품질에 큰 영향을 미친다. 높은 응집도는 모듈이 단일 책임을 가지며, 내부 로직이 명확하고 일관성 있게 구성되어 있음을 의미한다. 반면, 낮은 결합도는 모듈들이 서로 독립적으로 동작할 수 있어, 한 모듈의 변경이 다른 모듈에 최소한의 영향을 미치게 한다. 이러한 특성은 시스템의 안정성과 유지보수성을 높여준다.


표현력(Expressiveness)과 확장성(Scalability)은 현대 비즈니스 소프트웨어의 핵심적인 목표이다. 표현력이 뛰어나면 복잡한 비즈니스 요구사항을 정확하고 효율적으로 시스템에 반영할 수 있다. 확장성이 높으면 시스템은 증가하는 사용자 수나 데이터 양에 대응할 수 있으며, 새로운 기능을 추가하는 것이 용이하다. 따라서 두 요소 모두 소프트웨어의 성공에 필수적이다.

높은 응집도와 낮은 결합도는 표현력과 확장성을 모두 만족한다. 표현력은 복잡한 비즈니스 로직을 효과적으로 구현하고 처리할 수 있는 능력을 말한다. 응집도가 높을수록 모듈은 복잡한 로직을 명확히 담아낼 수 있으며, 이는 표현력을 향상시킨다. 또한, 결합도가 낮으면 시스템은 새로운 기능이나 요구사항에 대해 쉽게 확장될 수 있어 확장성이 높아진다.


그러나 현실에서는 표현력과 확장성이 트레이드오프 관계에 있다. 표현력을 극대화하기 위해 복잡한 도메인 로직을 설계에 모두 녹여내려고 하면, 엔티티 간의 관계를 세밀하게 매핑하고 Lazy Loading이나 Fetch Join 같은 전략을 활용해야 한다. 이러한 방식은 비즈니스 로직을 충실히 반영하지만, 성능 최적화를 어렵게 만들고 유지보수 비용을 증가시킨다. 결과적으로, 대규모 트래픽을 처리하거나 성능을 보장해야 하는 상황에서 한계를 드러낸다.

반대로, 확장성을 극대화하기 위해 설계를 단순화하고 CQRS나 SQL 기반의 조회 모델을 도입하면 성능적으로 유리하고 대규모 데이터를 처리하기 쉬워진다. 하지만, 이러한 접근은 서비스 계층이나 코드에 도메인 로직이 과하게 분산되도록 만들 수 있다. 이는 도메인 모델의 일관성과 명확성을 저하시켜, 비즈니스 로직 변경 시 오류가 발생할 위험을 증가시킨다. 결국, 표현력과 확장성을 극단적으로 추구할 경우 각각 다른 한계와 문제를 마주하게 된다.

아래는 표현력 중심 설계와 확장성 중심 설계의 차이를 나타낸다

특징 || 표현력 중심 | 확장성 중심

중점 || 비즈니스 로직과 데이터 모델의 안정성과 명확성 | 성능과 확장성 최적화

설계 || 철학객체와 비즈니스 로직 중심 | 데이터 중심 설계

데이터 접근 방식 || ORM | Native Query

일관성 || 강한 일관성 (Strong Consistency) | 최종 일관성 (Eventual Consistency)

처리 방식 || 동기 처리 (Synchronous) | 비동기 처리 (Asynchronous)

읽기/쓰기 모델 || CRUD | CQRS

장점 || 안정성과 유지보수성 | 성능과 확장성

단점 || 확장성의 제한 | 설계 및 유지보수의 복잡성

사례 || 복잡한 도메인 로직(전자상거래, 금융 시스템) | 대규모 데이터 처리(SNS, 통계 시스템, 대시보드)


이러한 트레이드오프를 해결하기 위해서는 다양한 접근이 있다. 방법 중 하나는 도메인을 목적에 따라 논리 도메인과 조회 도메인으로 분리하는 것이다. 논리 도메인에서는 ORM을 통해 비즈니스 로직을 충실히 표현하고, 조회 도메인에서는 SQL과 같은 데이터 중심의 접근을 통해 성능을 확보하는 방식이 효과적이다.

설계 수준을 벗어나서도 표현력과 확장성의 균형을 맞추는 노력을 할 수 있다. 테스트를 통해서는 소프트웨어의 표현력을 보강할 수 있고, 모니터링을 통해서 소프트웨어의 확장성을 감시할 수 있다.

추가로 설계의 유연성을 확보하기 위해 인터페이스 기반 설계와 모듈화를 활용하여 시스템의 진화 가능성을 열어두는 것도 중요하다; 인터페이스 기반 설계와 모듈화는 높은 응집도와 낮은 결합도를 의미한다.


높은 응집도와 낮은 결합도는 소프트웨어 설계의 이상적인 목표이자 북극성과 같다. 이는 모든 설계의 방향성을 제시하지만, 현실에서는 표현력과 확장성 사이의 트레이드 오프라는 진흙 속에서 끊임없이 선택과 타협을 해야 한다. 복잡한 비즈니스 로직을 어떻게 녹여낼 것인가, 변화하는 요구사항에 어떻게 유연하게 대응할 것인가라는 질문 앞에서 설계자는 항상 고민할 수밖에 없다.

이러한 현실의 복잡성과 모호함이 소프트웨어 설계의 본질적인 어려움이다. 하지만, 바로 이 트레이드오프를 이해하여 시스템을 설계하는 적절한 선택이 개발자를 의미 있는 존재로 만든다. 결국, 소프트웨어 설계는 이상과 현실 사이에서 최선을 다해 균형을 찾는 치열한 과정이다. May the code be with you.

keyword
작가의 이전글제품과 상품