PHpullh
학습 라이브러리/Java/헥사고날 아키텍처

JAVA · 디자인패턴

헥사고날 아키텍처

포트와 어댑터 패턴으로 외부 시스템과의 결합을 제거합니다.

디자인패턴고급헥사고날포트어댑터인바운드아웃바운드

핵심 설명

포트와 어댑터 패턴으로 외부 시스템과의 결합을 제거합니다.

Java code

// 포트: 인바운드 (외부 -> 도메인)
interface CreateOrderPort {
    OrderResult create(OrderCommand command);
}

record OrderCommand(String customerId, String productId, int quantity) {}
record OrderResult(String orderId, String status) {}

// 포트: 아웃바운드 (도메인 -> 외부)
interface OrderPersistencePort {
    void save(Order order);
}
interface PaymentPort {
    boolean charge(String customerId, long amount);
}
interface NotificationPort {
    void notify(String customerId, String message);
}

// 도메인 모델
record Order(String id, String customerId, String productId, int qty, long total) {}

// 유스케이스 구현 (헥사곤 내부)
class CreateOrderService implements CreateOrderPort {
    private final OrderPersistencePort persistence;
    private final PaymentPort payment;
    private final NotificationPort notification;

    CreateOrderService(OrderPersistencePort p, PaymentPort pay, NotificationPort n) {
        this.persistence = p; this.payment = pay; this.notification = n;
    }

    public OrderResult create(OrderCommand cmd) {
        long amount = cmd.quantity() * 10000L;
        if (!payment.charge(cmd.customerId(), amount)) {
            return new OrderResult("", "결제실패");
        }
        Order order = new Order("ORD-1", cmd.customerId(),
            cmd.productId(), cmd.quantity(), amount);
        persistence.save(order);
        notification.notify(cmd.customerId(), "주문 완료");
        return new OrderResult(order.id(), "성공");
    }
}

학습 팁

인바운드 포트는 "시스템이 무엇을 할 수 있는가"를, 아웃바운드 포트는 "시스템이 무엇을 필요로 하는가"를 정의합니다.

주의할 점

어댑터에서 도메인 객체를 직접 노출하면 외부 변경이 도메인에 영향을 줍니다. DTO로 변환하여 전달하세요.

자주 묻는 질문

헥사고날 아키텍처란 무엇인가요?

포트와 어댑터 패턴으로 외부 시스템과의 결합을 제거합니다.

헥사고날 아키텍처 학습 시 주의할 점은 무엇인가요?

어댑터에서 도메인 객체를 직접 노출하면 외부 변경이 도메인에 영향을 줍니다. DTO로 변환하여 전달하세요.