K8s에서 Go 인터페이스 캡슐화 학습
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
Go 언어 개발자 및 Kubernetes 기반 시스템 설계자, 테스트 자동화에 관심 있는 프로그래머
핵심 요약
- 인터페이스를 활용한 캡슐화는 구현 세부사항을 숨겨 코드 복잡도를 줄이고 테스트 가능성 향상
SyncHandler
인터페이스를 통해Kubelet
의syncLoop
메서드는 필요 없는 메서드를 무시할 수 있음- 모킹 테스트 시
OrderAPI
인터페이스를 통해mockOrderImpl
을 사용해 실제 로직 대체 가능 gomonkey
라이브러리는 인터페이스 없이도 함수 리턴값을 조작할 수 있어 유연한 테스트 가능
섹션별 세부 요약
1. Kubelet 인터페이스 예시
Kubelet
구조체는HandlePodAdditions
및syncLoop
메서드를 포함SyncHandler
인터페이스를 정의하여Kubelet
이 구현하고syncLoop
에 전달- 인터페이스 타입 변환 후
Kubelet
의 다른 메서드는syncLoop
내부에서 접근 불가
2. 테스트 시 인터페이스 모킹
OrderAPI
인터페이스를 통해realOrderImpl
과mockOrderImpl
구현mockOrderImpl
은 테스트 시GetOrderId()
로직을 단순화하여 사용gomonkey
라이브러리로 기존 코드를 수정하지 않고도GetOrder
함수의 리턴값을 조작 가능
3. 네트워크 설정 인터페이스 추상화
ServiceHandler
및EndpointSliceHandler
인터페이스를 통해iptables
및ipvs
구현Provider
인터페이스를 통해ServiceHandler
와EndpointSliceHandler
를 통합- 상위 레이어는 구현체 변경 시 코드 수정 없이 동작 가능
4. 패닉 처리 캡슐화
HandleCrash
함수를 통해recover()
로직을 전역적으로 관리Go
함수로goroutine
실행 시 자동으로HandleCrash
를 호출해 패닉 방지WaitGroup
캡슐화로Start
메서드 내부에서Add
및Done
동작 자동 처리
5. 주기적 실행 로직 캡슐화
BoundedFrequencyRunner
구조체에서sync.Mutex
및time.Timer
를 사용해 주기적 실행 제어Run
및Loop
메서드로 신호 처리 및 실행 제한 로직 구현tryRun
메서드 내부에서 레이트 제한 로직 추가 가능
6. Leapcell 서버리스 플랫폼
- 다중 언어 지원: Node.js, Python, Go, Rust
- 무제한 프로젝트 배포: 사용량 기반 요금제, 요청 수에 따른 비용 없음
- 고성능 자동 확장: 실시간 메트릭 제공, GitOps 통합
- 예시: $25로 6.94M 요청 처리 가능
결론
인터페이스를 통해 캡슐화된 코드는 테스트 유연성과 유지보수성 향상에 유리하나, 요구사항 변화 시 인터페이스 확장이 필요할 수 있음. HandleCrash
와 BoundedFrequencyRunner
와 같은 패턴은 복잡한 상태 관리와 예외 처리를 간소화하고, gomonkey
는 기존 코드에 대한 모킹 테스트를 유연하게 지원함.