소프트웨어 설계 패턴 중 하나로, 시스템을 여러 개의 계층으로 분리하여 각 계층이 특정 역할을 수행하도록 하는 방식
특정한 계층에서는 같은 계층에 있는 컴포넌트나 아래에 있는 계층에만 접근 가능
사용자의 응답 및 요청 처리하는 계층
비즈니스 로직을 수행하는 계층
데이터베이스에 요청을 전달(접근)하는 계층.
데이터베이스가 운영되는 계층
계층별로 낮은 결합도를 가지고 계층 내에서 높은 응집도를 가지면 유지보수 용이 및 확장성 향상
ORM(Object-Relational Mapping)이 계층형 아키텍처와 결합하면 데이터베이스 주도 설계를 할 가능성이 높아짐.
ORM에 의해 관리되는 엔티티는 영속성 계층에 있고 도메인 계층에서 엔티티에 접근하면서 강한 결합이 생김.
이로 인해 도메인 계층에서 도메인 로직 뿐만 아니라 영속성 로직(즉시로딩/지연로딩, 트랜잭셔느 캐시 플러시 등)까지 수행하게 됨.
마감 기한에 쫓기거나 누군가 한번 지름길을 택하게 되면 이후에는 지름길을 택하는 경우가 많아짐.
(지름길: 상위 계층 컴포넌트에 접근해야 하는 경우 해당 컴포넌트를 하위 계층으로 내려버리는 행위 등)
웹 계층에서 도메인 계층을 거치지 않고 바로 영속성 계층에 접근하는 경우 테스트하기 어려워짐.
1. 필드 하나를 조작하더라도 도메인 로직이 웹 계층에 구현되게 되어 책임이 섞이고 핵심 도메인 로직이 퍼져나할 확률이 높아짐.
2. 웹 계층 테스트에서 도메인 계층과 영속성 계층을 모두 mocking 해야하는 문제 발생.
도메인 로직이 퍼져나가게 되고, 서비스가 넓어지게 되는 문제가 발생하면 추가 유스케이스가 들어갈 위치를 찾기 어려워짐.
모든 것이 영속성 계층 위에서 만들어지기 때문에 여러 개발자가 동시에 작업하기 어려움.
서비스가 넓으면 같은 서비스를 여러명이 동시에 작업하면서 병합 충돌(merge conflict) 발생 가능성 높음.