이 영역을 누르면 첫 페이지로 이동
root proejct 하나에, 그 하위로 sub module 여러 개를 두는 방식이 상호 import하기 좋다.
여러개의 sub module로 나누어서 개발하는 프로젝트라면 하나의 repository를 쓰는 편이 좋은데, 어떤 기능이 어디서 사용되는지 파악하기 쉽기 때문이다. repo가 모듈 단위로 다 나뉘어져 있으면 기능 수정 할 때 이 기능이 어디서 참조되는지 찾아내기 쉽지 않다.
멀티 모듈로 만들기 전에 참고 - https://techblog.woowahan.com/2637/
여기 나온 사례의 문제점은 common의 의미를, "2개 이상 쓰는 곳이 있다면 common에 넣자"라고 생각해버려서, common이 너무 비대해졌다는 점.
common은 모듈 전역적으로 적용되거나 독립 모듈로 구성하기 애매한 것들만 넣고, (비즈로직이 아닌 것)
나머지는 비즈니스 로직 별로 독립 모듈로 쪼개야 common이 비대해지는 것을 막을 수 있다.
plasma-benefit/posts/485 이 사례도 참고해볼만 하다.
https://share.navercorp.com/neday2022/lecture/1427158 이 사례도. core less 아키텍쳐의 장점과 그럼에도 코드 중복을 줄일 수 있는 방법에 대해 얘기하고 있다. (core가 아닌 supports)
정리하면 공통 모듈이 아예 없는 것은 아니고, 비즈로직이 아닌 , "지원", "유틸" 등에 속하는 것만 공통으로 뺄 수 있다.
멀티 모듈, 서브 모듈로 구성했을 때의 장점은?
▲ 관심 분리를 통한 스파게티 코드 방지, 변경 범위 축소
왜 세모? 패키지만 나눠도 효과를 볼 수 있는 영역이기 때문.
단, 분리된 패키지 간 참조는 양방향이고, 분리된 모듈 간 참조는 단방향만 가능하다는 중요한 차이점이 있다.
O 독립된 모듈(library)로서 여기저기서 가져다 쓸 수 있는 확장성
O 독립된 jar로 패키징하므로 별도의 main 가지고 단독 실행 가능
O 모듈 별로 사용하는 의존성을 다르게 관리 할 수 있음 (게다가 버전도 다르게 갈 수 있다.)
모듈이 나뉘어져있지 않고 패키지만 나뉘어진 구조에서 시스템이 비대해졌다면, 의존성 버전 하나 바꿀 때 테스트 해야 하는 범위가 너무 커질 수 있음.
X 단독 실행을 위해 패키징 하는 경우 jar 용량 감소 -> 어차피 용량이 커지는 주 요인은 라이브러리인데, 서브 모듈도 단독 실행을 위해 라이브러리를 포함해서 패키징 한다면 용량이 드라마틱하게 절감되지는 않는다.
▲ 구동 속도 향상 -> 기본적으로 jvm 환경에서는 초기 구동 속도가 빠른 편은 아니지만 서브 모듈이 framework 사용하지 않는다면 단독 실행 시 1s 이내 수준으로는 만들 수 있다.
root build.gradle 두는 방법
root build.gradle 없는 방법
이 방법은 공통으로 쓰이는 plugin 등이 중복해서 load 된다는 단점이 있다. 큰 문제는 아니지만 공통 설정을 명시할 root project나 common parent project를 두는 것이 나아보인다.
에러 정리
Gradle implementation 과 compile(api)의 차이
common 모듈에서, import 시 `` implementation 'coroutine'`` 으로 하게 되면
common 모듈을 가져다 쓰는 곳에서 어떻게 import하든, coroutine 모듈의 내용이 보이지 않는다.
반면 common 모듈에서 `` compile 'coroutine'`` 하게 되면
common 모듈을 가져다 쓰는 곳에서 coroutine 모듈의 내용이 보인다. (따라서 별도 임포트 필요 X. 충돌 가능성 올라감.)
`` compile``은 deprecated 되었고 `` api`` 로 바뀌었다.