문제
소프트웨어 아키텍처에서 **팬인(Fan-in)**과 **팬아웃(Fan-out)**의 개념을 설명하고, 각각이 시스템의 결합도와 복잡도에 미치는 영향을 분석하여 바람직한 설계 특성을 도출하시오. 또한 높은 팬아웃이 발생하는 구체적 상황과 이를 개선하기 위한 설계 패턴 또는 기법을 제시하시오.
정답
팬인은 특정 모듈을 호출하는 다른 모듈의 수이고, 팬아웃은 특정 모듈이 호출하는 다른 모듈의 수이다. 높은 팬인은 재사용성을 높이지만 변경 파급효과가 크고, 높은 팬아웃은 복잡도와 결합도를 증가시킨다. 바람직한 설계는 적절한 팬인과 낮은 팬아웃을 유지하는 것이다. 높은 팬아웃은 God Class나 Control Class에서 발생하며, Facade 패턴, Command 패턴, 의존성 주입 등으로 개선할 수 있다.
해설
팬인과 팬아웃은 모듈 간 의존성을 정량적으로 측정하는 지표입니다. 팬인이 높은 모듈은 많은 곳에서 사용되어 재사용성이 높지만, 변경 시 파급효과가 클 수 있습니다. 팬아웃이 높은 모듈은 많은 다른 모듈에 의존하여 복잡도와 결합도가 증가하고 테스트와 유지보수가 어려워집니다. God Class처럼 너무 많은 책임을 가진 클래스나 모든 의존성을 직접 관리하는 Control Class에서 높은 팬아웃이 나타납니다. 이는 Facade 패턴으로 복잡한 하위 시스템을 단순화하거나, Command 패턴으로 요청을 객체화하거나, 의존성 주입으로 의존성 관리를 외부화하여 개선할 수 있습니다.