본문 바로가기
나의 IT 기억

SaaS 개발하면서 **멀티테넌시** 구성이 생각보다 복잡하더라고..

by 浪畅 (Làng Chàng) 2025. 5. 25.

SaaS, Multi-Tenant ???

 

 

SaaS 모델 개발을 위한 멀티테넌트 환경 구성 및 관리 도구

실제 SaaS 개발 경험을 바탕으로 만든 멀티테넌시 구조의 핵심 요소들을 쉽게 테스트하고 관리할 수 있는 시스템입니다.

🎯 왜 이걸 만들었나요?

SaaS 개발하면서 멀티테넌시 구성이 생각보다 복잡하더라고요. 특히:

  • 테넌트별 데이터 격리는 어떻게 할지
  • 컨테이너 관리는 어떻게 효율적으로 할지
  • 개발/테스트 환경을 어떻게 쉽게 구성할지

이런 고민들을 해결하려고 만든 시스템이에요. 단위 테스트가 가능한 구조로 설계해서 다른 개발자분들도 편하게 사용할 수 있도록 했습니다.

✨ 주요 특징

🏢 멀티테넌시 핵심 기능

  • 테넌트별 격리된 컨테이너 환경
  • 포트 기반 테넌트 분리
  • 독립적인 서비스 인스턴스 관리
  • 테넌트별 배포 및 롤백 지원

🛠 개발 편의성

  • 웹 기반 직관적인 관리 인터페이스
  • 실시간 컨테이너 상태 모니터링
  • 코드 수정 후 즉시 재배포 가능
  • 단위 테스트 친화적 구조

🚀 SaaS 필수 요소

  • 확장 가능한 아키텍처
  • 독립적인 서비스 생명주기 관리
  • 테넌트별 커스터마이징 지원

🚀 빠른 시작하기

사전 준비

# 필수 요구사항
- Docker Desktop (실행 상태)
- Python 3.8+
- Git

설치 및 실행

# 1. 프로젝트 클론
git clone https://github.com/onesound71/saas_docker2.git
cd saas_docker2

# 2. 가상환경 설정
python3 -m venv venv
source venv/bin/activate  # Windows: .\venv\Scripts\activate

# 3. 의존성 설치
cd manager
pip install -r requirements.txt

# 4. 관리자 서버 실행
python3 -m uvicorn app.main:app --reload --port 8000

첫 번째 테넌트 생성해보기

  1. 관리 콘솔 접속: http://localhost:8000
  2. API 포트 설정: 8001 (또는 원하는 포트)
  3. 컨테이너 설치 클릭
  4. 테스트: http://localhost:8001/hello

🎉 축하합니다! 첫 번째 테넌트 환경이 준비되었어요.

💡 멀티테넌시 활용 예시

테넌트별 독립 환경 구성

# 테넌트 A (포트 8001)
포트: 8001 → 컨테이너 설치 → http://localhost:8001/hello

# 테넌트 B (포트 8002)  
포트: 8002 → 컨테이너 설치 → http://localhost:8002/hello

# 테넌트 C (포트 8003)
포트: 8003 → 컨테이너 설치 → http://localhost:8003/hello

각 테넌트는 완전히 독립적인 환경에서 실행되며, 서로 영향을 주지 않습니다.

개발 워크플로우

1. 코드 수정 (hello_api/src/main.py)
   ↓
2. 이미지 재빌드
   ↓  
3. 컨테이너 재배포
   ↓
4. 테스트 및 검증

🏗 시스템 아키텍처

SaaS 멀티테넌시 구조
├── 관리자 웹 인터페이스 (Port 8000)
│   ├── 테넌트 생성/관리
│   ├── 컨테이너 상태 모니터링  
│   └── 배포 관리
│
├── 테넌트 A 서비스 (Port 8001)
├── 테넌트 B 서비스 (Port 8002)
└── 테넌트 N 서비스 (Port 800N)

🔧 주요 기능

컨테이너 관리

  • 설치: 새로운 테넌트 환경 생성
  • 시작/중지: 서비스 생명주기 관리
  • 삭제: 불필요한 환경 정리
  • 재빌드: 코드 변경사항 적용

실시간 모니터링

  • 📊 컨테이너 상태 실시간 확인
  • 🔍 로그 및 오류 추적
  • 📈 리소스 사용량 모니터링

개발자 친화적 기능

  • 🔄 핫 리로드: 코드 수정 후 즉시 반영
  • 🧪 단위 테스트 지원: 테스트 친화적 구조
  • 🎛 웹 기반 GUI: 복잡한 명령어 없이 직관적 조작

🔗 API 엔드포인트

관리 API

GET  /                    # 웹 관리 인터페이스
GET  /api/check-docker    # Docker 상태 확인
POST /api/install         # 컨테이너 설치
POST /api/start           # 컨테이너 실행
POST /api/stop            # 컨테이너 중지  
POST /api/remove          # 컨테이너 삭제

테넌트 API 예시

GET /hello                # 기본 헬로 API
GET /hello/{name}         # 개인화된 인사 API

🧪 단위 테스트 활용법

이 시스템은 단위 테스트를 염두에 두고 설계되었습니다:

# 테스트 예시
def test_tenant_isolation():
    """테넌트별 격리 테스트"""
    tenant_a = create_tenant(port=8001)
    tenant_b = create_tenant(port=8002)

    # 각 테넌트는 독립적으로 동작해야 함
    assert tenant_a.status != tenant_b.status
    assert tenant_a.port != tenant_b.port

def test_container_lifecycle():
    """컨테이너 생명주기 테스트"""
    container = install_container(port=8001)
    assert container.is_running()

    container.stop()
    assert not container.is_running()

🚨 문제 해결 가이드

Docker 관련 이슈

# Docker 상태 확인
docker --version
docker info

# 권한 문제 (Linux)
sudo usermod -aG docker $USER

포트 충돌 해결

# 사용 중인 포트 확인
lsof -i :8000
netstat -tuln | grep LISTEN

# 프로세스 종료
kill -9 <PID>

컨테이너 문제 디버깅

# 로그 확인
docker logs <container_name>

# 컨테이너 상태 확인
docker ps -a

💬 실제 개발 경험 공유

이런 분들에게 추천해요

  • 🎯 SaaS 개발을 시작하려는 개발자
  • 🏢 멀티테넌시 구조가 궁금한 분
  • 🛠 Docker 기반 개발환경을 구축하려는 팀
  • 🧪 테스트 가능한 아키텍처를 원하는 분

실제로 겪었던 이슈들

  1. 테넌트별 데이터 격리 → port 기반 완전 분리로 해결
  2. 배포 복잡성 → 웹 인터페이스로 원클릭 배포 구현
  3. 테스트 환경 구성의 어려움 → 독립적인 컨테이너로 해결

🤝 기여하기

버그 리포트나 기능 제안은 언제나 환영입니다!

  • 🐛 이슈 등록: GitHub Issues
  • 💡 기능 제안: Pull Request
  • 📧 문의사항: onesound71@github

📄 라이선스

MIT License - 자유롭게 사용하세요!


⭐ 이 프로젝트가 도움이 되셨다면 GitHub Star를 눌러주세요!

GitHub: https://github.com/onesound71/saas_docker2