내 잡다한 노트
SaaS를 위한 아키텍쳐 설계에 고려할 점 본문
SaaS(Software as a Service) 애플리케이션을 설계할 때는 단일 고객(테넌트) 전용 시스템이 아니라 다수의 고객(테넌트)을 동시에 수용하고, 각 고객이 서비스를 공유하되 보안, 확장성, 비용 측면에서 효율적으로 운영될 수 있도록 고려해야 합니다. 이를 위해 아키텍처 단계에서부터 신중히 계획해야 할 핵심 사항을 정리해보겠습니다.
1. 멀티 테넌시(Multi-tenancy) 설계
1) 데이터 모델 및 스키마 전략
- 단일 DB vs. 테넌트별 DB:
- Single Database, Shared Schema
- 모든 테넌트(고객)가 하나의 데이터베이스 내 공유 스키마를 사용 (테이블에 tenant_id 컬럼 등을 두어 구분).
- 장점: DB 수가 적어 운영 부담이 낮고 확장(스케일아웃) 설계가 단순함.
- 단점: 보안 이슈와 복잡도 증가(테넌트별 쿼리 분리, 권한 관리).
- Database per Tenant
- 각 테넌트마다 별도의 데이터베이스를 운영.
- 장점: 고객별 강력한 데이터 격리, 필요한 경우 쉽게 백업·마이그레이션 가능.
- 단점: 테넌트가 늘어날 때 DB 수도 늘어나므로 운영 비용과 복잡도 상승.
- Single Database, Shared Schema
- 스키마 자동화: 새 테넌트를 등록할 때 DB 테이블 생성, 권한 설정, 인덱스 구성 등 반복 작업을 자동화할 방안을 마련해야 함.
2) 테넌트 간 격리(Isolation)
- 보안 및 권한: 같은 인스턴스나 컨테이너에서 여러 테넌트가 동작하더라도, 각 테넌트의 데이터와 리소스가 상호 침범하지 않도록 설계해야 함.
- 네트워크 레벨 격리: VPC·서브넷, 네트워크 ACL 등을 이용해 서비스 구간별로 접근을 제한할 수도 있음.
3) 사용자 인증·인가
- 테넌트 범위 인증: 사용자 로그인 시 어떤 테넌트에 속해 있는지 식별하고, 해당 테넌트 내 권한(역할: Admin, Manager, User 등)을 검증.
- Single Sign-On(SSO): 기업형 B2B SaaS에서는 종종 SSO(SAML, OAuth2, OpenID Connect) 요구사항이 많음. 아키텍처적으로 Auth 서버(Identity Provider) 연동 설계를 고려해야 함.
2. 확장성(Scalability) & 성능
1) 마이크로서비스 vs. 모놀리식
- 마이크로서비스: 각각의 기능(예: 인증 서비스, 결제 서비스, 리포팅 서비스 등)을 독립된 서비스로 분할. 서비스별로 확장(Scale-out)·배포·장애 격리가 가능.
- 모놀리식: 초기 MVP 단계에서 개발이 간단하고 빠르지만, 사용자가 늘어날수록 확장과 유지보수가 어려워질 수 있음.
2) 인프라 자동 확장(Auto scaling)
- 클라우드 기반: AWS, Azure, GCP 등에서 제공하는 오토스케일링(EC2 Auto Scaling, Kubernetes HPA 등)으로 트래픽 급증 시 자원을 자동 추가/회수.
- Stateless 디자인: 스케일아웃을 위해 가급적 Stateless Service(세션 상태를 외부 Redis 등에서 관리) 구조를 채택.
3) 데이터베이스 확장
- 샤딩(Sharding): 테넌트별로 DB 분산, 또는 날짜·리소스별 파티션 분리 등.
- 캐싱: Redis, Memcached 등의 인메모리 캐시로 쿼리 부하를 줄이고 응답 시간을 개선.
3. 보안(Security) & 규정 준수(Compliance)
1) 접근 제어(Access Control)
- 역할 기반 권한 제어(RBAC): 관리자, 운영자, 일반 사용자 등 역할에 따라 가능한 기능(메뉴, API)을 엄격히 제한.
- 데이터 접근: 각 테넌트의 데이터에 대해서는 별도 권한 체크(테넌트 ID 필터링 등).
2) 데이터 암호화
- 전송 중(HTTPS/TLS): 클라이언트 ~ 서버 간 통신을 TLS로 암호화.
- 저장 시(Encryption at Rest): 디스크(DB 저장 파일) 암호화.
- 키 관리: KMS(Cloud Key Management Service) 등을 이용해 키를 안전하게 관리.
3) 감사 로그(Audit Log)
- 관리 행위, 설정 변경, 민감 정보 접근 등은 감사 로그로 기록.
- B2B SaaS에서는 고객사가 감사(Audit)나 컴플라이언스 요구를 제시하는 경우가 많으므로, 로깅·로그 보존 주기를 미리 계획.
4) 규정 준수(Compliance)
- GDPR, CCPA, ISO 27001, SOC2 등 국제/지역별 보안 및 개인정보 보호 규정 준수 필요.
- SaaS 제공 지역(글로벌 진출 시)에 따라 인프라 위치, 데이터 로컬리제이션 규정 고려.
4. 고가용성(High Availability) & 신뢰성(Reliability)
1) 장애 감내 및 복구 전략
- 이중화(HA) 구성: 여러 AZ(Availability Zone)/리전(Region)으로 분산 배포, DB 복제/Failover, 로드밸런싱.
- 무중단 배포: Rolling Update, Blue-Green Deployment 등으로 업데이트 시에도 서비스 중단 최소화.
- 백업/복구: 주기적 스냅샷 백업(Incremental + Full), PITR(Point-in-time recovery) 지원.
2) 모니터링 & 로깅
- 메트릭 수집: CPU, 메모리, 요청/응답 속도, 에러율 등 실시간 관측. Prometheus, Grafana, Datadog 등 사용.
- 분산 트레이싱: 마이크로서비스 간 요청 흐름을 파악하기 위해 OpenTelemetry, Jaeger, Zipkin 등을 도입.
- 로그 분석: Logstash, Elasticsearch(ELK), Cloud Logging 등으로 어플리케이션 로그 집계 및 분석.
5. 배포 & 운영 자동화
1) DevOps / CI·CD
- CI(Continuous Integration): 코드 푸시 시 자동 빌드, 테스트. (예: Jenkins, GitHub Actions)
- CD(Continuous Delivery/Deployment): 스테이징 환경 → 프로덕션 환경 순으로 자동 배포, Canary/BG 배포로 안정성 확보.
2) IaC(Infrastructure as Code)
- Terraform, AWS CloudFormation, Azure Bicep, Ansible 등을 활용해 인프라 구성(네트워크, VM, 컨테이너 클러스터, DB, 로드밸런서 등)을 코드로 관리.
- 일관된 환경을 재현하기 쉬우며, 장애·복구 시에도 빠른 재배포가 가능.
3) 컨테이너 & 쿠버네티스
- **도커(Container)**를 표준 런타임으로 활용하여 이식성 확보.
- **쿠버네티스(K8s)**로 스케일링, 롤링 업데이트, 오토힐링(헬스체크) 등 관리 자동화.
- 컴퓨팅 리소스(메모리, CPU) 제한, 네트워크 정책 관리 등을 통해 멀티테넌트 환경을 효율적으로 운영.
6. 청구/결제 모델(Billing) & 사용량 측정
- Usage Metering
- API 요청 수, 사용자 수, 데이터 저장 용량, 트래픽, CPU 사용량 등 과금 기준을 측정.
- 각 테넌트별 사용량을 추적하는 통계 모듈 구축 필요.
- Subscription/Pay-as-you-go
- 선불 구독(월간, 연간) vs. 사용량 기반 종량제(PAYG) 모델을 설계.
- SaaS 내부적으로 결제(Payment Gateway)나 인보이스 발행, 알림(과금 임계치 초과 등) 로직이 필요.
- 플랜(Plan) 및 제한(Quota) 관리
- Basic/Standard/Premium 등 플랜별로 기능 제한, 트래픽 제한, 데이터 용량 제한 등을 설정할 수 있어야 함.
7. 사용자/테넌트 관리 & 운영 툴
- 관리자 포털(Admin Console)
- 테넌트 생성/삭제, 사용자 계정 관리, 권한/역할 설정, 구독(플랜) 변경 등을 담당.
- 운영자가 장애 상황 또는 긴급 요청에 대응하기 위한 기능(강제 로그아웃, 임시 잠금, 사용량 리셋 등) 제공.
- Observability(가시성) & 고객 지원
- 테넌트별 로그/메트릭을 조회해 문제 원인을 빠르게 파악할 수 있는 대시보드.
- 고객 지원(Helpdesk, CS) 팀이 테넌트 환경을 확인하고 해결책을 제시할 수 있는 권한/도구.
8. 성능 & 비용 최적화
- 멀티 테넌트 환경에서의 자원 공유
- 컴퓨팅 리소스(CPU, 메모리), DB Connection, 캐시 메모리 등이 여러 테넌트가 동시에 사용되므로, 스로틀링(Throttling) 및 쿼터(Quota) 메커니즘이 필요.
- “과도하게 사용하는 테넌트”가 다른 테넌트 서비스 품질을 떨어뜨리지 않도록 관리.
- 데이터 아카이빙(Archiving)
- 오래된 데이터를 저비용 스토리지로 옮겨 DB 부하/비용 최소화.
- 고객사가 요청 시 아카이빙된 데이터에도 접근 가능하게 할 방안(온디맨드 복원 등) 검토.
- 캐싱과 CDN 활용
- 정적 자산(이미지, CSS, JS) 혹은 자주 조회되는 데이터(예: 공통 설정)에 대한 CDN/에지 캐시를 이용해 응답 지연 감소, 서버 비용 절약.
9. 글로벌 서비스 고려 사항(국제화, 지역성)
- 다국어(Localization)
- UI/문구, 에러 메시지, 이메일 알림 등 여러 언어 지원 필요.
- 번역 관리(이중화) 및 지역별 시차·날짜 형식 처리.
- 데이터 로컬리제이션
- GDPR 등 규제로 인해 특정 지역(예: EU, 중국)에 데이터가 저장·처리되어야 하는 경우가 있음.
- 여러 리전에 걸쳐 인프라를 운영해야 할 가능성이 있으며, 리전 간 동기화 방식을 고민해야 함.
- 성능
- 전 세계 사용자에게 빠른 응답을 위해 지리적 분산(Region/Edge) 인프라를 구성하고, CDN을 활용.
'엔지니어링(TA,AA,SA) > 아키텍쳐' 카테고리의 다른 글
3-Tier Architecture of Web Application (0) | 2023.11.09 |
---|---|
모놀리식 아키텍처와 마이크로서비스 아키텍처의 차이점 (0) | 2023.11.07 |