육각형 아키텍처를 직접적으로 반영하는 표현력 있는 패키지 구조 소개
송금하기 예제
결론: 간단한 구조의 계층은 가장 적합한 구조가 아닐 수 있다.
웹 계층, 도메인 계층, 영속성 계층의 각 계층 전용 패키지를 만든다.
payment
ㄴ web
ㄴ AccountController
ㄴ domain
ㄴ Account
ㄴ Activity
ㄴ AccountRepository
ㄴ AccountService
ㄴ persistence
ㄴ AccountRepositoryImpl
기능 조각(functional slice)이나 특성(feature)로 구분짓는 경계가 없다.
만약에 사용자 기능이 추가된다면?
payment
ㄴ web
ㄴ AccountController
ㄴ UserController
ㄴ domain
ㄴ Account
ㄴ Activity
ㄴ User
ㄴ AccountRepository
ㄴ UserRepository
ㄴ AccountService
ㄴ UserService
ㄴ persistence
ㄴ AccountRepositoryImpl
ㄴ UserRepositoryImpl
연관되지 않은 클래스들의 엉망진창 묶음
유스케이스 파악이 어렵다.
특정 기능을 찾기 위해 AccountService
와 AccountController
로는 한 눈에 파악하기 힘들다. 추측과 찾는 시간이 필요하다.
incoming port, outgoing port가 코드에 숨겨져 있다.
헥사고날 아키텍처를 따랐다고 가정했을 때, 웹 어댑터나 영속성 어댑터가 어느 기능을 호출하고 호출당하는지 파악할 수 없다.
결론: 아키텍처의 가시성을 더 떨어뜨린다.
‘계층으로 구성하기’의 1번 문제를 해결한 방식
payment
ㄴ account
ㄴ Account
ㄴ Activity
ㄴ AccountRepository
ㄴ AccountRepositoryIml
ㄴ SendMoneyService # AccountService
ㄴ AccountController
ㄴ user
ㄴ User
ㄴ UserRepository
ㄴ UserRepositoryIml
ㄴ UserRegistrationService
ㄴ UserController
모든 클래스들을 account, user라는 최상위 디렉토리에 위치시켰다.