육각형 아키텍처를 직접적으로 반영하는 표현력 있는 패키지 구조 소개

송금하기 예제

3-1. 계층으로 구성하기

결론: 간단한 구조의 계층은 가장 적합한 구조가 아닐 수 있다.

웹 계층, 도메인 계층, 영속성 계층의 각 계층 전용 패키지를 만든다.

payment
    ㄴ web
        ㄴ AccountController
    ㄴ domain
        ㄴ Account
        ㄴ Activity
        ㄴ AccountRepository
        ㄴ AccountService
    ㄴ persistence
        ㄴ AccountRepositoryImpl

단점

  1. 기능 조각(functional slice)이나 특성(feature)로 구분짓는 경계가 없다.

    만약에 사용자 기능이 추가된다면?

    payment
        ㄴ web
            ㄴ AccountController
            ㄴ UserController
        ㄴ domain
            ㄴ Account
            ㄴ Activity
            ㄴ User
            ㄴ AccountRepository
            ㄴ UserRepository
            ㄴ AccountService
            ㄴ UserService
        ㄴ persistence
            ㄴ AccountRepositoryImpl
            ㄴ UserRepositoryImpl
    

    연관되지 않은 클래스들의 엉망진창 묶음

  2. 유스케이스 파악이 어렵다.

    특정 기능을 찾기 위해 AccountServiceAccountController로는 한 눈에 파악하기 힘들다. 추측과 찾는 시간이 필요하다.

  3. incoming port, outgoing port가 코드에 숨겨져 있다.

    헥사고날 아키텍처를 따랐다고 가정했을 때, 웹 어댑터나 영속성 어댑터가 어느 기능을 호출하고 호출당하는지 파악할 수 없다.

3-2. 기능으로 구성하기

결론: 아키텍처의 가시성을 더 떨어뜨린다.

‘계층으로 구성하기’의 1번 문제를 해결한 방식

payment
    ㄴ account
        ㄴ Account
        ㄴ Activity
        ㄴ AccountRepository
        ㄴ AccountRepositoryIml
        ㄴ SendMoneyService    # AccountService
        ㄴ AccountController
    ㄴ user
        ㄴ User
        ㄴ UserRepository
        ㄴ UserRepositoryIml
        ㄴ UserRegistrationService
        ㄴ UserController

모든 클래스들을 account, user라는 최상위 디렉토리에 위치시켰다.