Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

코딩블로그

[인프라] 멀티모듈 적용기 본문

PopcornMate

[인프라] 멀티모듈 적용기

_hanbxx_ 2024. 2. 8. 17:27
728x90

하암..멀티모듈 그게 뭔데 .. 나랑 평생 관련 없겠지..

라고만 생각하다가 이번에 실력짱왕이신 개발자분들 깃허브 참고하면서 "나도 저렇게 멋쥐게 코딩해봐야징 히히" 했다가 코드 짜면서 이해하다가 도저히 안되겠어서 도대체 멀티 모듈이 뭔데!!!DDD가 뭔데!!!!라고 생각하면서 정리를 시작하는 글입니다.....

DDD란?

  • Domain-driven Design으로 도메인 모델을 중심으로 개발을 진행하는 방법이다. 도메인 중심으로 개발을 하는 만큼, 각 모델은 서로 분리되어야 한다.

계층형 아키텍처란?

  1. 시스템을 여러 계층으로 구분하여 설계하는 방식
  2. 각 계층은 특정한 기능이나 역할을 수행, 일반적을 프레젠테이션 계층, 비즈니스 계층, 데이터 엑세스 계층으로 구성
  3. 계층 간의 의존성은 상위 계층에서 하위 계층으로 향한다 (웹 -> 도메인 -> 영속성)
  4. 계층 간의 분리와 재사용성을 강조.

단점

  1. Test하기가 어렵다
  2. 실무적으로 동시에 작업하기가 어렵다

클린 아키텍쳐

  • 계층형 아키텍처를 만들다가 어려웠던 점(위에서 작성한 계층형 아키텍처의 단점)을 보안하기 위해서 사용
  • 구동 방식

모듈의 특징

  • 모듈은 독립적인 의미를 갖는다(개발,빌드,테스트,배포 등의 기능)
  • 모듈은 어떠한 추상화 정도에 대한 계층을 가지고 있다
  • 계층 간 의존 관계에 대한 규칙이 있다

멀티 모듈

서로 독립적인 프로젝트를 하나의 프로젝트로 묶어 모듈로써 사용되는 구조이다. 멀티 모듈을 활용하여 DDD를 적용하면 각 도메인이 각각의 모듈로 구분되어 있어 DDD의 규칙을 지킬 수 있다. 이렇게 함으로써 코드의 복잡도를 낮추고 유지보수도 쉽게 할 수 있다.

(예시) 회원 시스템

단일 모듈과 멀티모듈을 비교해서 멀티 모듈의 장점에 대해 얘기를 해보려고 한다

  • 단일 모듈
    • member-internal-api : 내부에 관리자 페이지에서 호출하는 api 서버
    • memeber-external-api : 고객 화면에서 호출하는 api 서버
    • member batch : 주기적인 작업을 수행하는 서버


이 3가지 프로젝트에서는 USER라는 동일한 도메인에 대해서 구성하여 중복 코드가 발생한다. 그래서 만약에 이 중복 코드(USER)에 수정사항이 생기면 3가지 프로젝트에 일일이 다 수정을 해야하는 번거로움이 생긴다.

  • 멀티 모듈

위 사진처럼 한 프로젝트에서 공통된 코드 (USER=MEMBER)를 분리해서 함께 사용할 수 있다.

멀티모듈을 그럼 진짜 왜 써야해?

1. 코드의 중복을 줄일 수 있다
2. 각 모듈의 기능을 파악하기 쉬워진다
3. 빌드가 쉬워진다.

멀티 모듈 도입 계기

  • Scheduling을 적지 않은 양으로 사용하고 있어서 추후 디벨롭 시에 batch를 사용할 가능성이 있기에 확장성이 좋은 멀티모듈을 사용하였다

적용하기

  1. 프로젝트를 하나 만들어서 새 모듈 생성하기를 눌러준다
  2. 루트 프로젝트의 src 폴더는 삭제한다
  3. InteliJ가 새 모듈을 생성하면서 root폴더에 있는 setting.gradle 파일을 이런식으로 업데이트 해준다
    (예시)
  4. 각 모듈의 build.gradle마다 기본 틀은 비슷하되, 구성하는 요소는 각각 다르다.
    Api 모듈의 build.gradle을 보면,

Core 모듈의 build.gradle을 보면,

  1. 위에 build.gradle을 보면 bootjar과 jar이 존재하는 데, 이에 대한 차이점을 알고 주의해서 사용해야 한다
  • bootJar은 실행 가능한 jar을 만들려고 하기 때문에 main()이 필요하다. 그래서 main()이 필요한 Api에서는 별다른 설정을 하지 않아도 되는데 main()이 필요하지 않는 core모듈에서는 반드시 bootJar enabled를 false로 해줘야 한다.

내가 적용한 멀티 모듈 프로젝트 구조

  • Api : Api관련 모듈
  • Core: 다른 모듈에서 공통으로 사용하는 const, validator etc를 사용하는 모듈
  • Domain: 도메인 모델 관련 모듈
  • Infra: 인프라 관련 모듈

출처: https://cjw-awdsd.tistory.com/55
https://www.wool-dev.com/backend-engineering/spring/springboot-multi-module-gradle/starter
https://techblog.woowahan.com/2637/

728x90