프로그래밍

헥사고날 아키텍쳐 - 애플리케이션 헥사곤

일태우 2024. 8. 4. 20:45

애플리케이션 헥사곤

애플리케이션 특화 작업을 추상적으로 처리하는 곳, 기술 관심사를 직접 다루지 않기 때문에 추상적인 것을 이야기한다. 도메인 비즈니스 규칙에 기반한 소프트웨어 사용자의 의도와 기능을 표현한다.

유스케이스

도메인 제약사항을 지원하기 위해 시스템의 동작을 소프트웨어 영역 내에 존재하는 애플리케이션 특화 오퍼레이션을 통해 나타낸다.

엔티티 및 다른 유스케이스와 직접 상호작용하고 그것을 유연한 컴포넌트로 만들 수 있다.

자바에서는 인터페이스로 정의된 추상화로 나타낸다.

public interface RouterViewUseCase {
    List<Router> getRouters(Predicate<Router> filter);
}

입력 포트

유스케이스 인터페이스를 구현하는 것이 입력 포트의 역할 이다. 애플리케이션 수준에서 유스케이스에 직접 연결되는 컴포넌트이기 때문에 입력 포트는 도메인 용어로 소프트웨어의 의도를 구현할 수 있게 한다.

public class RouterViewInputPort implements RouterViewUseCase {

    private final RouterViewOutputPort routerListOutputPort;

    public RouterViewInputPort(RouterViewOutputPort routerListOutputPort) {
        this.routerListOutputPort = routerListOutputPort;
    }

    @Override
    public List<Router> getRouters(Predicate<Router> filter) {
        var routers = routerListOutputPort.fetchRouters();
        return Router.retrieveRouter(routers, filter);
    }
}

위는 유스케이스에 서술된 소프트웨어의 의도를 구현한 입력 포트다. 도메인 제약사항을 사용해 조회하고자 하는 라우터를 필터링한다.

출력 포트

유스케이스가 목표를 달성하기 위해 외부 리소스에서 데이터를 가져와야 하는 상황이 있다. 이것이 출력 포트의 역할이다.

유스케이스나 입력 포트가 오퍼레이션을 수행하기 위해 어떤 종류의 데이터를 외부에서 가져와야 하는지를 기술에 구애 받지 않고 설명하는 인터페이스로 표현된다.

이 말은 특정 데이터가 DB에서 오든 파일 시스템에서 오든 신경 쓰지 않는 말이다.

public interface RouterViewOutputPort {
    List<Router> fetchRouters();
}