웹 → 도메인 → 영속성
아래 방향으로 접근 가능하다.
계층을 잘 이해하고 구성한다면 웹/영속성 계층에 독립적으로 도메인 로직을 작성 가능하다.
ex> 도메인 로직을 건드리지 않고 영속성 계층에 사용된 기술 변경 가능
시간이 지날수록 소프트웨어를 점점 더 변경하기 어렵게 만드는 수많은 허점들을 노출한다.
웹 → 도메인 → 영속성 흐름으로 의존하기 때문에 결국 데이터베이스에 의존하게 된다.
= 데이터베이스 기반으로 아키텍처를 설계한다
데이터베이스의 구조 → 토대로 도메인 로직 구현
도메인 계층: 서비스
⬇
영속성 계층: 엔티티, 레포지토리
계층형 아키텍처의 유일한 규칙: 같은 계층이나 하위 계층에만 접근 가능하다.
만약에 상위 계층의 클래스가 필요하다면?
→ 하위 계층으로 내려버리면 된다.
→ 이 과정이 죄책감 없이 반복된다면 영속성(최하단) 계층의 크기는 매우 커질 것이다.
ex> 헬퍼, 유틸리티
컨트롤러에서 엔티티를 바로 접근해도 된다면? (웹 → 영속성 계층)
프로젝트를 변경하거나 추가할 경우, 그 위치를 찾기 위해 코드를 빠르게 탐색하는데 아키텍처가 도움이 되어야 한다.
다른 계층에서 접근하기 쉽게 하기 위해 몇몇 클래스들을 하위 계층으로 옮겼다면, 적절한 위치를 찾기 더 어려워진다.
많은 유스케이스를 담당하는 넓은 서비스가 만들어진다. → 영속성 계층에 많은 의존성을, 많은 웹 컴포넌트들은 또 이 서비스에 의존하게 된다.
유스케이스 하나씩만 담당하는 고도로 특화된 좁은 도메인 서비스를 만들자.
영속성 계층을 기반으로 모든 것이 만들어지기 때문에 개발자들이 여러 계층을 하나씩 맡아서 동시 작업을 진행할 수 없다.
시간이 지날수록 품질이 저하되고 유지보수하기 어려워지기 쉽다.
서론
몇 개 하진 않았지만 프로젝트를 진행할 경우 나도 정확히 위의 일반적인 3계층 아키텍처로 컨트롤러, 서비스, 레포지토리 등을 설계하고 구현했다. 기존의 방식과 클린한 아키텍처를 어떤 점이 더 나은지 비교하고 공부해보고 싶어서 헥사고날 아키텍처에 참여하게 되었다.
데이터베이스 주도 설계
프로젝트를 구현 전 설계를 하는 단계에서 유즈케이스 분석보다는 필요한 기능, 요소들과 거기에서 필요한 도메인과 컬럼들을 빼내서 erd를 설계하고 그에 맞춰서 구현을 시작했다.