반응형
계층형 아키텍처 구조 - web, domain, persistence 로 나누기
최적화된 구조가 아닌 이유
- 애플리케이션의 기능 조각이나 특성을 구분 짓는 패키지 경계가 없다.
- web 패키지에 UserController 추가, domain 패키지에 UserService, UserRepository, User 추가, persistence 패키지에 UserRepositoryImpl을 추가하게 되어 세부 기능과 역할별로 구분하기 어렵다.
- 애플리케이션이 어떤 유스케이스들을 제공하는지 파악할 수 없다.
- AccountService, AccountController 처럼 작성하게 되면 어떤 유스케이스를 구현했는지 파악하기 어렵다.
- 특정 기능을 찾기 위해서 어떤 서비스가 이를 구현했는지를 추측해야 하고, 해당 서비스 내의 어떤 메서드가 그에 대한 책임을 수행하는지 일일이 찾아야 한다.
1단계 - 기능(도메인) 으로 분리하기
위 패키지 구성은 Account와 관련된 모든 코드를 account 패키지에 모아서 관리한다.
즉, 특정 도메인의 기능을 하나의 패키지에서 관리합니다.
- 패키지 관리를 통해 외부에서 접근되면 안 되는 클래스들에 대해 package-private 접근 수준을 이용해 패키지 간의 경계를 강화할 수 있습니다.
AccountService의 책임을 조금 더 명확히 하기 위해 SendMoneyService명으로 바꾸어 구현하려는 유스케이스를 클래스 명으로도 간편하게 찾을 수 있습니다.
더 나아가, 기능으로 나눈 구조에 역할별로 나누기
2단계 - 표현력있는 아키텍처 패키지 구조 만들기
헥사고날 아키텍처에서 핵심적인 요소인 도메인, 인커밍/아웃고잉 포트, 인커밍/아웃고잉 어댑터를 패키지에 표현합니다.
도메인 패키지에는 도메인과 관련된 클래스를 작성합니다.
애플리케이션 패키지에는 인커밍/아웃고잉 포트를 작성하여 도메인을 다루는 인터페이스를 작성합니다. in, out을 나누어 표현하여 들어오고 나가는 흐름을 명확하게 표현합니다. 추가로 service 패키지를 두어 service 클래스를 작성합니다.
어댑터 패키지는 애플리케이션 계층을 호출하는 인커밍 어댑터와 애플리케이션 계층의 아웃고잉 포트에 대한 구현을 제공하는
아웃고잉 어댑터를 포함합니다.
각 역할을 나누고 표현력 있게 패키지 구조를 잡음으로써 변경이 필요하거나 기능을 추가하려고 할 때 어느 위치에 넣어야 하는지 빠르게 파악할 수 있습니다.
또한, 각 역할에 따라 패키지를 분리했기에, 작업 중인 코드를 어떤 패키지에 넣어야 하는지 계속해서 고민하게 되어 관련 없는 코드가 무분별하게 섞이는 일이 줄어드는 장점이 있습니다.
3단계 - 의존성 역전 적용하기
클린 아키텍처 구조를 잡기 위해서는 애플리케이션 계층이 인커밍/아웃고잉 어댑터에 의존성을 갖지 않아야 합니다.
-> 웹, 애플리케이션, 영속성 계층 간의 의존성 흐름이 애플리케이션(코어)로 향해야 함.
- 인커밍 어댑터는 웹 계층과 유사하여 의존성을 그대로 유지합니다.
- 제어 흐름 방향이 어댑터와 도메인 코드 간의 의존성 방향과 같다.
- 어댑터는 애플리케이션에 위치한 서비스를 호출한다.
- 그럼에도 불구하고, 애플리케이션 계층으로의 진입점을 구분 짓기 위해 실제 서비스를 port 인터페이스에 숨겨 인커밍 어댑터와 인 포트를 연결합니다.
- 아웃고잉 어댑터와 애플리케이션 계층은 의존성 역전이 필요합니다.
- 애플리케이션 계층에 아웃 포트 인터페이스를 만들고, 아웃 고잉 어댑터에 해당 인터페이스를 구현한 클래스를 작성합니다.
- 애플리케이션 계층은 어댑터의 기능을 실행하기 위해 포트 인터페이스를 호출하여 처리합니다.
- -▷ : 구현을 의미
- -▶︎ : 의존을 의미
📌
표현력 있는 패키지 구조 덕분에, 특정 기능을 찾을 때 도메인 패키지를 찾고 원하는 계층을 탐색하며 수월하게 찾을 수 있습니다. 또한, 일반적인 클래스 이름이 아닌 하나의 유스케이스를 표현하는 클래스명을 통해 어떤 작업을 진행하고 있는지, 기능 분석을 파악하는 데 있어서 용이합니다.
반응형
'개발 도서 > 만들면서 배우는 클린 아키텍처' 카테고리의 다른 글
클린 아키텍처 유지보수를 망치는 습관 3 가지 (1) | 2024.12.01 |
---|---|
헥사고날 아키텍처에서 유스케이스 설계와 입출력 모델 관리 전략 (0) | 2024.11.30 |
클린 아키텍처 설계 1단계 - 단일 책임 원칙, 의존성 역전 원칙 적용하기 (1) | 2024.11.17 |
클린 아키텍처란 무엇인가, 계층형 아키텍처의 문제점과 함정 (0) | 2024.11.13 |