Ch01. 계층형 아키텍처의 문제는 무엇일까?


계층형 아키텍처의 문제는 무엇일까?

계층형 아키텍처는 코드에 나쁜 습관들이 스며들기 쉽게 만들고 시간이 지날수록 소프트웨어를 점점 더 변경하기 어렵게 만드는 수많은 허점들을 노출한다.

그 이유에 대해 살펴보자.


계층형 아키텍처는 데이터베이스 주도 설계를 유도한다

계층형 아키텍처에서는 모든 것이 영속성 계층을 토대로 만들어진다.

p3
우리는 상태(state)가 아니라 행동(behavior)을 중심으로 모델링한다.

비즈니스 로직 같은 경우는 상태가 아닌 행위 위주로 모델링이 되어야 한다.

비즈니스 관점에서는 다른 무엇보다도 도메인 로직을 먼저 만들어야 한다.

그래야 우리가 로직을 제대로 이해했는지 확인할 수 있고, 도메인 로직이 맞다는 걸 확인한 후에 이를 기반으로 영속성 계층과 웹 계층을 만들어야 한다.

p4
영속성 계층과 도메인 계층 사이에 강한 결합이 생긴다.

JPA Entity에는 의존성이 많이 들어가게 되고, 엔티티를 통해서 테이블의 관계를 구성하는 작업을 하게 된다.

이때, 영속성 계층과 도메인 계층 사이에 강한 결합이 발생된다.

JPA를 사용하면 엔티티를 통해 테이블의 관계를 구성하는 작업을 하게 되는데, 영속성 계층과 도메인 계층 사이에 강한 결합이 생길 수 밖에 없는 구조다.

강한 결합이 발생하지 않으려면 영속성, 도메인 계층을 강하게 분리하여 개발하여야 한다.

영속성 계층과 비즈니스 모델을 분리해서 개발해야 한다.

헥사고날 아키텍처의 경우, 강제성을 가지고 분리하여 개발하게 할 수 있다.


지름길을 택하기 쉬워진다

p5
전통적인 계층형 아키텍처에서 전체적으로 적용되는 유일한 규칙은, 특정한 계층에서는 같은 계층에 있는 컴포넌트나 아래에 있는 계층에만 접근 가능하다는 것이다.

개발 팀 내에서 합의한 다른 규칙들이 있을 수 있고, 그중 일부는 개발 도구를 이용해 강제화했을지도 모르지만, 계층형 아키텍처 자체는 위 규칙 외의 다른 규칙을 강제하지 않는다.

계층형 아키텍처는 잘 만들어진 아키텍처이다.

다만, 강제성이 없기 때문에 프로젝트를 진행하는 구성원들이 관리를 잘 하지 않게 되거나, 일정으로 인해서 신경을 쓰지 못하게 될경우 상대적으로 오염되기 쉬운 아키텍처이라는 단점이 있다.

계층형 아키텍처는 강제성이 없기 때문에 일정이 바빠지거나 개발 구성원이 유지보수성을 생각하지 않거나 하는 일이 발생하기도 한다.

계층형 아키텍처에서는 프레젠테이션 계층에서 영속성 계층에 직접 접근 가능하게 된다.

(의존성 방향이 한 방향으로 쏠리게 되기 때문에 프레젠테이션 계층이 영속성 계층을 바라볼 수도 있다. )

이로 인해 스파게티 코드가 될 수 있고, 복잡성이 증가하게 된다.

계층형 아키텍처를 사용하더라도 실질적으로 협업하는 동료와 규칙을 잘 정하고, 코드 리뷰가 제대로 이뤄진다면, 효율성을 유지하면서도 유지보수성을 유지할 수 있다고 생각한다.


테스트하기 어려워진다

계층형 아키텍처에서 계층을 건너뛸 수 있기 때문에 발생하는 문제점

  1. 단 하나의 필드를 조작하는 것에 불과하더라도 도메인 로직을 웹 계층에 구현하게 된다.
  2. 웹 계층 테스트에서 도메인 계층뿐만 아니라 영속성 계층도 모킹(mocking)해야 한다는 것이다.

→ 테스트 복잡도가 올라가게 된다.


유스케이스를 숨긴다

p8
계층형 아키텍처는 도메인 서비스의 ‘너비’에 대한 규칙을 강제하지 않는다.


동시 작업이 어려워진다

p10
데이터베이스 주도 설계는 영속성 로직이 도메인 로직과 너무 뒤섞여서 각 측면을 개별적으로 작업할 수 없기 때문이다.

코드에 넓은 서비스가 있다면 서로 다른 기능을 동시에 작업하기가 더욱 어렵다.


유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?

p11
아주 엄격한 자기 훈련 없이는 시간이 지날수록 품질이 저하되고 유지보수하기가 어려워지기 쉽다.

계층형 아키텍처의 함정을 염두에 두면 지름길을 택하지 않고 유지보수하기에 더 쉬운 솔루션을 만드는 데 도움이 될 것이다.

어떤 아키텍처를 선택하든 시간이 지나도 품질이 저하되지 않고, 유지보수하기 쉽도록 꾸준한 노력이 필요하다고 생각한다.

이 노력은 한 개인이 노력하는 차원이 아닌, 더 나아가 팀에서 동료들과 함께 이루어질 때 가능하다고 생각한다.