kkokkio - 프로젝트/ADR(의사결정문서)
헥사고날 아키텍처
파란배개
2025. 6. 11. 12:47
Context
문제 상황
- 현재 시스템에서 다양한 외부 API(구글 트렌드, 유튜브 API, 네이버 뉴스 API)를 활용하고 있음. 이러한 외부 의존성을 효율적으로 관리하기 위해 아키텍처를 재설계하고자 함.
- 각 외부 API의 변화에 유연하게 대응하고, 시스템의 확장성을 높이기 위해 헥사고날 아키텍처 도입을 고려
Decision
제안 내용 및 이유
- 헥사고날 아키텍처 완전 도입: 시스템의 유연성을 높이고, 외부 API의 변화를 손쉽게 반영할 수 있도록 모든 외부 서비스 및 의존성을 어댑터와 포트로 분리하여 관리.
- 장점: 외부 API의 변화가 시스템에 미치는 영향을 최소화하고, 테스트와 유지보수가 용이해짐.
Consequences
제안된 기술 도입의 장단점
- 반대
- 외부 API를 많이 사용하고 있어 코드가 복잡해지고 양이 많아질 수 있음.
- 시스템에 대한 이해도가 낮은 개발자에게는 러닝 커브가 클 수 있음.
- 클린 아키텍처나 헥사고날 아키텍처의 도입이 개발 리소스를 많이 소모할 수 있음.
- 프로젝트가 작은 규모이므로, 이러한 아키텍처가 과도한 오버엔지니어링이 될 수 있음.
- 찬성
- 외부 API의 변경에 유연하게 대응할 수 있음 (예: 구글 트렌드, 유튜브 API, 네이버 뉴스 API).
- 헥사고날 아키텍처를 적용하면 각 외부 API가 독립적으로 변경될 수 있으며, 이러한 변화에 빠르게 대응할 수 있음.
- 유튜브와 네이버 뉴스 API가 유사한 유즈케이스를 공유하고 있으므로, 이들 API에 대한 공통적인 리팩토링을 적용하는 것만으로도 아키텍처에 많은 이점을 가져올 수 있음.
Alternatives
다른 대안
- 헥사고날 아키텍처 완벽 적용: 모든 외부 API와 의존성들을 포트와 어댑터로 분리하여 완전하게 적용.
- 부분 적용 with 레거시 시스템:
- Persistence Layer + Entity 적용: 데이터베이스와 관련된 부분에서 헥사고날 아키텍처를 적용하여 외부 시스템과의 의존성을 최소화.
- Usecase 적용: 비즈니스 로직을 usecase 단위로 구분하여 헥사고날 아키텍처를 적용.
- Infra Layer 적용: 외부 시스템(API, 메시지 큐 등)과의 인터페이스를 외부 어댑터로 분리하여 적용.
- 미적용: 현 시스템 구조를 그대로 유지하고, 외부 API와의 의존성을 유지하는 방법.
Adoption & Next Steps
최종 채택 사항 및 차후 과제
- 채택 사항: 외부 API가 이미 어댑터로 분리되어 있는 상태에서, Infra Layer만 구체적으로 적용하기로 결정.
- 차후 과제: 외부 시스템에 대한 의존성 관리를 더욱 강화하고, 각 외부 API를 포트와 어댑터를 통해 독립적으로 관리하도록 리팩토링을 진행.
- 네이버 뉴스와 유튜브 API의 유사한 유즈케이스를 공유하므로, 이를 하나의 공통된 어댑터로 통합하고 관리할 계획.
- 외부 API와의 통합을 강화하여, 시스템의 확장성과 유지보수성을 향상시키는 방향으로 진행.