Ports and Adapters (Hexagonal Architecture) 개요
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
아키텍처 패턴
대상자
- 소프트웨어 개발자 및 아키텍처 설계자
- 난이도: 중간 (아키텍처 개념 이해 필요)
- 도움: 외부 의존성과 비즈니스 로직 분리, 테스트 및 유지보수 용이성 확보
핵심 요약
- 비즈니스 로직과 외부 의존성 분리:
Ports
와Adapters
를 통해 비즈니스 로직을 외부 요소(예: 데이터베이스, 프로토콜)와 완전히 분리 - 사용자 중심 설계:
Use Cases
를 중심으로 설계하여, 테스트 시 외부 시스템과 분리 가능 - 유연성 강화:
Adapters
를 통해 외부 시스템 변경(예: HTTP → gRPC) 시 비즈니스 로직 수정 필요 없음
섹션별 세부 요약
1. 개념 소개
- Ports and Adapters는 Alistair Cockburn이 1994년 제안, 2005년 블로그에 공식화
- 목표: 사용자, 자동화 테스트, 배치 스크립트 등과 무관하게 비즈니스 로직을 개발/테스트
- 핵심 원칙: 비즈니스 로직은 외부 요소와 결합되지 않아야 함
2. 구조 요소 설명
- Hexagon: 비즈니스 로직(Use Cases, 도메인 엔티티 등)이 위치하는 핵심 영역
- Ports: Hexagon 내부에서 정의된 인터페이스. 외부 시스템과 상호작용을 위한 계약
- Driver Ports: 사용자/테스트가 Use Cases를 호출할 때 사용 (예:
debitAccount()
메서드) - Driven Ports: 외부 시스템(예: DB, 메시지 브로커)과 상호작용을 위한 계약 (예:
saveData()
인터페이스) - Adapters: Ports와 Actor 간 데이터 변환을 담당
- Driver Adapters: 외부 Actor(예: 웹 요청)의 데이터를 Use Case 입력 형식으로 변환
- Driven Adapters: Use Case의 출력을 외부 Actor(예: DB)가 이해할 수 있는 형식으로 변환
3. 적용 사례 및 이점
- 테스트 용이성: 외부 의존성을 메모리 내에서 시뮬레이션 가능 (예:
In-Memory DB
사용) - 유연성: 외부 시스템 변경 시 Adapters만 수정 (예: HTTP → gRPC 전환 시)
- 확장성: 새로운 기능 추가 시 Hexagon 내부에만 영향 (예: 새로운 Use Case 추가)
결론
- 실무 적용 팁: Use Cases를 중심으로 설계하고, 외부 의존성을 Ports와 Adapters로 분리하여 테스트와 유지보수를 용이하게 하세요. 예:
@Repository
어노테이션을 통해 DB 인터페이스를 분리하고,Mockito
로 외부 의존성을 모킹하여 테스트 가능.