-
팬인(Fan-In), 팬아웃(Fan-Out) 제대로 이해하기 (Feat. "X" a.k.a Twitter Architecture)전산학/소프트웨어공학 2024. 8. 13. 00:24728x90반응형
𝐈𝐧𝐭𝐫𝐨
팬인(Fan-In), 팬아웃(Fan-Out) 개념은 누구나 정보처리기사를 준비하면서 쉽다고 느꼈을 내용이다. 그러나 이 내용이 왜 나왔는지, 실무에 어떻게 적용되는지는 잘 모르는 사람들이 많다. 이 글에서는 팬인, 팬아웃에서 '팬'의 의미, 그리고 실제 아키텍쳐에 어떻게 적용되는지 설명해본다.
■ 팬(Fan)이란?
사실 팬인(Fan-In), 팬아웃(Fan-Out) 용어는 전자공학, 디지털 회로 설계에서 시작된 용어이다. 여기서 팬(Fan)은 회로나 시스템에서 신호가 분배되거나 집합되는 것을 의미한다. 선풍기나 환풍기에서 볼 수 있는 팬(Fan)에서 신호가 분산되거나 집중되는 모습을 연상할 수 있어 이름을 붙인 것으로 보인다.
팬인(Fan-In)은 하나의 게이트가 여러 입력을 받을 수 있는 최대 개수를 의미한다. 예를 들어서, 어떤 논리 게이트가 4개의 입력을 받을 수 있다면, 그 게이트의 팬인(Fan-In)은 4이다.
팬아웃(Fan-Out)은 하나의 출력이 다른 회로나 게이트에 얼마나 많이 연결될 수 있는지를 나타낸다. 예를 들어, 어떤 논리 게이트의 출력이 3개의 다른 게이트에 연결될 수 있다면 그 게이트의 팬아웃(Fan-Out)은 3이다.
■ 소프트웨어공학에서 팬인(Fan-In), 팬아웃(Fan-Out)은?
회로에서 게이트(gate)에 팬인(Fan-In), 팬아웃(Fan-Out)을 적용시켰다면, 소프트웨어공학(SW Engineering)에서는 모듈 (Module) 에 적용시킬 수 있다. 소프트웨어공학에서 모듈(Module)은 소프트웨어 시스템의 구성 요소로, 특정 기능이나 작업을 수행하는 독립적인 단위이다.
팬인(Fan-In)은 하나의 모듈이 몇 개의 다른 모듈로부터 호출(참조)되는지를 나타낸다. 즉, A 모듈이 실행되려면 사용해야 하는 다른 모듈들의 개수인 셈이다. 팬인(Fan-In)이 높으면 해당 모듈이 재사용 가능성이 크다. 팬인(Fan-In)이 높은 그 모듈 자체를 여러 다른 모듈에서 공통적으로 사용하기 때문이다. 즉, 중복된 기능을 각기 다른 모듈에 따로 구현하는 대신 하나의 모듈에서 공통 기능을 제공하는 것이다. 또한, 관리가 쉬워져 유지보수가 쉬워진다. 버그가 있거나 기능을 개선해야 한다면, 팬인이 높은 모듈에서 한 번만 수정하면 이 모듈을 참조하는 모든 모듈에 자동으로 적용되기 때문이다.
그러나 팬인(Fan-In)이 너무 높으면 그 모듈에 많은 의존성이 생기게 되어, 해당 모듈에 변화가 있을 때 많은 부분에 영향을 미칠 수 있다. 이를 단일 장애점(SPOF, Single Point Of Failure)이라고 한다. 시스템의 구성 요소 중 동작하지 않으면 전체 시스템이 중단되어 버리는 요소를 의미한다. 따라서 팬인(Fan-In)을 적절하게 유지하는 것이 중요하다.
예) 유틸리티 함수 모듈에 문자열을 포맷팅하는 함수, 날짜를 처리하는 함수, 데이터 변환 함수 등이 있다고 가정해본다. 이 함수들을 한 모듈에 모아두고, 여러 다른 모듈들이 이 유틸리티 모듈을 호출해 필요한 기능을 사용한다. 이 경우 유틸리티 모듈의 팬인이 높다고 할 수 있다. 즉, 이 모듈은 여러 다른 모듈에 의해 참조되거나 호출된다.
참고) "참조된다(Referenced)"는 것은 한 모듈이 다른 모듈에서 사용하는 것을 의미합니다. 소프트웨어에서 참조는 코드에서 특정 함수나 데이터를 불러와 사용하는 것을 가리킵니다.
예시로 설명:
- 데이터베이스 연결 모듈: A라는 모듈이 데이터베이스와 연결하는 기능을 제공합니다.
- 참조: 다른 B, C, D 모듈이 각각 A 모듈을 참조해서 데이터베이스에 접근합니다.
즉, B, C, D 모듈은 모두 A 모듈을 참조하고 있으며, A 모듈은 여러 곳에서 사용되므로 재사용성이 높다고 할 수 있습니다.
팬아웃은(Fan-Out)은 하나의 모듈이 몇 개의 다른 모듈을 호출(참조)하는지를 나타낸다. 즉, A 모듈이 다른 모듈들에 사용되는 횟수(참조 횟수)를 숫자로 나타낸 것이다. 한 모듈에서 팬아웃(Fan-Out)이 너문 높으면 해당 모듈이 너무 많은 외부 모듈에 의존하게 되어, 복잡도가 증가하고 유지보수가 어려워질 수 있다. 불필요하게 다른 모듈을 호출하고 있는지 검토하고, 단순화 시킬 수 있는지 여부에 대한 검토가 필요하다.
[팬인] B, C, D, E: 1 / G, F: 2
[팬아웃] A: 3 / B, E, D: 1/ C: 2
+) Fan-Out이 높다는 것은 결합도가 높다는 뜻이다. 구조적 설계에서 Fan-Out이 7이 넘지 않는 것을 권장한다.
■ 실제 아키텍쳐에 적용해보기(Feat. X a.k.a Twitter)
https://www.youtube.com/watch?v=FEkXjNFrL1o
이 영상에서는 트위터의 타임라인 아키텍처에서 팬인과 팬아웃 개념을 설명한다. 이 두 개념을 통해 시스템의 효율성과 확장성을 관리하는 것이다.
- 팬아웃: 사용자가 트윗을 올릴 때, 그 트윗이 팔로워들의 타임라인에 분배되는 과정을 말한다. 하나의 트윗이 수많은 사용자에게 전달되기 때문에 팬아웃이 발생한다.
- 팬인: 여러 사용자들의 트윗이나 데이터를 하나의 타임라인에 모으는 과정을 의미한다. 다양한 출처의 데이터를 모아 타임라인에 보여주기 때문에 팬인이 발생한다.
■ 파이썬, 자바 코드로 팬인(Fan-In), 팬아웃(Fan-Out) 이해하기
1) 파이썬 코드
class Module: def __init__(self, name): self.name = name self.references = [] def add_reference(self, module): if module not in self.references: self.references.append(module) def fan_in(self, modules): """ Calculate the fan-in for this module. Fan-in is the number of modules that reference this module. """ return sum(1 for module in modules if self in module.references) def fan_out(self): """ Calculate the fan-out for this module. Fan-out is the number of modules this module references. """ return len(self.references) # Create modules module_A = Module("A") module_B = Module("B") module_C = Module("C") module_D = Module("D") # Set up references module_A.add_reference(module_B) module_A.add_reference(module_C) module_B.add_reference(module_D) module_C.add_reference(module_D) # List of all modules all_modules = [module_A, module_B, module_C, module_D] # Calculate fan-in and fan-out for module in all_modules: print(f"Module {module.name} - Fan-in: {module.fan_in(all_modules)}, Fan-out: {module.fan_out()}")
설명
- Module 클래스: 각 모듈을 정의하는 클래스입니다. 모듈 이름과 참조하는 모듈 리스트를 속성으로 가집니다.
- add_reference 메서드: 다른 모듈을 참조 목록에 추가합니다. 중복된 참조는 추가하지 않도록 합니다.
- fan_in 메서드: 팬인 값을 계산합니다. 이는 이 모듈을 참조하는 모듈의 수를 세는 것입니다. 모든 모듈을 검사하여 현재 모듈이 참조 리스트에 있는지 확인합니다.
- fan_out 메서드: 팬아웃 값을 계산합니다. 이는 현재 모듈이 참조하는 모듈의 수를 반환합니다.
출력
이 코드를 실행하면 각 모듈의 팬인과 팬아웃 값이 출력됩니다. 예를 들어, 모듈 A는 B와 C를 참조하므로 팬아웃이 2입니다. B와 C는 D를 참조하므로 D의 팬인은 2입니다.
이와 같은 방식으로 모듈 간의 관계를 이해하고, 시스템 설계나 유지보수에서 모듈 간의 의존성을 관리하는 데 도움이 될 수 있습니다.
2) 자바 코드import java.util.HashSet; import java.util.Set; class Module { private String name; private Set<Module> references; public Module(String name) { this.name = name; this.references = new HashSet<>(); } public String getName() { return name; } public void addReference(Module module) { references.add(module); } public int calculateFanIn(Set<Module> allModules) { int fanInCount = 0; for (Module module : allModules) { if (module.references.contains(this)) { fanInCount++; } } return fanInCount; } public int calculateFanOut() { return references.size(); } @Override public String toString() { return name; } } public class FanInFanOutExample { public static void main(String[] args) { // Create modules Module moduleA = new Module("A"); Module moduleB = new Module("B"); Module moduleC = new Module("C"); Module moduleD = new Module("D"); // Set up references moduleA.addReference(moduleB); moduleA.addReference(moduleC); moduleB.addReference(moduleD); moduleC.addReference(moduleD); // List of all modules Set<Module> allModules = new HashSet<>(); allModules.add(moduleA); allModules.add(moduleB); allModules.add(moduleC); allModules.add(moduleD); // Calculate and display fan-in and fan-out for (Module module : allModules) { System.out.println("Module " + module.getName() + " - Fan-in: " + module.calculateFanIn(allModules) + ", Fan-out: " + module.calculateFanOut()); } } }
설명
- Module 클래스: 각 모듈을 정의하는 클래스입니다. 모듈 이름과 참조 모듈들을 Set 형태로 관리합니다.
- addReference 메서드: 다른 모듈을 참조 목록에 추가합니다. 중복된 참조를 허용하지 않기 위해 Set을 사용합니다.
- calculateFanIn 메서드: 팬인 값을 계산합니다. 이는 이 모듈을 참조하는 모듈의 수를 세는 것입니다. 모든 모듈을 검사하여 현재 모듈이 참조 리스트에 있는지 확인합니다.
- calculateFanOut 메서드: 팬아웃 값을 계산합니다. 이는 현재 모듈이 참조하는 모듈의 수를 반환합니다.
- FanInFanOutExample 클래스: 모듈을 생성하고 참조를 설정한 후, 각 모듈의 팬인과 팬아웃을 계산하여 출력합니다.
실행 결과
이 코드를 실행하면 각 모듈의 팬인과 팬아웃 값이 출력됩니다. 예를 들어, 모듈 A는 B와 C를 참조하므로 팬아웃이 2입니다. B와 C는 D를 참조하므로 D의 팬인은 2입니다.
이와 같은 방식으로 자바에서 모듈 간의 의존성을 관리하고, 시스템의 복잡성을 이해하는 데 도움이 됩니다.
(그 외 참고영상)
https://www.youtube.com/watch?v=wPPGnQ6Mp4whttps://dev.to/byrro/crash-course-on-fan-out-fan-in-with-aws-lambda-47g0
https://betterprogramming.pub/cloud-native-patterns-illustrated-fan-in-and-fan-out-daf77455703c
728x90반응형'전산학 > 소프트웨어공학' 카테고리의 다른 글
동료검토(Peer Review), 워크스루(Walk Through), 인스펙션(Inspection) 쉽게 구분하기 (0) 2024.08.23 시퀀스 다이어그램, 액티비티 다이어 그램, 상태 다이어그램, 협력 다이어그램 (0) 2024.08.23 기능적 요구사항 vs 비기능적 요구사항 (0) 2024.08.01 상향식 비용 산정기법 vs 하향식 비용 산정기법 (0) 2024.08.01 비즈니스 관리 용어: RTO, RPO, MTD, WRT, MTRS (0) 2024.08.01