공유 라이브러리의 역할
코드 중복을 방지하기 위해 여러 애플리케이션에서 재사용 가능한 기능을 라이브러리(모듈)로 패키징하는 것은 개발자에게 당연한 일입니다(메이븐이나 npm 같은 리포지터리가 없었으면 얼마나 힘들었을까요?). 그래서 마이크로서비스 아키텍처에서도 공유 라이브러리(shared library)를 사용하고픈 유혹에 빠지기 쉬운데, 서비스 코드 중복을 줄이는 것은 좋지만 의도치 않은 서비스 간 결합도를 유발하지 않도록 조심해야 합니다.
예를 들어 Order라는 비즈니스 객체를 여러 서비스가 업데이트하는 상황을 생각해 봅시다. 필요한 공용 기능을 라이브러리 하나에 모두 패키징해 배포하면 될 테니…… 코드 중복은 안 해도 되겠지만 나중에 요건이 Order에 영향을 주는 방향으로 변경되면 어떻게 될까요? 관련 서비스를 일제히 다시 빌드해서 재배포해야겠죠. 이렇게 변경 가능성이 조금이라도 있는 기능이라면 별도의 서비스로 구현하는 것이 낫습니다.
물론 바뀔 일이 거의 없는 기능은 라이브러리에 담아 쓰는 것이 좋습니다. 가령 제네릭 클래스 Money를 사용하는 서비스마다 구현하는 것은 말도 안 됩니다. 당연히 전체 서비스가 사용 가능한 라이브러리로 공통화해야 하겠죠.