10장 아키텍처 경계 강제하기
권규
아키텍처 경계란 각 계층별 경계를 의미하는 것 같다. 예를 들어 흔히 쓰던 controller, service, repository 계층이 서로 완전히(또는 최대한) 분리되서 변경의 영향을 최소한으로 받는 것을 추구하는 것이라 생각되는데 이걸 단순히 준수하는 것 뿐 아니라 어떻게 강제할 수 있을지를 이번 단원에서 다루고 있다.
가장 기본적인 것은 접근 제한자로 이전에 포트를 구현한 서비스 구현체를 public이 아닌 package-private으로 두어 어댑터가 구현체를 직접 접근하지 못하고 포트를 통해서 접근하도록 강제하는 것이다. 스프링의 클래스패스 스캐닝(
@ComponentScan
)에서는 리플렉션을 사용하기 때문에 동작에는 문제가 없다고 한다.테스트 코드를 사용해서 패키지 구조를 검증할 수 있는 ArchUnit이라는 툴도 있다고 한다. 아마 실제로 쓸 일은 드물지 않을까 싶다.
애플리케이션이 충분히 커진다면 controller, repository같은 adapter나 port, port의 구현체 등을 각 빌드 모듈로 분리해서 컴파일 할 수 있다고 한다. 지금까지 프로젝트에서 하던것처럼 모든 구성요소를 하나의 패키지에 몰아넣는 방식은 monolithic module이고 이걸 아예 모듈 단위로 잘게 쪼개서 의존성의 방향을 강제할 수 있다고 한다. 추상적으로는 이해가 가지만 Java 모듈을 직접 분리하거나 활용해 본 적은 없기 때문에 좀 더 학습이 필요할 것 같다.