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로 변환하여 전달하세요.