☁️ 클라우드

SaaS

Software as a Service

소프트웨어 서비스. 구독 기반. Slack, Notion, Salesforce.

📖 상세 설명

SaaS(Software as a Service)는 인터넷을 통해 소프트웨어를 제공하는 클라우드 서비스 모델입니다. 사용자는 설치나 유지보수 없이 웹 브라우저만으로 애플리케이션을 사용하며, 구독 기반으로 비용을 지불합니다. IaaS, PaaS 위에 구축된 최상위 클라우드 서비스 계층입니다.

SaaS는 1999년 Salesforce가 CRM을 웹으로 제공하면서 대중화되었습니다. 현재 전 세계 SaaS 시장은 연간 2000억 달러 규모이며, 기업용 소프트웨어의 대부분이 SaaS로 전환되고 있습니다. Slack, Notion, Google Workspace, Microsoft 365, Zoom 등이 대표적입니다.

SaaS의 주요 특징은 Multi-tenancy(다중 테넌시)입니다. 여러 고객이 동일한 인프라와 코드베이스를 공유하지만, 데이터는 논리적으로 격리됩니다. 이를 통해 규모의 경제를 달성하고, 업데이트를 모든 사용자에게 즉시 배포할 수 있습니다.

SaaS 비즈니스의 핵심 지표로 MRR(월간 반복 매출), ARR(연간 반복 매출), Churn Rate(이탈율), LTV(고객 생애 가치), CAC(고객 획득 비용)가 있습니다. 성공적인 SaaS는 LTV/CAC 비율이 3 이상이고, 순매출 유지율(NRR)이 100%를 초과합니다.

💻 코드 예제

# Multi-tenant SaaS 아키텍처 예시 (Django)
from django.db import models

class Tenant(models.Model):
    """테넌트 (고객사)"""
    name = models.CharField(max_length=100)
    subdomain = models.CharField(max_length=50, unique=True)
    plan = models.CharField(max_length=20, choices=[
        ('free', 'Free'),
        ('starter', 'Starter'),
        ('pro', 'Professional'),
        ('enterprise', 'Enterprise')
    ])
    created_at = models.DateTimeField(auto_now_add=True)

class TenantAwareModel(models.Model):
    """테넌트 종속 모델 베이스"""
    tenant = models.ForeignKey(Tenant, on_delete=models.CASCADE)

    class Meta:
        abstract = True

class Project(TenantAwareModel):
    """프로젝트 - 테넌트별 격리"""
    name = models.CharField(max_length=200)
    owner = models.ForeignKey('User', on_delete=models.CASCADE)

# 미들웨어 - 요청마다 테넌트 식별
class TenantMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 서브도메인에서 테넌트 추출
        # acme.myapp.com -> acme
        subdomain = request.get_host().split('.')[0]
        request.tenant = Tenant.objects.filter(
            subdomain=subdomain
        ).first()

        return self.get_response(request)

# 뷰에서 자동 필터링
class ProjectViewSet(viewsets.ModelViewSet):
    def get_queryset(self):
        # 현재 테넌트의 데이터만 조회
        return Project.objects.filter(
            tenant=self.request.tenant
        )

🗣️ 실무에서 이렇게 말하세요

💬 기술 스택 논의에서
"SaaS 제품이니까 Multi-tenancy 설계가 중요합니다. 초기에는 Shared Database + Row-level Security로 시작하고, 엔터프라이즈 고객이 생기면 Database per Tenant 옵션을 추가하면 됩니다. Stripe로 구독 결제하고, 플랜별 기능 제한은 Feature Flag로 관리하죠."
💬 비즈니스 미팅에서
"현재 MRR이 $50K이고 월간 이탈율이 3%입니다. LTV/CAC 비율이 4 정도로 건강한 편이에요. 연간 결제 전환율을 높이면 Churn이 줄고 현금 흐름도 개선됩니다. NRR이 110%면 기존 고객 업그레이드만으로도 성장합니다."
💬 면접에서
"IaaS, PaaS, SaaS의 차이를 설명드리면요. IaaS는 인프라만 제공하고 나머지는 직접 관리, PaaS는 플랫폼까지 제공해서 코드만 배포, SaaS는 완성된 소프트웨어를 사용합니다. AWS EC2는 IaaS, Heroku는 PaaS, Salesforce는 SaaS입니다."

⚠️ 흔한 실수 & 주의사항

테넌트 데이터 격리 실패

Multi-tenancy에서 쿼리에 테넌트 필터를 빼먹으면 다른 고객 데이터가 노출됩니다. ORM 레벨에서 기본 필터를 적용하고, 정기적인 보안 감사와 침투 테스트를 수행하세요.

Vendor Lock-in 과소평가

SaaS에 비즈니스 크리티컬 데이터를 저장하면 이탈이 어렵습니다. 데이터 Export 기능이 있는지, API로 자동화할 수 있는지 확인하세요. 핵심 데이터는 백업 전략이 필요합니다.

SaaS 구축 시 고려사항

가격 정책(Free/Starter/Pro/Enterprise), 테넌트 격리 수준, 데이터 보관/삭제 정책, GDPR/개인정보 규정 준수, SOC 2 인증을 초기에 설계하세요. SSO(Single Sign-On)와 SCIM 프로비저닝은 엔터프라이즈 필수 기능입니다.

🔗 관련 용어

📚 더 배우기