-
멀티모듈 잘 설계해보기Spring Boot 2024. 4. 18. 01:35
배경
사내에 MSA를 도입 해보자는 이야기가 있어서,
이왕이면 제대로 해보고 싶어 요즘 열심히 스터디 중이다.
MSA를 공부하려고 강남 교보문고에 들려서 MSA 관련 책 5권을 훑어봤는데
선수지식이 필요하다고 느껴서 이론 공부는 잠시 미루기로 했다.
내가 필요하고 판단한 선수지식은 다음과 같다.- 멀티모듈
- DDD (https://yeoon.tistory.com/147)
- port-adapter pattern (https://yeoon.tistory.com/148)
- Spring Cloud
- event-consistency, 카프카
- AWS EKS
그중 가장 먼저 만들어보면서 해볼만한 멀티모듈 부터 다뤄본다.
결론부터 말하면 아래처럼 구성했다.
이런 구조에 다다른 이유를 기록 해본다.
멀티모듈
- 실무에서 처음 경험한 멀티모듈 프로젝트는 아래와 같았다.
- 멀티모듈의 monolithic architecture 프로젝트이다.
- core, common에 n개 서버에 중복되는 로직을 위치, 중복을 최소화하는 구조이다.
- 장점
- 코드 중복 최소화
- 경험이 있어서 쉽게 구성이 가능하다.
- 단점
- common이나 core 하나 변경하면 불특정 다수 서버에서 회귀버그 발생했다.
- 당시 신입인 출근/퇴근 하루 2회씩 서버 5대를 API 전수 테스트 진행했었다…
- common이나 core 변경하면 서버 5대 전부 재빌드 (빌드 속도가 느렸다.)
- common이나 core 하나 변경하면 불특정 다수 서버에서 회귀버그 발생했다.
단일모듈
멀티모듈을 구성했던 시니어 분은 퇴사를하고
새로 입사하신 분이 위의 구조를 단일 모듈 monolithic architecture로 변경했다.
- 장점
- 간결한 코드 구조, 적은 코드
- 빠른 개발속도
- 단점
- 코드 중복
- 서버가 죽으면 admin도 죽어서 비즈니스적인 조치 불가
단점이 치명적이지만 로그나 에러 알림 구축을 잘해서 모니터링이 잘되었고,
nginx로 load balancing이나 auto scaling 설정이 잘되어 있어서 서버가 죽은적이 없어,
멀티모듈은 개발 복잡도를 높이는 죄악 같은 존재로, 대기업에서만 해야하는 구조라고 느꼈다.그러나, 이직한 회사는 서버 3대가 서로를 호출하는 구조로
개발할때 IDE 창 3개, DB 3개, 프론트 서버 3대를 띄워야한다.
멀티모듈이 필요한 상황이다.
위에 언급한 멀티모듈의 나쁜 경험을 안하기 위해서 고민중
정확히 내가 멀티모듈에 안좋다고 생각한 점과 동일한 문제 그리고 이것을 개선한 방식이 있었다.
그 멀티모듈 구조가 아래와 같다.
위의 구조를 모방하여 설계를 진행했다.
고려한 것은 다음과 같다.
1. 서로 다른 액터(admin, user)로 모듈 분리
2. 변경이 많은 곳과 변경이 없는 곳을 모듈로 나눠 빌드 시간 단축 목표함 (domain 모듈은 변경 없을 것)
3. 외부 의존성 분리 (저수준 분리)
고려하여 아래처럼 모듈을 구성했다.
yh-admin-api : 어드민 관련 API 서버
yh-user-api: 일반유저 API 서버
yh-meta: logging, exception, global-utils 같은 공통 설정, 라이브러리
yh-domain: 도메인 객체, 도메인 로직
yh-infrastructure: 외부 서비스 연결지점 (JPA, Kafka, Redis, Web client . . .)
참고자료
멀티모듈 예제 with code : (네이버 클리우드 조민규 님)
2023 스프링캠프 - 새 술을 담을 부대 (네이버쇼핑 임형태, 김선철님)
2022 인프콘 - 실전! 멀티 모듈 프로젝트 설계 (네이버 김대성님)
2022년 우아한 테크 세미나 - 멀티모듈 고찰 (배민 권용근님)
왜 프로젝트를 멀티모듈 구성할까 (유튜브 - 하찮은 오후)
반응형'Spring Boot' 카테고리의 다른 글
스프링 개발자가 가장 많이하는 실수 (0) 2024.06.19 Port Adapter 패턴이란? (클린아키텍처) (1) 2024.04.20 DDD 기본개념 톺아보기 (1) 2024.04.20 디자인 패턴- Builder (0) 2022.01.19 JPA 개념 정리 - 영속성 컨텍스트, 트렌젝션, 1차 캐시, Flush, 쓰기 지연 (0) 2022.01.16