
평소에 좋아라하는 개발자들이 있는가?
나는 있다. 내가 선망하는 개발자들은 다음과 같이 공통된 특성을 가지고 있다.
그 중에 한 분이 제미니 님이시다.
정말 애청하는 유튜브인데, 너무 좋은 내용이 묵직하게 올라와 -- 강의 준비하신 자료보니 너무나도 깔끔해서 눈물이 날 정도다 -- 이렇게 정리해보았다.
** 꼭 원본인 지속 성장 가능한 소프트웨어를 만들어가는 방법 을 보시길

위와 같이 구성되어있다면, 확장성이 떨어진다. 왜냐고?
사내에서 JPA 스택이 아닌 NoSQL 로 마이그레이션을 해야만 하는 상황이라고 하자.
JPA 스택을 걷어내려면 API 모듈과 Batch 모듈 둘 다 걷어내는 작업을 해야한다.
그것도 “안정적으로”
그런데 만약 사내 모듈이 30개가 넘어간다면???


각각의 기능구현에 대한 모듈의 “의존성에 대해서 따로 모듈을 만들어”주는 것 이다.
이렇게 구성하게 되면 모듈을 수정 및 추가가 굉장히 편해진다는 이점이 있다.
또한 위 gradle 코드와 같이 의존성 분리가 잘 이루어진다는 점도 이점으로 뽑을 수 있다.
api() vs implemenation()
implemenation()을 사용하게 되면, Inner Module 에 대해 Outer Module 이 접근하지 못 하게 된다.
즉, 위와 같은 그림에서 SFTP 모듈이 제공하고 있는 인스턴스나 메서드들을 Batch 에서 사용하고자 한다면,
import 를 하지 못 하게 되어 사용하지 못 한다.

이를 api()를 사용하여 해결할 수 있다.
api()를 사용하면 Outer Module 에서 import 를 할 수 있게한다.
따라서 Batch 에서 import 문을 사용해 SFTP 모듈이 제공하고 있는 인스턴스나 메서드들을 사용할 수 있게된다.
그렇다면 언제 implementation()을 사용해야하는가?
implementation()
위와 같이 implmentation() 을 사용하여 단계 별 모듈을 의존하게 되면,
Outer Module 은 “Bridge Module 을 통해서” Inner Module 을 의존하고 있게된다.
( Bridge Module 은 내가 만든 용어다 ^^)
따라서 Outer Module 는 Inner Module 이 어떻게 변경되든 변경의 영향을 받지 않는다.
이에 따라 Inner Module 은 다음과 같이 변경될 수 있다.

요컨대, 변경될 수 있는 Inner Module 이라면 implementation() 을, API 처럼 외부에 공통적으로 제공되어야하는 Common Module api() 를 사용하자.
이제 "경험 상 이렇게 하는 게 좋더라" 라는 걸 들었으니,
"어떻게 하는가?" 가 궁금했다.
실제로 어떻게 처리하셨고 어떻게 할 수 있는지 의문인 부분이 있었다.
직접 만들어보며 어떻게 처리했는지를 확인해야겠다..