192. 모듈 (Module) - 독립적 기능을 수행하는 단위

핵심 인사이트: 레고 블록으로 성을 만들 때, 블록 하나하나가 바로 '모듈'이다. 각 블록은 혼자서도 완벽한 모양과 색깔(독립적 기능)을 가지며, 다른 블록과 쉽게 끼우거나 뺄 수 있어야 훌륭한 모듈이다. 소프트웨어 공학의 궁극적 목표는 이 훌륭한 레고 블록을 만드는 것이다.

Ⅰ. 모듈(Module)의 개념

크고 복잡한 소프트웨어를 개발할 때, 전체 시스템을 구성하는 독립적인 기능을 수행하는 가장 작은 단위를 말합니다. C언어의 함수(Function) 하나가 될 수도 있고, Java의 클래스(Class) 하나, 혹은 여러 클래스가 묶인 하나의 패키지(Package)나 라이브러리가 될 수도 있습니다.

Ⅱ. 모듈화 (Modularity)의 목적

수만 줄의 스파게티 코드를 모듈 단위로 쪼개는(Divide and Conquer) 이유는 명확합니다.

  1. 재사용성 (Reusability): 잘 만들어진 '결제 모듈'은 A쇼핑몰뿐만 아니라 B게임회사 프로젝트에도 그대로 복사해서 쓸 수 있습니다.
  2. 유지보수성 (Maintainability): 버그가 났을 때 전체 코드를 다 뒤질 필요 없이, 문제가 발생한 해당 모듈만 열어서 고치면 됩니다.
  3. 독립적 개발 (Parallel Development): A팀은 '로그인 모듈'을, B팀은 '검색 모듈'을 동시에 병렬로 개발할 수 있어 개발 기간이 획기적으로 단축됩니다.

Ⅲ. 모듈의 크기와 복잡도 (Trade-off)

모듈의 크기는 적절해야 합니다.

비용 (Cost)
  ▲
  │       [최적의 모듈 개수]
  │      *                  * ◀ 너무 잘게 쪼개면: 
  │     *                    *   모듈 간 통신비용(인터페이스) 폭발
  │    *                      *
  │  *                          *
  │* (너무 크게 만들면:          *
  │  하나의 모듈 개발비용 폭발)   *
  └──────────────────────────────────▶ 모듈 개수
  • 모듈을 너무 크게 만들면: 한 모듈 안에 기능이 너무 많아 복잡해지고, 재사용이 불가능해집니다.
  • 모듈을 너무 작게 만들면: 모듈 자체는 단순해지지만, 모듈끼리 데이터를 주고받는 연결(인터페이스) 작업이 너무 많아져서 시스템 전체의 조립 비용이 폭발합니다.

Ⅳ. 좋은 모듈의 절대 조건 (응집도와 결합도)

소프트웨어 공학에서 '설계를 잘했다'라고 평가하는 유일한 기준은 딱 2단어입니다.

  • 응집도 (Cohesion)는 높게 (High): 하나의 모듈 안에는 똘똘 뭉친 연관된 기능들만 있어야 합니다.
  • 결합도 (Coupling)는 낮게 (Low): 모듈과 모듈 사이의 연결 고리는 느슨해야(쉽게 뗐다 붙였다 할 수 있어야) 합니다.

📢 섹션 요약 비유: 스마트폰을 조립할 때, '카메라 부품(모듈)'은 사진 찍는 기능 하나만 완벽하게 수행하면 됩니다(높은 응집도). 만약 카메라 부품이 고장 났을 때 메인보드까지 뜯어내야 한다면 최악의 설계이고, 나사만 풀어서 새 카메라로 똑딱 갈아 끼울 수 있어야(낮은 결합도) 최고의 모듈 설계입니다.