카테고리 없음

Fan in, Fan out

구루마3단 2025. 3. 13. 22:52

Fan-in과 Fan-out에 대해 설명
Fan-in과 Fan-out은 소프트웨어 모듈의 복잡성과 결합도를 측정하는 중요한 지표입니다. 특히 모듈 기반 설계 및 계층적 시스템 구조를 이해하는 데 유용합니다. 이 두 지표는 모듈의 독립성, 재사용성, 유지보수 용이성 등을 평가하는 데 도움을 주며, 궁극적으로 고품질 소프트웨어 설계를 목표로 합니다.
1. Fan-in (팬-인): 유입 수
* 정의: 특정 모듈을 호출하는 다른 모듈의 수입니다. 즉, 하나의 모듈이 얼마나 많은 다른 모듈로부터 사용되는지를 나타냅니다.
* 의미:
   * 높은 Fan-in:  많은 모듈에서 해당 모듈을 재사용한다는 의미입니다. 이는 재사용성이 높고, 핵심 기능을 담당하는 모듈일 가능성이 큽니다.  중앙 집중적인 모듈, 유틸리티 모듈, 라이브러리 함수 등이 높은 Fan-in을 가질 수 있습니다.
   * 낮은 Fan-in:  몇 개의 모듈만이 해당 모듈을 사용한다는 의미입니다. 이는 특정 기능에 특화되었거나, 하위 레벨 모듈일 가능성이 있습니다. 때로는 불필요하게 격리된 모듈일 수도 있습니다.
2. Fan-out (팬-아웃): 유출 수
* 정의: 특정 모듈이 호출하는 다른 모듈의 수입니다. 즉, 하나의 모듈이 얼마나 많은 다른 모듈을 사용하는지를 나타냅니다.
* 의미:
   * 높은 Fan-out:  하나의 모듈이 많은 다른 모듈에 의존한다는 의미입니다. 이는 모듈이 복잡하고, 여러 하위 기능을 통합하는 역할을 할 가능성이 있습니다. 때로는 설계가 복잡하거나, 단일 책임 원칙을 위반했을 가능성도 있습니다. 컨트롤러 모듈, 복잡한 비즈니스 로직 모듈 등이 높은 Fan-out을 가질 수 있습니다.
   * 낮은 Fan-out:  하나의 모듈이 몇 개의 다른 모듈에만 의존하거나, 혹은 다른 모듈에 거의 의존하지 않는다는 의미입니다. 이는 모듈이 단순하고, 독립적이며, 특정 기능에 집중되어 있을 가능성이 큽니다.  높은 응집도를 가진 잘 설계된 모듈은 낮은 Fan-out을 가질 수 있습니다.
Fan-in과 Fan-out의 이상적인 범위 및 지침
Fan-in과 Fan-out에 대한 절대적인 "좋은" 범위는 없습니다. 이는 시스템의 특성, 복잡성, 아키텍처 스타일에 따라 달라집니다. 하지만 일반적인 지침과 고려해야 할 점들은 다음과 같습니다.
* Fan-in:
   * 일반적으로 높을수록 좋습니다. 높은 Fan-in은 재사용성을 나타내므로 긍정적인 신호입니다.
   * 극도로 높은 Fan-in:  그러나 지나치게 높은 Fan-in은 해당 모듈이 너무 많은 책임을 지고 있거나, 너무 많은 모듈이 하나의 모듈에 과도하게 의존하게 되는 중앙 집중화 문제를 야기할 수 있습니다. 이 경우 모듈을 더 작은 단위로 분리하거나, 인터페이스 설계를 개선하여 의존성을 완화하는 것을 고려해야 합니다.
* Fan-out:
   * 일반적으로 낮을수록 좋습니다. 낮은 Fan-out은 모듈의 독립성을 높이고, 변경에 대한 파급 효과를 줄여줍니다.
   * 극도로 높은 Fan-out:  지나치게 높은 Fan-out은 모듈이 너무 많은 책임을 수행하거나, 과도하게 많은 모듈과 결합되어 있다는 신호일 수 있습니다. 이는 모듈의 복잡성을 증가시키고, 유지보수를 어렵게 만들며, 오류 발생 가능성을 높입니다.  이러한 모듈은 재설계, 분할, 책임 재분배 등을 통해 Fan-out을 줄이는 것을 고려해야 합니다.
   * Fan-out 제약:  일부 설계 지침에서는 모듈의 Fan-out을 7 ± 2 정도로 제한하는 것을 권장하기도 합니다. 이는 인간의 인지 능력의 한계를 고려한 경험적인 규칙입니다. 하지만 절대적인 규칙은 아니며, 상황에 따라 유연하게 적용해야 합니다.
Fan-in과 Fan-out과 설계 품질
Fan-in과 Fan-out은 소프트웨어 설계 품질을 평가하고 개선하는 데 유용한 도구입니다.
* 모듈화 및 응집도/결합도:
   * 높은 Fan-in과 낮은 Fan-out을 동시에 갖는 모듈은 높은 응집도와 낮은 결합도를 가진 이상적인 모듈에 가깝습니다. 이러한 모듈은 독립적, 재사용 가능, 유지보수 용이하며, 시스템의 견고성을 높입니다.
   * 높은 Fan-out과 낮은 Fan-in을 동시에 갖는 모듈은 설계상의 문제점을 시사할 수 있습니다. 이러한 모듈은 다른 모듈에 많이 의존하지만, 다른 모듈로부터는 거의 재사용되지 않는, 즉 시스템 내에서 '고립된 복잡한 섬' 같은 존재가 될 수 있습니다. 이는 설계의 비효율성, 책임 분산 실패, 불필요한 복잡성 등을 나타낼 수 있습니다.
* 복잡성 관리:
   * Fan-out은 모듈의 직접적인 복잡성을 나타냅니다. 높은 Fan-out은 모듈 내부의 로직이 복잡하고, 여러 하위 모듈과의 상호작용을 관리해야 한다는 것을 의미합니다.
   * 시스템 전체의 복잡성을 관리하기 위해서는 Fan-out이 높은 모듈들을 집중적으로 분석하고, 필요하다면 더 작은 모듈로 분할하여 복잡성을 낮추는 노력이 필요합니다.
* 테스팅 및 유지보수:
   * Fan-out이 낮은 모듈은 테스트하기 쉽습니다. 의존하는 모듈 수가 적기 때문에 테스트 환경을 구성하고, 모듈의 동작을 검증하기가 비교적 간단합니다.
   * Fan-out이 높은 모듈은 테스트하기 더 어렵습니다. 많은 의존성 때문에 테스트 케이스를 설계하고 실행하는 것이 복잡해지며, 유지보수 시에도 변경에 대한 파급 효과를 예측하기 어려울 수 있습니다.
Fan-in과 Fan-out 활용
* 설계 초기: 시스템 아키텍처를 설계할 때, 각 모듈의 예상되는 Fan-in과 Fan-out을 미리 예측하고 설계에 반영할 수 있습니다. 예를 들어, 핵심 유틸리티 모듈은 높은 Fan-in을 예상하고, 복잡한 비즈니스 로직 모듈은 적절한 Fan-out을 유지하도록 모듈을 분할하는 등의 설계를 할 수 있습니다.
* 코드 리뷰 및 품질 검토: 코드 리뷰 과정에서 Fan-in과 Fan-out을 측정하여 설계 품질을 객관적으로 평가하고 개선점을 찾을 수 있습니다. 특히 Fan-out이 지나치게 높은 모듈은 리팩토링 대상이 될 수 있습니다.
* 시스템 분석 및 리팩토링: 기존 시스템을 분석하여 Fan-in과 Fan-out 분포를 파악하고, 시스템의 취약점이나 개선이 필요한 부분을 식별할 수 있습니다. 예를 들어, Fan-out이 높은 모듈을 분할하거나, 모듈 간의 불필요한 의존성을 제거하는 리팩토링을 통해 시스템 품질을 향상시킬 수 있습니다.
결론적으로, Fan-in과 Fan-out은 소프트웨어 모듈의 복잡성과 결합도를 이해하고, 더 나은 설계를 위한 방향을 제시해주는 유용한 지표입니다. 이 지표들을 적절히 활용하여 모듈 기반 설계를 개선하고, 유지보수 용이하고 견고한 소프트웨어를 개발하는 데 도움이 될 수 있습니다.
비유:
Fan-in과 Fan-out을 이해하는 데 도움이 되는 비유를 들어볼게요.
* Fan-in: 인기 있는 연예인을 생각해 보세요. 많은 팬(다른 모듈)들이 그 연예인(모듈)을 좋아하고 (호출하고)  그의 활동을 지켜봅니다. 인기 있는 연예인은 높은 Fan-in을 가집니다.
* Fan-out: 바쁜 감독을 생각해 보세요. 감독(모듈)은 영화 제작을 위해 배우, 촬영 감독, 음향 담당 등 많은 스태프(다른 모듈)들을 지휘하고 (호출하고) 협업합니다. 바쁜 감독은 높은 Fan-out을 가집니다.
좋은 소프트웨어 모듈은 마치 인기 있는 유틸리티 라이브러리와 같습니다. 많은 곳에서 재사용(높은 Fan-in) 되지만, 자체적으로 복잡한 외부 의존성(높은 Fan-out) 없이 독립적으로 잘 작동합니다. 반대로, 나쁜 소프트웨어 모듈은 마치 혼자만 사용하는 복잡한 블랙박스와 같습니다. 다른 모듈에서는 거의 사용하지 않지만(낮은 Fan-in), 내부적으로 많은 다른 모듈에 의존하여 복잡하게 얽혀있습니다(높은 Fan-out).