caffeine-library/Domain-Driven-Design

[question] 멀티 모듈을 어떻게 분리하고 계신가요?

Closed this issue · 4 comments

질문

이번에 진행하고 있는 신규 프로젝트에선 아래와 같은 멀티 모듈 구조를 사용하고 있는데, 자칫하면 support 에 너무 많은 공통 코드가 몰릴 수도 있을 것 같더라구요... 다른 분들께선 각 모듈의 공통적인 코드를 어떻게 분리해 사용하고 계신지 궁금합니다..!

  • core
    ㄴ infra
    ㄴ 각 비즈니스 로직(repo + service)
    ㄴ 등등..

  • api (메인 모듈)
    ㄴ infra
    ㄴ 각 비즈니스 로직(repo + service)
    ㄴ 등등..

  • pubsub (메인 모듈)
    ㄴ kafka 관련 패키지
    ㄴ 각 비즈니스 로직

  • entity (단순 entity 에 대한 명세. 각 모듈에서 entity 를 재정의해서 사용.)
    ㄴ mongodb 베이스 레포지토리
    ㄴ 각 Entity 에 대한 명세

  • support
    ㄴ 공통 유틸성 함수들 + 공통 확장 함수 등
    ㄴ redis
    ㄴ 사내 메시징 툴

https://www.youtube.com/watch?v=ipDzLJK-7Kc

예전에 이 영상을 봤던게 생각나네요

아래 글에서도 support(의존성, 유틸성 등의 부분)에 지나치게 많은 코드가 몰리는 것을 어떻게 해결할지에 대해 다루고 있어서 공유해봅니다.

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

내용이 좀 많아서 저도 아직 다 보진 못했습니다 😢

https://www.youtube.com/watch?v=ipDzLJK-7Kc

  • 중복을 제거해야한다는 강박관념
    • 일부 코드를 중복시키는 것 보다 core와 common이 가지고 있는 잠재적 위험성이 더 크다
      • Too Many Connections, 라이브러리 참조 문제로 인한 버전 업그레이드, copy & paste / if-else , 빌드 시간...
  • "무엇을" 기준으로 멀티 모듈을 나누어야 하는가? : 역할, 책임, 협력관계가 올바른가? → bounded context
    • 각자 고유한 성격과 특성, 사이클을 가지고 있고 그 기준으로 경계를 나누었다

멀티 모듈의 도입 시기?

  • 프로젝트 특성...에 따라 고려됨 : 여러개의 서버를 띄워야 하는 경우
  • 단일 어플리케이션 (monorepo vs mo)
  • 중복 함수/기능에 대한 어느정도 감안
  • 작은 기능 단위로 쪼개기
    • 클래스 분리 VS 메서드 분리? : 클래스별 적절한 메서드를 포함시켜서 분리
    • 하나의 클래스에 하나의 함수만

  • 중복 코드가 왜 나쁠까요?
    • "중복된 행위" : 어떤 역할을 수행하기위한 행위를 구현체
    • MatchingProcessor 객체 <- 관리툴 / 외부 서비스 (의존성)
  • 중복의 사이즈? 트레이드 오프의 지점?
  • 응집도/결합도 관점
    • 응집도 : 동일한 소스코드가 다른 여러 곳에 존재 ->
    • 결합도 : 동일한 행위(코드)를 여러 곳에서 사용하기 위해 특정 객체에게 해당 행위를 위임 -> 다른 곳에서 사용하면서 결합도 증가
    • 두 가지의 트레이트 오프