모듈화와 응집도/결합도 완벽 정리 (+ 코드 예제)

소프트웨어 개발에서 좋은 설계를 만드는 핵심 요소 중 하나는 '모듈화(Modularity)' 입니다.

모듈화가 잘된 소프트웨어는 유지보수성이 뛰어나고 재사용성이 높으며 협업에도 유리합니다!

 

이 글에서는 모듈화의 개념, 응집도(Cohesion)와 결합도(Coupling)의 관계, 그리고 좋은 설계를 위한 원칙과 코드 예제까지 자세히 설명해드리려고 합니다.


1. 모듈화란?

✅ 모듈화(Modularity)의 정의

모듈화란 프로그램을 독립적인 여러 개의 모듈로 나누어 개발하는 기법입니다.

하나의 모듈은 특정한 기능을 수행하며, 다른 모듈과 최소한의 상호작용만을 갖도록 설계됩니다.

 

✅ 모듈화를 적용하면 좋은 점

  • 유지보수성 향상 : 특정 모듈만 수정하면 되기에 변경이 용이함
  • 재사용성 증가 : 다른 프로젝트에서도 재사용이 가능함
  • 개발 생산성 향상 : 여러 개발자가 동시에 작업이 가능함
  • 디버깅 용이 : 오류 발생 시 특정 모듈만 점검하면 됨

2. 응집도(Cohesion)와 결합도(Coupling)

✅ 응집도(Cohesion)란?

응집도는 모듈 내부 구성 요소들이 얼마나 밀접하게 연관되어 있는지를 나타내는 지표입니다.

높은 응집도 = 모듈 내부의 기능이 하나의 목적을 위해 강하게 결합

 

✅ 결합도(Coupling)란?

결합도는 다른 모듈과의 의존성이 얼마나 강한지를 나타내는 지표입니다.

낮은 결합도 = 모듈이 독립적으로 동작할 수 있음

 

✅ 좋은 소프트웨어 설계를 위한 원칙

  • 응집도는 높이고 결합도는 낮춘다.
  • 각 모듈이 독립적으로 동작하도록 설계해야 유지보수가 용이함
  • 모듈 간 인터페이스를 최소화하여 변경 영향을 줄임

응집도 높은 코드 / 응집도 낮은 코드


3. 코드 예제로 이해하는 응집도와 결합도

🚫 나쁜 예시: 낮은 응집도, 높은 결합도

class OrderProcessor:
    def __init__(self):
        self.logger = Logger()
    
    def process_order(self, order):
        self.logger.log("Processing order...")
        # 주문 처리 로직
        print("Order processed: ", order)

 

📌 문제점

  • OrderProcessor 클래스가 Logger 클래스에 직접 의존함 (높은 결합도)
  • 주문 처리와 로깅 기능이 하나의 클래스에 포함됨 (낮은 응집도)

✅ 개선 예시: 높은 응집도, 낮은 결합도

class Logger:
    def log(self, message):
        print(f"LOG: {message}")

class OrderProcessor:
    def __init__(self, logger):
        self.logger = logger  # 의존성 주입 (Dependency Injection)
    
    def process_order(self, order):
        self.logger.log("Processing order...")
        print("Order processed: ", order)

# 사용 예시
logger = Logger()
order_processor = OrderProcessor(logger)
order_processor.process_order("#1234")

 

📌 개선점

  • Logger 모듈을 외부에서 주입하여 결합도 감소
  • OrderProcessor는 주문 처리에 집중하여 응집도 증가

4. 모듈화를 잘하는 팁

✅ SOLID 원칙 적용

  • SRP(단일 책임 원칙) : 하나의 클래스는 하나의 책임만 가져야 한다.
  • OCP(개방 폐쇄 원칙) : 기존 코드를 수정하지 않고 기능을 확장할 수 있어야 한다.
  • DIP(의존 역전 원칙) : 상위 모듈이 하위 모듈에 직접 의존하지 않도록 인터페이스를 활용한다.

✅ 좋은 모듈 구조 설계

  • 기능별로 모듈을 분리 (ex. UserModule, OrderModule, PaymentModule 등)
  • API 설계 시 인터페이스를 활용하여 결합도를 낮춘다.
  • 공통 모듈은 별도 패키지로 관리하여 재사용성을 높인다.

결론.  좋은 모듈화가 좋은 코드로 이어진다!

모듈화를 잘하면 유지보수와 확장이 쉬운 소프트웨어를 만들 수 있습니다.

 

요약

  • 응집도는 높이고 결합도는 낮춘다.
  • SOLID 원칙을 적용하여 모듈 설계를 개선
  • 의존성 주입(DI) 등을 활용하여 모듈 간 결합도 최소화

모듈화가 잘된 소프트웨어는 협업과 유지보수가 쉬워지고 코드 품질이 크게 향상됩니다.