Hexagonal Architecture

Kyle_Kim·2024년 3월 24일
0

Hexagonal Architecture.

도메인 중심 아키텍처의 일종

  • UI나 database를 비지니스 로직으로 분리되어야하는 외부요소로 취급함
  • 비지니스 로직(도메인 코드)이 외부요소에 의해 의존하지 않게 함
  • 프레젠테이션 계층(controller)과 데이터 소스 계층(persistence)이 도메인 계층에 의존하도록 함
  • 외부에 포함된 컴포넌트는 어댑터이고, 어댑터가 내부와 상호작용하는 부분이 포트임

MSA에서 불려지는 구조

1. Controller (=웹 컨트롤러)

2. UseCase.class

- SERVICE클래스가 UseCase.class를 구현한다.

3. port class

4. Core(= buisiness logic)

5. domain entity

- 현재 플젝에서는 MembershipJpaEntity

구조

1. Adapter(플러그인)

  • driving adapter(주도하는 어댑터): 애플리케이션 코어를 호출함
    웹, 외부 시스템 어댑터 ex) Controller
  • driven adapter(주도되는 어댑터): 애플리케이션 코어에 의해 호출됨
    영속성, 외부 시스템 어댑터 ex)

현재 진행중인 MSA프로젝트는 Adapter가 port interface에 명시되어 있는 메소드들을 구현하였다.



public class MembershipPersistenceAdapter implements RegisterMembershipPort, FindMembershipPort {
    private final MembershipRepository membershipRepository;
    @Override
    public MembershipJpaEntity createMembership(Membership.MembershipName name,
    Membership.MembershipAddress address,
    Membership.MembershipEmail email,
    Membership.MembershipValid valid,
    Membership.MembershipCorp corp) {
    
       return membershipRepository.save(
               new MembershipJpaEntity(
                       name.getName()
                       , address.getAddress()
                       , email.getEmail()
                       , valid.isValid()
                       , corp.isCorp())
       );
    }

    @Override
    public MembershipJpaEntity findMembership(Membership.MembershipId membershipId) {
        return membershipRepository.getById(membershipId.getId());
    }
}

2. Port(통로) : 애플리케이션 코어와 어댑터 간에 통신을 위한 부분으로 인터페이스로 구성한다.

  • In Port(인바운드 포트): 외부에서 Adapter를 통해 들어온 요청을 처리하는 인터페이스 ex) Service I/F
  • Out Port(아웃바운드 포트): 내부에서 외부의 기술이나 서비스를 사용하기 위한 인터페이스

- port클래스는 코어에 필요한 메소드들을 명시만 하고 Adapter클래스들이 구현한다.

3. Application Core: 도메인 엔티티, 유즈케이스.

모든 의존성은 코어를 향함

계층 구성

  • 어댑터 계층: ex) web 어댑터(=웹 컨트롤러), persistence 어댑터
  • 애플리케이션 계층: 포트와 서비스를 포함하는 곳
  • 포트: 서비스에서 구현될 인터페이스
    -- input port/output port
  • 서비스
    -- 포트 구현체(=유스케이스 구현체)
  • 도메인 계층
    -- 도메인 엔티티
profile
Make Things Right

0개의 댓글