아키텍처 경계를 강제한다는 것은 의존성이 올바른 방향을 향하도록 강제하는 것을 말합니다. 시간이 지나면서 경계를 지키기 어려워지고, 이는 유지 보수를 어렵게 만듭니다. 따라서 접근 제한자를 사용하거나 컴파일 후 체크하거나 빌드 아티팩트로 나누는 방법으로 아키텍처 경계를 강제함으로써 사람들이 지름길을 택하지 않게 만들 수 있습니다.

접근 제한자를 사용하는 방법

언어에서 제공하는 접근 제한자를 사용해서 포트만 퍼블릭으로 접근하게 만들면 다른 패키지들은 어댑터에 직접 의존할 수 없습니다.

그러나 패키지 내의 클래스가 특정 개수를 넘어가기 시작하면 하나의 패키지에 너무 많은 클래스를 포함하는 것이 혼란스러워지게 됩니다. 하위 패키지를 만들고 싶어도 자바에서는 하위 패키지를 다른 패키지로 취급하기 때문에 하위 패키지 package-private 멤버에 접근할 수 없게 됩니다. 그래서 하위 패키지의 멤버는 public으로 만들어서 바깥 세계에 노출시켜야 하기 때문에 우리의 아키텍처에서 의존성 규칙이 깨질 수 있는 환경이 만들어집니다.

컴파일 후 체크하는 방법

컴파일 후 체크하는 방법은 의존성을 체크해 주는 프로그램을 별도로 실행하는 것입니다. 특히 지속적인 통합 빌드 환경에서 자동화된 테스트 과정에 포함시키면 좋습니다.

하지만 코드와 함께 유지 보수되어야 하기 때문에, 만약 패키지 이름에 오타가 있다면 의존성 규칙이 위반돼도 이를 찾지 못할 수 있습니다. 그래서 실패에 안전(fail-safe) 하지는 않습니다. 따라서 이 방법을 사용할 때에는 클래스를 찾지 못했을 때도 실패하는 테스트를 함께 작성해야 합니다.

빌드 아티팩트로 나누는 방법

빌드 아티팩트란 빌드 프로세스의 결과물을 말합니다. 자바 진영에서 가장 많이 사용하는 빌드 도구인 메이븐(Maven)이나 그레이들(Gradle)의 빌드 스크립트가 있고, 컴파일하고, 테스트하고, 하나의 JAR 파일로 패키징 하는 프로세스를 거쳐 나온 결과물이 빌드 아티팩트가 되는 것이죠.

이러한 빌드 도구의 주요 기능 중 하나는 코드베이스가 의존하고 있는 모든 아티팩트가 사용 가능한지 확인하는 의존성 해결입니다. 이를 활용해서 모듈과 아키텍처의 계층 간의 의존성을 강제할 수 있습니다.

하지만 빌드 스크립트를 유지 보수하는 비용이 수반하기 때문에 여러 개의 빌드 모듈로 나누기 전에 아키텍처가 어느 정도는 안정된 상태여야 한다.