Skip to content

[1주차] 멀티모듈 구성#15

Open
h2jinee wants to merge 2 commits intohanghae-skillup:mainfrom
h2jinee:main
Open

[1주차] 멀티모듈 구성#15
h2jinee wants to merge 2 commits intohanghae-skillup:mainfrom
h2jinee:main

Conversation

@h2jinee
Copy link

@h2jinee h2jinee commented Jan 11, 2025

제목(title)

주차와 함께 변경 사항을 요약하여 구성해 주세요.
ex: [1주차] 사용자 로그인 기능 구현

  • [1주차] 멀티모듈 구성

작업 내용

이번 PR에서 진행된 주요 변경 사항을 기술해 주세요.
코드 구조, 핵심 로직 등에 대해 설명해 주시면 좋습니다. (이미지 첨부 가능)
ex: ConcurrentOrderService에 동시 주문 요청 처리 기능 추가

  • 멀티 모듈을 app, external, common으로 구성해보았습니다.

발생했던 문제와 해결 과정을 남겨 주세요.

ex) 문제 1 - 다수의 사용자가 동시에 같은 리소스를 업데이트할 때 재고 수량이 음수로 내려가는 데이터 불일치 문제 발생
해결 방법 1 - Redis SET 명령어에 NX(Not Exists)와 PX(Expire Time) 옵션을 활용해 락을 설정했습니다. 이유는 ~

  • 멀티 모듈을 셋팅하는데 하위 모듈 gradle 빌드에서 계속 에러가 발생했습니다. 기존에는 모듈명이 module-*이 아니라 *-module이었는데 Task 'wrapper' not found in project ':external-module' 이런식으로 같은 오류가 계속 반복해서 발생했습니다. 해결 방법으로 모듈을 전부 삭제한 후 최상위 movie-booking-system 아래에 하위 모듈을 module-*로 다시 생성했습니다. 이것저것 시도해보았지만 해결이 잘 안 되어서 삭제하고 다시 생성하는 게 낫다고 판단이 들었습니다.. 다시 생성한 후에는 빌드가 성공하였습니다.

이번 주차에서 고민되었던 지점이나, 어려웠던 점을 알려 주세요.

과제를 해결하며 특히 어려웠던 점이나 고민되었던 지점이 있다면 남겨주세요.

  • 항상 단일 모듈 + 레이어드 아키텍처 환경에서만 개발해왔어서 멀티 모듈에 대해 이번에 처음 알게 됐는데 아키텍처에 대해서도 얕게만 알고 있었던 터라 어떻게 설계를 해야할지 많은 고민이 되었고 프로젝트 셋팅부터 잘 되지 않아 어려움을 많이 겪었던 것 같습니다. 그리고 제가 평일에는 작업을 거의 못하고 주말에 시간을 할애할 수 있는데 평일에 작업을 해야해서 작업을 거의 못해 이 부분도 아쉬웠습니다.

리뷰 포인트

리뷰어가 특히 의견을 주었으면 하는 부분이 있다면 작성해 주세요.

ex) Redis 락 설정 부분의 타임아웃 값이 적절한지 의견을 여쭙고 싶습니다.


기타 질문

추가로 질문하고 싶은 내용이 있다면 남겨주세요.

ex) 테스트 환경에서 동시성 테스트를 수행하였고, 모든 케이스를 통과했습니다. 추가할 테스트 시나리오가 있을까요?

  • 제가 아직 이러한 환경이 익숙치 않아서.. 멀티 모듈에 대해서는 알게 되었는데 이후에 뭐부터 시작하면 되는지 막막함을 느꼈던 것 같습니다. 관련 학습하기 좋은 추천 자료가 있다면 공유해주실 수 있으실까요?
  • 모듈 이름에 'module-' 접두사를 붙이는 것이 대규모 서비스 기업의 일반적인? 컨벤션인지 궁금합니다. 아니라면 보통 어떤 컨벤션을 사용하는지 궁금합니다!

@DongHyunKIM-Hi
Copy link

아무래도 처음 접하는 개념에 대해서 바로 적용하기는 힘들었을 것 같아요. 멀티 모듈에 대해서 설명을 가볍게 드리자면 1개의 프로젝트가 커지면서 발생하는 문제에 대해서는 모놀리틱 아키텍처와 MSA에 대해서는 개념이 익숙하실 것 같아요. MSA는 모둘별로 별도의 프로젝트에서 관리하여 1개의 거대한 프로젝트를 쪼개서 구성하는 방식인데 멀티 모듈은 1개의 거대한 프로젝트를 물리적으로 분리하는 접근하는 방식 보다는 1개의 프로젝트안에서 사용하되 모듈별로 쪼갠다는 개념이라고 생각하면 조금은 편합니다.

만약 MSA에서 도메인별로 별도의 프로젝트를 만들고 이를 각각의 프로젝트에서 별도로 관리하게 된다면 관리할 프로젝트도 많고, 각 프로젝트 별로 사용하는 모듈 (ex. jpa, mysql) 별로 버전 관리, 자바의 버전 관리를 해줘야 해서 불편합니다.

멀티모듈은 1개의 프로젝트에서 동일한 자바 버전, 다른 외부 기술의 버전 들을 1개의 프로젝트에서 동일하되, 각각의 모듈은 독립적으로 배포 유지 관리 될 수 있게 설계된 방법입니다.

이런 내용은 글로만 확인하기에는 이해하는데 혹은 그림을 그리기에 무리가 있을 수도 있으니 다양한 코드 및 예시를 보면서 구체화 시키는 것이 좋습니다.

작은 프로젝트의 경우 1개의 도메인만 다루기 떄문에 현재 설정한 구조로 설계해도 상관은 없지만 말씀주신대로 대규모 서비스 회사에서는 여러개의 도메인을 다루는 경우가 많이 있습니다. 그때 각각의 모듈별로 프로젝트를 분리하지 않고 자바 버전, mysql 버전, 기타 외부 기술의 버전을 1개로 통일해서 관리하여 사용하고 이를 각각의 도메인 별로 가져다 사용하는 구조로 이뤄져 있고 네이밍을 말한 것 처럼 도메인-module, module-도메인으로 진행합니다.

이런 공통으로 사용하는 설정들은 root gradle에 설정하고 각각의 모듈의 gradle에서는 root gradle을 가져와서 사용하도록 설계합니다. 만약 특정 도메인에서 다른 기술을 추가해야 하는 경우에는 root gradle이 아닌 해당 모듈의 gradle에 추가하여 해당 기술이 필요 없는 다른 모듈에는 영향을 주지 않는 방식으로 구조를 설계합니다.

레퍼런스의 경우 기존 레디스 노션 문서를 참고하는 것이 가장 좋을 것 같고 위의 설명드린 예시를 대략이나마 보여주는 레퍼런스는 아래와 같습니다.
https://yoonseon.tistory.com/139

@DongHyunKIM-Hi
Copy link

좋은점

  • 모르는 내용에 대해서 명확하고 구체적이게 readme에 작성해주심

아쉬운점

  • 코드가 작성되어 있지 않아 내용확인이 어려웠습니다.

@phyeran phyeran changed the base branch from main to h2jinee January 17, 2025 02:10
@phyeran phyeran changed the base branch from h2jinee to main January 19, 2025 06:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants