프로젝트 경험기/MSA 경험기

[MSA 경험기] 모아 구독 (1) 프로젝트 기획 및 설계

yubi5050 2022. 11. 21. 18:36

MSA 프로젝트 시작 계기

최근 몇달 전 부터 MSA라는 단어와 우연히? 마주치는 빈도가 많아졌었다. MSA에 대해서는 일전에 모놀리식과의 장단점을 비교해보았던 적이 있었고, MSA 가 가진 장점에 많은 이점에 공감했기에, 이번에 모인 팀원들과 함께 사이드로 프로젝트를 경험해보려고 하였다. 

https://yubi5050.tistory.com/155

 

[SW 개발] MSA vs 모놀리식

Monolithic Architecture (모놀리식 아키텍쳐) 장점 서비스의 개발 환경이 동일해 복잡하지 않다. End-to-End 테스트와 개발 및 관리가 용이 단점 프로젝트의 규모가 커지면 작은 부분을 수정하더라도 전

yubi5050.tistory.com

 

프로젝트 구조 및 설계

📌 프로젝트 주제

모아 구독 : MSA 기반의 구독 모아 보기 서비스 (중개형 플랫폼)

 

📌 프로젝트 목표

가장 큰 목표는 더 적합한, 더 나은 아키텍쳐를 위해 고민을 다양한 방향으로 많이 해보는 것
  • 서비스 간 독립적인 모듈 구현으로 결합도를 낮추고 서비스 안정성을 높임
  • 서비스 별 다른 개발 언어(프레임워크)를 사용하는 폴리그랏(polyglot) 구조 적용
  • 서비스 별 적합한 DB 선택 및 분리
  • 서비스 분리로 인해 관리포인트 증가에 대한 적절한 Trade-off
  • TDD 기반 UnitTest 코드 작성

 

📌 프로젝트 구조

MSA를 잘 운영하기 위해서는 가능하다면, FE, BE, DB가 각각 분리 되는 것이 좋기에, 왼쪽의 일반적인 MSA 서비스 구조를 바탕으로 아래와 같이 설계 하였다. (필자는 서비스 중 주황색 부분의 BE를 담당)

 

설계한 프로젝트 구조는 아래 이미지와 같다.

 

 

📁 유저 목록

  • 판매자 (구독 서비스 관리, WEB - TypeScript)
  • 소비자 (구독 서비스 구매, APP - ReactNative)

 

📁 서비스 목록

  • 인증·인가 서비스 (Auth Service, Django) : 로그인, 회원가입
  • 조회 서비스 (Lookup Service, Django) : 구독 상품을 조회
  • 판매자 웹 서비스 (Seller Service, Django) : 구독 상품 등록, 변경, 삭제, Dashboard 
  • 결제 서비스 (Payment Service, Spring) : 구독 상품 결제 및 구독 관리 
  • 검색 히스토리 서비스 (Search Service, Django) : 검색 히스토리 조작 서비스 (최근 검색어, 추천 검색어)
  • 채팅 서비스 (Chatting Service, Nodejs) : 판매자-소비자 1대1 채팅 서비스
  • 메일 서비스 (Mail Service, FastAPI) : 구독 상품 변경시 약관 전송 메일

 

📁 DB 목록

  • RDB (PostgreSQL) : User, Product, Payment 관련 Table
  • NoSQL (MongoDB) : Chatting, SearchHistory 관련 Document

 

📁 기타

  • Redis : 조회 서비스 - 캐싱용 In-memory DB
  • RabbitMQ, Celery : 메일 서비스 - 비동기 메시지 큐 작업
  • AWS EC2, Docker : 공통 - 컨테이너 인프라 환경
  • AWS S3, RDS : 스토리지, DB 저장소

 

프로젝트 간 주요 고민 사항

MSA 프로젝트에서 맡은 서비스 구현을 진행하면서, 많이 고민했던 부분에 대해 되돌아보며, 차례대로 앞으로 글로 남겨보려고 한다.

 

📁 글 목록

  • 1. 조회 서비스 - 페이지 네이션과 캐싱을 이용한 구독 상품 리스트 조회 구현기 (링크)
  • 2. 조회 서비스 - 조회수 구현하기 1 - 동시성 이슈 해결하기 (부제 : ORM 부터 Transaction Isolation Level 까지, 링크)
  • 3. 조회 서비스 - 조회수 구현하기 2 - 쿠키를 활용하여 중복 접근 해결하기 (링크)
  • 4. 조회 서비스 - QueryProfiling을 통한 성능 최적화 (링크)
  • 5. 검색 히스토리 서비스 - NoSQL vs RDB, Singleton 적용기 (링크)
  • 6. 메일 서비스 - 동기 기반 메일 서비스 비동기 전환기 (링크)