01. 계층형 아키텍처의 문제는 무엇일까
계층형 아키텍처
- 일반적인 3계층 아키텍처
- 웹 계층에선 요청을 받아 도메인 계층에 있는 서비스로 요청을 보낸다.
- 서비스에서는 필요한 비즈니스 로직을 수행한다.
- 도메인 엔티티의 현재 상태를 조회하거나 변경
- 영속성 계층 컴포넌트를 호출
- 잘 만들어진 계층형 아키텍처는 선택의 폭을 넓히고 변화하는 요구사항과 외부 요인에 빠르게 적응할 수 있게 해준다.
- 하지만 계층형 아키텍처에는 나쁜 습관들이 스며들기 쉽고 시간이 지날수록 소프트웨어를 점점 더 변경하기 어렵게 만든다.
계층형 아키텍처는 데이터베이스 주도 설계를 유도한다
지름길을 택하기 쉬워진다.
- 계층형 아키텍처에서의 유일한 규칙은 ‘특정 계층에서는 같은 계층의 컴포넌트나 아래 계층에만 접근 가능하다’는 것이다.
- 만약 상위 계층에 위치한 컴포넌트에 접근해야 한다면 간단하게 컴포넌트를 계층 아래로 내려버리면 된다.
- 이러한 지름길을 사용하면서 시간이 지나다 보면 영속성 계층이 비대해질 것이다.
- 어떤 계층에도 속하지 않는 헬퍼 컴포넌트나 유틸 컴포넌트들이 아래 계층으로 내릴 가능성이 큰 후보들이다.
- ‘지름길 모드’를 끄고 싶다면 추가적인 아키텍처 규칙을 강제해야 하는데, ‘강제한다’는 것은 코드 리뷰 등이 아닌 규칙이 깨졌을 때 빌드가 실패하도록 만드는 규칙을 말한다.
테스트하기 어려워진다.
- 계층형 아키텍처를 사용할 때 흔히 계층을 건너뛰는 일이 발생한다.
- ex) 엔티티의 필드를 하나만 조작하면 되는 경우 웹 계층에서 바로 영속성 계층에 접근하면 도메인 계층을 건드릴 필요가 없다. (이런 유혹을 받게 된다)
- 단 하나의 필드를 조작하는 것에 불과하더라도 도메인 로직을 웹 계층에서 구현하게되면 앞으로의 유스케이스 확장에서 더 많은 도메인 로직이 웹 계층에 추가되어 핵심 도메인 로직이 퍼져나갈 확률이 높다.
- 웹 계층 테스트에서 도메인, 영속성 계층도 모킹하거나 테스트해야 한다.
- 단위 테스트 복잡도가 올라간다.
- 테스트 설정이 복잡해진다.
- 웹 컴포넌트의 규모가 커지면 테스트 복잡도를 늘리고 테스트 코드 작성보다 목을 만드는데 더 많은 시간이 걸리게 된다.
유스케이스를 숨긴다.
동시 작업이 어려워진다.
지연되는 소프트웨어 프로젝트에 인력을 더하는 것은 개발을 늦출 뿐이다. «맨머스 미신: 소프트웨어 공학에 관한 에세이», 프레더릭 P. 브룩스
- 개발 속도를 높이기 위해 인원을 더 투입한다 한들 아키텍처가 동시 작업을 지원하지 않으면 의미가 없다.
- 계층형 아키텍처에선 3명이서 각각 웹, 도메인, 영속성 계층을 동시에 작업할 수 없다.
- 코드에 넓은 서비스가 있다면 서로 다른 기능을 동시에 작업하기가 더욱 어렵다.
- 같은 서비스를 동시에 편집하기에 충돌을 해결해야 한다.