Phase 8 · 대규모 회계 플랫폼 구축

회계 자동화 SaaS 아키텍처 완성

개인의 PC에서 돌아가는 파이썬 프로그램은 비즈니스가 될 수 없습니다.
45단계에서는 지금까지 만든 모든 기능을 수백 개의 회계법인과 수만 개의 거래처가 데이터 섞임 없이 안전하게 동시에 이용할 수 있는 B2B SaaS (Software as a Service) 아키텍처로 통합 완성합니다.

예상 학습 시간 : 500분
난이도 : ★★★★★ (최상)
사전 단계 : AI 회계 업무 Assistant (Step 44)
다음 단계 : 46단계 - 실제 서버 운영 및 배포 (예정)
01

SaaS와 Multi-Tenancy (멀티테넌시)

SaaS 구축에서 가장 치명적이고 중요한 과제는 데이터 격리(Data Isolation)입니다. 회계사 A가 시스템에 로그인했을 때, 절대 회계사 B의 장부 데이터가 노출되어서는 안 됩니다. 이를 해결하는 구조가 바로 Multi-Tenant Architecture입니다.

Tenant 1 (회계법인 A) Tenant 2 (회계법인 B) ┌────────┴────────┐ ┌────────┴────────┐ User 1 User 2 User 3 User 4 (ABC 기업) (DEF 기업) (XYZ 기업) (KKK 기업) ▶ 시스템의 모든 데이터(사용자, 회사, 거래, 증빙)는 자신의 'tenant_id' 꼬리표를 달고 있어야 합니다.
02

Authentication vs Authorization

이 단계에서 학습자가 반드시 구별해야 할 웹 보안의 양대 산맥입니다.

  • Authentication (인증): "당신이 누구인가?" — 아이디/비밀번호를 입력받아 DB의 users 테이블과 대조하고 신원을 확인(JWT 발급)하는 과정입니다.
  • Authorization (인가/권한): "당신이 무엇을 할 수 있는가?" — 인증된 홍길동이 TENANT_ADMIN인지 VIEWER인지 확인하고, 장부 수정이나 삭제를 허락할지 말지 결정하는 과정입니다.
03

안전한 DB 및 권한 설계

MariaDB 테이블의 핵심은 모든 테이블에 tenant_id 외래키(Foreign Key)를 박아넣는 것입니다.

💾 sql
-- 1. Tenants (가장 상위 개념: 회계법인)
CREATE TABLE tenants (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(200) NOT NULL
);

-- 2. Users (해당 회계법인 소속 직원들)
CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    tenant_id BIGINT NOT NULL,
    username VARCHAR(100) NOT NULL,
    role VARCHAR(30), -- SUPER_ADMIN, TENANT_ADMIN, ACCOUNTANT, VIEWER
    FOREIGN KEY (tenant_id) REFERENCES tenants(id)
);

-- 3. Transactions (기장하는 거래 내역)
CREATE TABLE transactions (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    tenant_id BIGINT NOT NULL,   -- ★ 필수
    company_id BIGINT NOT NULL,  -- ★ 필수
    amount DECIMAL(15,2),
    ...
);
04

데이터 접근의 핵심 규칙

절대로 하면 안 되는 쿼리

transactions = db.query(Transaction).all()
이렇게 짜면 회계사 A 화면에 회계사 B의 거래처 리스트가 몽땅 노출되는 대형 보안 사고가 터집니다.

반드시 백엔드(FastAPI)에서는 현재 로그인한 유저의 토큰(JWT)에서 tenant_id를 뽑아내어 무조건 WHERE 조건으로 강제해야 합니다.

🐍 python
# 올바른 SaaS 쿼리 방식
def get_company_transactions(db, current_user, company_id):
    return db.query(Transaction).filter(
        Transaction.tenant_id == current_user.tenant_id, # 1차 방어 (테넌트 격리)
        Transaction.company_id == company_id             # 2차 조회
    ).all()
05

증빙 파일 보안 및 스토리지 관리

영수증, 세금계산서 PDF 등 증빙 파일 역시 철저히 분리되어야 합니다. 파일을 서버 스토리지(또는 AWS S3)에 저장할 때도 물리적인 폴더 구조를 나눕니다.

/storage └── tenant_001/ (회계법인 A) └── company_001/ (ABC 주식회사) └── 2026/ └── 08/ ├── invoice_001.pdf └── receipt_002.jpg

이 구조에 파일 확장자 검사, 용량 제한, MIME 타입 검증을 더해 악성 스크립트 업로드를 원천 차단합니다.

06

자동화 서비스 (보고서 및 Dashboard)

SaaS의 진가는 연결성에 있습니다. 거래가 저장됨과 동시에 'Risk Score(이상징후)'가 자동 분석되어 저장되고, 매월 말일에는 Python이 전체 데이터를 스캔하여 AI 요약이 첨부된 PDF 월간 보고서를 자동 생성한 후 회계사에게 이메일로 발송하는 시스템을 구현할 수 있습니다.

또한, 시스템 운영자를 위한 Admin Dashboard (가입 회계법인 수, API 사용량, AI 호출 건수)과금(Billing) 테이블을 설계하여 비즈니스 모델(BM)의 기반을 다집니다.

07

46단계 예고: 실제 서버 운영 및 배포 (Deployment)

축하합니다! 코드로 구현하는 Multi-Tenant AI 회계 SaaS의 개발이 모두 끝났습니다.

하지만 내 노트북(`localhost`)에서만 도는 프로그램은 진정한 서비스가 아니죠. 다음 46단계에서는 내가 만든 FastAPI와 MariaDB를 Linux 서버에 올리고, Docker로 묶고, Nginx와 HTTPS(도메인)를 연결하여 누구나 인터넷으로 접속할 수 있는 실제 라이브 서비스로 배포(Deploy)하는 방법을 다룹니다.

Step 44 : AI 회계 업무 Assistant Phase 8 공사중