아키텍처 경계를 분리하는 데는 비용이 많이 든다. 독립적으로 컴파일하고 배포할 수 있는 컴포넌트를 만들고 관리하기 위해서는 의존성 관리가 필수인데 많은 노력이 들어간다. 애자일 커뮤니티에 속한 사람 중 많은 사람들은 YAGNI 원칙에 위배된다고 말하며 경계를 만드는 것에 반대하기도 하지만, 아키텍처는 부분적 경계가 어쩌면 필요할지도 모른다고 생각한다.
마지막 단계를 건너뛰기
소스코드 레벨에서 모두 분리를 하지만, 컴포넌트를 분리하지 않으면 동시에 컴파일하고 배포할 수 있다. 하지만 완전히 독립되지 않은 형태이므로 의존성이 잘못된 방향으로 선을 넘을 가능성이 크다.
일차원 경계
인터페이스와 구현체를 분리해 일차원 경계를 만드는 것이다. Controller(C) -> Service(I) <= ServiceImpl(C) 의 관계는 Service 인터페이스가 Controller 와 ServiceImpl 의 경계선 역할을 한다. 하지만 이 역시 ServiceImpl 이 Controller 를 사용할 수 있는 백도어를 만들 수 있는 문제점이 존재한다.
퍼사드
모든 외부 클라이언트가 퍼사드를 통해 내부 서비스를 호출하는 방식이다. 클라이언트는 서비스 클래스에 직접 접근할 수 없다. 하지만 Client 가 모든 서비스 클래스에 대해 추이 종속성을 가지게 되고, 적적 언어였다면 소스코드가 변경되면 Client 도 재컴파일을 해야 한다. 이 역시 백도어를 쉽게 만들 수 있다.