Hexagonal Architecture
헥사고날 아키텍처 (Hexagonal Architecture 또는 Ports and Adapters Pattern)
헥사고날 아키텍처는 소프트웨어 설계 시 특정 기술 스택, 프레임워크, 외부 시스템에 의존하지 않고 비즈니스 로직을 중심으로 설계할 수 있도록 돕는 강력한 아키텍처 패턴입니다. 이 패턴은 유지보수성, 테스트 용이성, 확장성을 주요 목표로 하며, 애플리케이션의 중심에는 도메인 로직이, 주변에는 이를 지원하는 다양한 어댑터(기술, 시스템)가 배치됩니다.
핵심 개념
1. Core Domain
애플리케이션의 핵심 비즈니스 로직이 위치하는 영역.
외부 의존성이 없는 순수한 코드로 구성.
도메인 모델과 애플리케이션 로직을 포함하며, 외부 환경에 영향을 받지 않습니다.
예시:
@Entity
public class NotificationConfig {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private boolean isActive;
// Getter, Setter, 비즈니스 로직 메서드
}
2. Ports
Core Domain과 외부 간의 인터페이스 역할을 수행.
두 가지 유형:
Inbound Ports: 외부 요청을 받아들이는 진입점 (예: 서비스 인터페이스).
Outbound Ports: 외부 시스템과 상호작용을 위해 Core Domain에서 호출하는 인터페이스 (예: Repository 인터페이스).
Inbound Port 예시:
public interface NotificationConfigService {
NotificationConfigResponse getConfig(Long id);
NotificationConfigResponse saveConfig(NotificationConfigRequest request);
}
Outbound Port 예시:
public interface NotificationConfigRepository extends JpaRepository<NotificationConfig, String> {
Optional<NotificationConfig> findByName(String name);
}
3. Adapters
Ports를 구현하거나 호출하며 외부 환경과 상호작용을 담당.
Inbound Adapter
사용자 요청을 Port로 전달 (예: Controller, REST API, CLI).
예시:
Outbound Adapter
Port를 구현하여 외부 시스템과 연결 (예: JPA Repository, 외부 API 호출).
Spring Data JPA의 경우 별도의 구현 클래스 없이 Port를 바로 사용 가능:
헥사고날 구조의 도식화
헥사고날 아키텍처의 장점
기술 독립성
Core Domain은 특정 프레임워크(JPA, Spring 등)에 의존하지 않음.
기술 변경이 Core Domain에 영향을 주지 않음.
테스트 용이성
Port를 Mocking하여 외부 시스템 없이 Core Domain 테스트 가능.
테스트 예시:
확장성
다양한 Adapter를 추가하여 새로운 입력/출력 방식 확장 가능 (예: CLI, REST, 메시징).
의존성 역전 원칙(DIP)
Core Domain은 구체적인 구현체가 아닌 추상화(Interface)에 의존.
헥사고날 아키텍처의 단점
초기 설계 복잡성
Port와 Adapter 설계로 인해 초기 개발 속도가 느릴 수 있음.
작은 프로젝트에는 과도
간단한 애플리케이션에 적용하면 복잡성이 증가할 수 있음.
의존성 관리의 어려움
Port와 Adapter 간 의존성 관리가 잘못되면 결합도가 증가할 위험이 있음.
대처 방안:
초기 단계에서는 간소화된 형태로 도입.
Port/Adapter 설계를 단순화하고 점진적으로 확장.
헥사고날 아키텍처가 적합한 경우
복잡한 도메인 로직
도메인 로직이 복잡하고 변경 가능성이 높은 경우.
다양한 어댑터 필요
다양한 입력/출력 채널이 필요한 경우 (예: REST, CLI, 메시징).
MSA(Microservices Architecture)
독립적인 서비스로 분리할 가능성이 있는 경우.
결론
헥사고날 아키텍처는 비즈니스 로직 중심의 설계를 통해 유지보수성과 확장성을 극대화할 수 있는 패턴입니다. 대규모 시스템에서 특히 효과적이며, 초기 단계에서는 간소화된 형태로 도입하여 점진적으로 확장하는 전략이 추천됩니다.