개발환경

MSA 환경에서 pnpm + docker 를 선택한 이유

MSA 환경에서 pnpm은 프로덕션 Docker 런타임 최적화를 위해서라기보다는, 모노레포 기반 개발 생산성과 공통 패키지 관리 측면에서 의미가 있습니다. 배포 단계에서는 멀티 스테이지 빌드로 서비스별 의존성을 독립적으로 가져가는 것이 표준입니다.

일반적으로 MSA + pnpm은 ‘개발을 위한 선택’이지 운영 효율을 위한 선택’은 아니라고 생각했습니다.

다만, 서비스별 Dockerfile을 배포할 때에는 filter 혹은 멀티 스테이지 빌드 를 활용해서 최대한 각 이미지에 필요한 node_modules만 포함하도록 할 예정입니다.


아키텍처 구조

참고자료

pnpm 학습

MSA 환경의 모노레포 아키텍처 설계

ticketing-system/
├── pnpm-workspace.yaml
├── package.json
├── pnpm-lock.yaml
├── frontend/                 # 서버 2 (WS)  
│   ├── src/
│   ├── Dockerfile
│   ├── package.json
│   └── docker-compose.yml # 보류 
│
├── backend/                  # 서버 1
│   ├── api-server/           # 일반 백엔드 
│   │   ├── src/
│   │   ├── Dockerfile
│   │   └── package.json
│   │
│   ├── ticket-server/        # 티켓 예매 WAS 
│   │   ├── src/
│   │   ├── Dockerfile
│   │   └── package.json
│   │
│   └── *docker-compose.yml    # 서버 1 배포 단위 # 보류* 
│
├── queue-server/             # 서버 3
│   ├── src/
│   ├── Dockerfile
│   ├── package.json
│   └── docker-compose.yml
│
├── packages/                 # 공유 코드
│   ├── shared-types/          # DTO, 이벤트 타입
│   ├── shared-constants/      # Redis key, topic 이름
│   ├── shared-utils/          # 공통 유틸
│   └── shared-config/         # env schema, 공통 설정
│
├── infra/                        # 인프라 (역할 기준 분리)
│   │
│   ├── redis-queue/              # Queue Redis (대기열 서버 소유)
│   │   └── docker-compose.yml
│   │
│   ├── redis-ticket/             # Ticket Redis (티켓 서버 전용)
│   │   └── docker-compose.yml
│   │
│   ├── mysql/                    # Core RDB ( 일반 서버 전용 ) 
│   │   └── docker-compose.yml
│   │
│   └── nginx/
│       └── nginx.conf