배경 — 현재는 모놀리스 유지 (의도적 결정)
알림센터 실시간 subscription 도입(PR #270 ) 시점에 아키텍처 토폴로지를 논의한 결과, 단일 NestJS 모놀리스를 유지 하기로 함. 근거:
단독 개발 단계 + prod 인프라 비가동(요금 절약) — 서비스 분리의 운영 비용(배포 파이프라인 N개, 분산 디버깅)을 감당할 이득이 없음
현재 정합성 설계가 같은 DB 위의 트랜잭션·row 잠금 에 의존 (예: 대화 전송/읽음의 FOR UPDATE 직렬화로 커밋 순서 보장, 주문 알림을 상태 변경과 같은 트랜잭션으로 생성). 분리 시 사가/outbox/멱등성으로 재설계 필요
모듈 경계는 이미 도구로 강제 중(arch:check, ESLint boundaries, feature 배럴) — "수정 부담" 문제의 처방은 물리 분리가 아니라 경계 관리
다만 장기적으로는 MSA 운영 의향이 있음(복잡성 관리 + 향후 개발자 합류 대비). 이 이슈는 그 방향 기록 이며 약속이 아님.
검토 트리거 — 아래 중 하나가 발생하면 재검토
단계적 경로 (전면 전환이 아니라 진화)
런타임 분리 — 같은 코드베이스/이미지를 역할별 플래그로 분리 기동: API 서버 / ws 게이트웨이 / 크론 워커. 코드 분리 비용 거의 0으로 배포·스케일 이득 확보. Redis PubSub(PR feat(conversation): 실시간 subscription — graphql-ws + Redis PubSub #270 )이 이 단계의 발판
ws 게이트웨이 파일럿 — 첫 물리 분리. 상태가 Redis 토픽 뒤에 격리돼 있고(PUB_SUB 토큰 + ConversationEventsService 단일 발행 경계), connectionParams JWT로 독립 인증 가능 → 분리 비용 최소
도메인 분리 — 파일럿 경험 기반으로 판단. GraphQL schema-first이므로 Apollo Federation (도메인별 subgraph → supergraph)이 자연 경로
선행 과제 (전환과 무관하게 그 자체로 이득)
분리 후보 우선순위
순위
후보
근거
1
ws 게이트웨이(subscription)
스케일 프로파일 상이(커넥션 多), Redis 뒤로 상태 격리 완료, 분리 비용 최소
2
알림 발송 워커
FCM 푸시·재시도·배치는 본질적으로 비동기 워커. outbox 첫 소비자로 적합
3
검색/랭킹
크론 스냅샷 기존재. ES류 도입 시 자연 분리
4
채팅(conversation) 도메인
테이블 결합도는 낮으나 잠금 기반 정합성 재설계 필요 — 게이트웨이 분리로 부하 문제 대부분 해소되므로 후순위
5
auth
영향 반경 최대 — 다른 분리 안정화 후
참고
배경 — 현재는 모놀리스 유지 (의도적 결정)
알림센터 실시간 subscription 도입(PR #270) 시점에 아키텍처 토폴로지를 논의한 결과, 단일 NestJS 모놀리스를 유지하기로 함. 근거:
FOR UPDATE직렬화로 커밋 순서 보장, 주문 알림을 상태 변경과 같은 트랜잭션으로 생성). 분리 시 사가/outbox/멱등성으로 재설계 필요arch:check, ESLint boundaries, feature 배럴) — "수정 부담" 문제의 처방은 물리 분리가 아니라 경계 관리다만 장기적으로는 MSA 운영 의향이 있음(복잡성 관리 + 향후 개발자 합류 대비). 이 이슈는 그 방향 기록이며 약속이 아님.
검토 트리거 — 아래 중 하나가 발생하면 재검토
단계적 경로 (전면 전환이 아니라 진화)
PUB_SUB토큰 +ConversationEventsService단일 발행 경계), connectionParams JWT로 독립 인증 가능 → 분리 비용 최소선행 과제 (전환과 무관하게 그 자체로 이득)
분리 후보 우선순위
참고