Open MoonYeeun opened 3 years ago
서비스가 점점 커져갈수록 하나의 어플리케이션에서 너무 많은 일들을 감당하게됨
선택적 확장이 불가능
하나의 서비스가 모든 서비스에 영향을 줌
등등
MSA로 서버들을 다 분리하자니 현재 유저를 중심으로 모든 관계가 엮여있음
단독 서버로 띄우기 위해서는
하나의 서버에서 유저 중심 관계를 모두 가져간 후, 필요한 부분을 다른 서버에서 api 요청을 통해 다 받아온다. ⇒ 비효율
비효율
각 서버마다 관계로 엮인 부분을 동일하게 구현하여 사용한다. ⇒ 중복코드 너무 많, 비효율
중복코드 너무 많, 비효율
→즉, 지금 상황에서 MSA 로 바꾸는 것은 오히려 비효율적임
즉, 지금 상황에서 MSA 로 바꾸는 것은 오히려 비효율적임
그렇다면 MSA 처럼 모든 서버를 독립적으로 띄우는 것 말고 공통 부분은 최소한으로 유지하면서 분리되어야 하는 부분은 따로 관리할 수 있는 방법이 없을까?
= 멀티 모듈로 프로젝트 구성하기
멀티 모듈 프로젝트는 하나의 시스템을 단위로 만든다.
하나의 시스템을 단위
여기서 말하는 시스템은 아래와 같은 정의를 말한다.
출처: 우아한 형제들 - 멀티 모듈 설계 이야기
# 사실 현재 위더뷰 내부에서 도메인 별로 관리를 하고 있는데 굳이 멀티 모듈로 변경할 필요가 있을까? 라는 생각이 들 수도 있지만
각 모듈별로 필요한 의존성들을 따로 관리 ⇒ 최소 의존성 보유
ex) chat - rabbitMQ, MongoDB, Redis, websocket 등
account - keycloak, spring-security, jwt 등
study - ffmpeg, webclient 등
어플리케이션은 필요한 모듈만 선택
⭐️ 현재 혼자연습, 스터디 영상 저장을 비동기로 처리할 것을 계획 중인데 이 때 webclient 라는 비동기 client 사용하기 위해서는 WebFlux 의존성('spring-boot-starter-webflux') 필요함
'spring-boot-starter-webflux'
→ 현재 사용하고 있는 Spring MVC ('spring-boot-starter-web')와 WebFlux 의존성을 함께 사용할 수 없음
'spring-boot-starter-web'
→ 모듈별로 분리함으로써 스터디 관련 모듈에만 WebFlux 의존성 사용할 수 있음
모듈 별 재사용, 공유 가능
변경으로 인한 영향 최소화
참고 : 우아한 테크 세미나, 우아한 형제들 - 멀티 모듈 설계 이야기
= 계층 분리 (역할과 책임에 따라)
우아한 형제들에서 사용했던 방식을 참고하되, 우리의 서비스에 맞게 구성
= 하나의 프로젝트의 모든 모듈에서 사용될 수 있는 것
witherview-core
이 때 외부 의존 관계 없이 java class만 정의
= 하나의 모듈은 하나의 인프라스트럭쳐만 책임지도록 한다.
domain-mysql
dependency:
spring-boot-starter-data-jpa
mysql:mysql-connector-java
domain-mongo (사실 이부분은 chat에서만 사용하는거니까 chat-api 내부에 정의해도 되..나? (일단 참고용 예시))
= 저장소, 도메인 외 시스템에서 필요한 모듈
= 어플리케이션, 도메인 비지니스를 모른다.
= 독립적으로 실행 가능한 어플리케이션 모듈 계층
= 하위 설계 했던 모듈들을 조립하여 서비스 비즈니스를 완성시킨다.
account-api (계정)
chat-api (채팅)
study-api (면접 연습 - 혼자, 스터디)
#
이 것이 최선일지는 모르겠다.
그저 나의 커다란 욕심일지도
현재 프로젝트에서 도메인 별로 디렉토리를 나눠서 관리하고 있기 때문에 분리작업에 대한 공수가 어어엄청 클 것 같진 않다 ? (막상 해보면 또 다를 수 있겠지만 = 그저 나의 욕심)
괜찮을 거 같아요. 그럼 나머지 모듈 대비 가장 이질적인 성격이 강하고 / (프론트엔드 검증은 아직 덜끝났지만 일단은 완성된) 채팅쪽부터 모듈로 분리해볼까요?
정확히 어떤 단위로 모듈을 분리하는 게 좋을지는 저도 고민해봐야 말씀드릴 수 있을 거 같아서 링크주신 테크세미나 글들부터 소화해본 뒤에 미팅요청 드리겠습니다
AS-IS:
현재 위더뷰는 모놀리틱 그 자체이다.
현재의 문제
서비스가 점점 커져갈수록 하나의 어플리케이션에서 너무 많은 일들을 감당하게됨
선택적 확장이 불가능
하나의 서비스가 모든 서비스에 영향을 줌
등등
이 문제를 어떻게 해결할 것인가?
MSA로 서버들을 다 분리하자니 현재 유저를 중심으로 모든 관계가 엮여있음
단독 서버로 띄우기 위해서는
하나의 서버에서 유저 중심 관계를 모두 가져간 후, 필요한 부분을 다른 서버에서 api 요청을 통해 다 받아온다. ⇒
비효율
각 서버마다 관계로 엮인 부분을 동일하게 구현하여 사용한다. ⇒
중복코드 너무 많, 비효율
→
즉, 지금 상황에서 MSA 로 바꾸는 것은 오히려 비효율적임
그렇다면 MSA 처럼 모든 서버를 독립적으로 띄우는 것 말고 공통 부분은 최소한으로 유지하면서 분리되어야 하는 부분은 따로 관리할 수 있는 방법이 없을까?
= 멀티 모듈로 프로젝트 구성하기
TO-BE:
멀티 모듈로 위더뷰 프로젝트를 구성한다.
멀티 모듈 프로젝트는
하나의 시스템을 단위
로 만든다.여기서 말하는 시스템은 아래와 같은 정의를 말한다.
출처: 우아한 형제들 - 멀티 모듈 설계 이야기
# 사실 현재 위더뷰 내부에서 도메인 별로 관리를 하고 있는데 굳이 멀티 모듈로 변경할 필요가 있을까? 라는 생각이 들 수도 있지만
변경시 장점
각 모듈별로 필요한 의존성들을 따로 관리 ⇒ 최소 의존성 보유
ex) chat - rabbitMQ, MongoDB, Redis, websocket 등
account - keycloak, spring-security, jwt 등
study - ffmpeg, webclient 등
어플리케이션은 필요한 모듈만 선택
⭐️ 현재 혼자연습, 스터디 영상 저장을 비동기로 처리할 것을 계획 중인데 이 때 webclient 라는 비동기 client 사용하기 위해서는 WebFlux 의존성(
'spring-boot-starter-webflux'
) 필요함→ 현재 사용하고 있는 Spring MVC (
'spring-boot-starter-web'
)와 WebFlux 의존성을 함께 사용할 수 없음→ 모듈별로 분리함으로써 스터디 관련 모듈에만 WebFlux 의존성 사용할 수 있음
모듈 별 재사용, 공유 가능
변경으로 인한 영향 최소화
모듈 분리
참고 : 우아한 테크 세미나, 우아한 형제들 - 멀티 모듈 설계 이야기
= 계층 분리 (역할과 책임에 따라)
우아한 형제들에서 사용했던 방식을 참고하되, 우리의 서비스에 맞게 구성
공통 모듈 계층 :
= 하나의 프로젝트의 모든 모듈에서 사용될 수 있는 것
witherview-core
이 때 외부 의존 관계 없이 java class만 정의
도메인 모듈 계층 :
= 하나의 모듈은 하나의 인프라스트럭쳐만 책임지도록 한다.
domain-mysql
dependency:
spring-boot-starter-data-jpa
mysql:mysql-connector-java
domain-mongo (사실 이부분은 chat에서만 사용하는거니까 chat-api 내부에 정의해도 되..나? (일단 참고용 예시))
dependency:
내부 모듈 계층 :
= 저장소, 도메인 외 시스템에서 필요한 모듈
= 어플리케이션, 도메인 비지니스를 모른다.
어플리케이션 모듈 계층 :
= 독립적으로 실행 가능한 어플리케이션 모듈 계층
= 하위 설계 했던 모듈들을 조립하여 서비스 비즈니스를 완성시킨다.
account-api (계정)
chat-api (채팅)
study-api (면접 연습 - 혼자, 스터디)
#
주저리주저리
이 것이 최선일지는 모르겠다.
그저 나의 커다란 욕심일지도
현재 프로젝트에서 도메인 별로 디렉토리를 나눠서 관리하고 있기 때문에 분리작업에 대한 공수가 어어엄청 클 것 같진 않다 ? (막상 해보면 또 다를 수 있겠지만 = 그저 나의 욕심)