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

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

계층형 아키텍처

  • 웹 계층은 도메인 계층에 의존하고, 도메인 계층은 영속성 계층에 의존하기 때문에 자연스럽게 데이터베이스에 의존하게 된다.

애플리케이션의 목적

  • 비즈니스를 관장하는 규칙이나 정책을 반영한 모델을 만들어서 사용자가 이러한 규칙과 정책을 더욱 편리하게 활용할 수 있게 한다.

  • 상태가 중요한 요소이긴 하지만 행동이 상태를 바꾸는 주체이기 때문에 행동이 비즈니스를 이끌어간다.

문제

  • 전통적인 계층적 아키텍처에서는 데이터베이스 구조를 먼저 생각하고, 이를 토대로 도메인 로직을 구현했다.

  • 비즈니스 관점에서는 도메인 로직을 먼저 만든 후, 이를 기반으로 영속성 계층과 웹 계층을 만들어야 한다.

데이터베이스 중심적인 아키텍처가 만들어지는 원인

  • ORM(object-relational mapping, 객체 관계 매핑) 프레임워크를 사용하기 때문이다.

  • ORM에 의해 관리되는 엔티티들은 영속성 계층에 두는데, 계층은 아래 방향으로만 접근 가능하기 때문에 도메인 계층에서 이러한 엔티티에 접근할 수 있게 된다.

  • 문제

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

    • 서비스는 영속성 모델비즈니스 모델처럼 사용하게 되고,이로 인해 즉시로딩/지연로딩, 데이터베이스 트랜잭션, 캐시 플러시 등의 영속성 계층 관련 작업을 해야 한다.

    • 영속성 코드가 사실상 도메인 코드에 녹아들어가서 둘 중 하나만 바꾸는 것이 어려워진다.

지름길을 택하기 쉬워진다

계층형 아키텍처에서의 유일한 규칙

특정한 계층에서는 같은 계층에 있는 컴포넌트나 아래에 있는 게층에만 접근 가능

문제

  • 상위 계층에 위치한 컴포넌트에 접근해야 할 경우 컴포넌트를 계층 아래로 내리는 쉬운 선택을 하게 된다.

  • 최하단 계층은 시간이 갈수록 비대해질 가능성이 크다.

테스트하기 어려워진다

  • 도메인 로직을 웹 계층에 구현하게 된다.

  • 웹 계층 테스트에서 도메인 계층뿐만 아니라 영속성 계층도 모킹해야 한다. 단위 테스트의 복잡도가 올라가게 되고, 이는 테스트를 작성하지 않는 방향으로 가는 첫걸음이 된다. 복잡한 설정을 할 시간이 없기 때문이다.

유스케이스를 숨긴다

  • 기능을 추가하거나 변경할 적절한 위치를 찾는 일이 빈번하기 때문에 아키텍처는 코드를 빠르게 탐색하는 데 도움이 돼야 한다.

  • 계층형 아키텍처에서는 도메인 로직이 여러 계층에 걸쳐 흩어지기 쉬워 적당한 위치를 찾는 일이 어렵다.

  • 계층형 아키텍처는 도메인 서비스의 '너비'에 관한 규칙을 강제하지 않아, 시간이 지나면 여러 개의 유스케이스를 담당하는 아주 넓은 서비스가 만들어지기도 한다.

동시작업이 어려워진다

“지연되는 소프트웨어 프로젝트에 인력을 더하는 것은 개발을 늦출 뿐이다.”

계층형 아키텍처에서의 작업

  • 모든 것이 영속성 계층 위에 만들어지기 때문에 영속성 -> 도메인 -> 웹 계층 순서로 만들어야 하기 떄문에, 특정 기능은 동시에 한 명의 개발자만 작업할 수 있다.

인터페이스를 정의하고 작업하면 안되나요 ..?

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

만약 서비스의 범위까지 넓다면 ..?

  • 같은 서비스 안에서 서로 다른 기능을 동시에 편집해야하는 상황 발생 가능성이 높다.

  • 이는 병합 충돌(merge conflict)과 잠재적으로 이전 코드로 되돌려야 하는 문제를 야기한다.

SUMMARY

  • 왜 '도메인 로직'이 아닌 '데이터베이스'를 토대로 아키텍처를 만드는 건가 ?

  • 왜 '도메인 로직'을 먼저 만들어야 하는가 ?

  • 데이터베이스 중심적인 아키텍처가 만들어지는 원인은 ?

DISCUSSION

Last updated