아키텍처

[멀티 모듈] 왜 멀티 모듈인가? 멀티 모듈 학습하기

Kyle H 2023. 8. 17. 21:29

언제 한번 멀티 모듈에 대해서 공부해봐야지 했는데, 그게 오늘이 되었습니다. 

 

멀티 모듈의 사용 이유는 인터넷의 많은 자료에서 공통적으로 사용되는 코드의 재사용과 휴먼 이슈를 없앨 수 있는 이유을 가장 많이 이야기 합니다. 

저의 경우엔 "만들면서 배우는 클린 아키텍처" 책을 보다가 10장. 아키텍처 경계 강제하기에서 나온 내용을 보고 왜 멀티 모듈이 중요한지 알게 되었습니다.

 

1. 왜 중요할까?

많은 예시로 드는 공통적으로 참조하는 도메인 영역에 대한 예시는 많이 나와있으니, 아키텍처 경계에 대한 이야기를 해보겠습니다.

클린 아키텍처가 아니더라도, 아키텍처의 핵심은 의존성에 대한 관리입니다. 의존성을 제대로 관리하지 못하면 코드에 점점 순환참조가 생겨나고, 새로운 기능 추가나 유지보수를 어렵게 합니다.

그래서 클린 아키텍처에서는 한가지 명확한 룰은 정했습니다. "의존성은 안쪽으로만 흐른다."

아키텍처의 안쪽으로 갈수록, 우리가 다루는 핵심 관심사가 되고, 웹, DB, UI 등은 세부사항으로 분류됩니다.

위와 같은 구조와 룰로 인해 개발자는 경계를 명확히 할 수 있다는 장점이 있습니다.

 

2. 문제는?

위 구조가 하나의 빌드 아티팩트의 일부가 되면 문제가 생깁니다. 

자바에서는 기본적으로 패키지와 접근 제어자로 경계를 생성하는데, 문제가 되는 것은 유스케이스 계층의 포트들입니다.

인고잉, 아웃고잉 포트 모두 자바에선 인터페이스로 정의되는데, 인고잉 웹 어댑터에서는 호출을 위해 접근을 해야하니 public으로 열려 있어야 하고, 아웃고잉 영속성 어댑터에서는 유스케이스 인터페이스를 구현해야 하니 또 public으로 열려있어야 합니다.

 

그런데, 이렇게 인터페이스가 public으로 열려있으면 내부 계층인 도메인 계층에서도 유스케이스를 참조할 수 있게 되어버려, 클린 아키텍처의 룰을 깨버립니다.

 

3. 해결방안은?

컴파일러는 아키텍처 룰은 깼다고 해서 경고를 주지 않습니다.

그렇다면 다른 해결방안을 적용해야 합니다.

 

먼저 ArchUnit을 사용하는 방법이 있습니다.

ArchUnit과 JUnit을 통해 의존성의 방향이 기대한 대로 잘 설정돼있나 체크할 수 있는 하나의 방법입니다.

하지만 치명적인 단점은 시스템을 리팩토링 하게 될 때, 테스트 코드도 일일이 고쳐야 하는 문제가 있습니다.

 

4. 왜 멀티모듈인가?

다음 방법이 멀티 모듈을 통해 빌드 아티팩트를 분리하는 방법입니다.

위 예에서 도메인 계층을 따로 jar 파일로 만들고, 유스케이스 계층 따로 jar 파일로 만들어지게 할 수 있습니다. 

컴파일과 런타임 시에 어떤 의존성을 가져갈지 명시적으로 선언해줄 수 있기 때문에 더욱 더 명확하게 경계를 만들어낼 수 있습니다.

도메인 계층에서 유스케이스 계층을 참조한다는 선언이 없으면, 아무리 포트 인터페이슥 public으로 열려있다고 하더라도 엔티티 계층에서는 이를 참조 할 수 없습니다.

 

5. 클린아키텍처와 멀티 모듈

사실 위와 같은 고민들은 사이드 프로젝트를 클린 아키텍처로 구현해보자! 라는 목표를 시작으로 하게 되었습니다.

클린 아키텍처에 gradle 멀티 모듈까지 얹어서 다루다 보니 딱 마음에 드는 참고자료가 많이 없었습니다.

결국 돌고돌아 위에서 언급한 책의 저자인 Tom Hombergs가 남긴 블로그글에서 클린 아키텍처와 이 저자가 얘기하는 조립하는 컴포넌트의 개념에 감이 좀 잡힌 것 같습니다. 추가로 배민 기술 블로그와 인프콘에 관련 내용이 있어 같이 링크 남깁니다.

 

https://reflectoring.io/spring-boot-gradle-multi-module/

 

Building a Multi-Module Spring Boot Application with Gradle

A tutorial on how to split up a Spring Boot application into multiple Gradle modules.

reflectoring.io

https://techblog.woowahan.com/2637/

 

멀티모듈 설계 이야기 with Spring, Gradle | 우아한형제들 기술블로그

{{item.name}} 멀티 모듈 설계 이야기 안녕하세요. 배달의민족 프론트 서버를 개발하고 있는 권용근입니다. 멀티 모듈의 개념을 처음알게 되었을 때부터 현재까지 겪었던 문제점들과 그것을 어떻게

techblog.woowahan.com

https://techblog.woowahan.com/12720/

 

Spring Boot Kotlin Multi Module로 구성해보는 헥사고날 아키텍처 | 우아한형제들 기술블로그

{{item.name}} 들어가는 말 백엔드 개발자들은 프로젝트를 처음 구성할 때 사용할 기술에 관해 많은 고민을 합니다. 우리 데이터베이스(DB)로 CockroachDB가 요즘 흥한다던데 이걸 사용해 보는 건 어떨

techblog.woowahan.com

https://www.youtube.com/watch?v=ipDzLJK-7Kc&t=107s