회계 자동화 SaaS 아키텍처 완성
개인의 PC에서 돌아가는 파이썬 프로그램은 비즈니스가 될 수 없습니다.
45단계에서는 지금까지 만든 모든 기능을 수백 개의 회계법인과 수만 개의 거래처가 데이터 섞임 없이 안전하게 동시에 이용할 수 있는 B2B SaaS (Software as a Service) 아키텍처로 통합 완성합니다.
SaaS와 Multi-Tenancy (멀티테넌시)
SaaS 구축에서 가장 치명적이고 중요한 과제는 데이터 격리(Data Isolation)입니다. 회계사 A가 시스템에 로그인했을 때, 절대 회계사 B의 장부 데이터가 노출되어서는 안 됩니다. 이를 해결하는 구조가 바로 Multi-Tenant Architecture입니다.
Authentication vs Authorization
이 단계에서 학습자가 반드시 구별해야 할 웹 보안의 양대 산맥입니다.
- Authentication (인증): "당신이 누구인가?" — 아이디/비밀번호를 입력받아 DB의
users테이블과 대조하고 신원을 확인(JWT 발급)하는 과정입니다. - Authorization (인가/권한): "당신이 무엇을 할 수 있는가?" — 인증된 홍길동이
TENANT_ADMIN인지VIEWER인지 확인하고, 장부 수정이나 삭제를 허락할지 말지 결정하는 과정입니다.
안전한 DB 및 권한 설계
MariaDB 테이블의 핵심은 모든 테이블에 tenant_id 외래키(Foreign Key)를 박아넣는 것입니다.
-- 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), ... );
데이터 접근의 핵심 규칙
transactions = db.query(Transaction).all()
이렇게 짜면 회계사 A 화면에 회계사 B의 거래처 리스트가 몽땅 노출되는 대형 보안 사고가 터집니다.
반드시 백엔드(FastAPI)에서는 현재 로그인한 유저의 토큰(JWT)에서 tenant_id를 뽑아내어 무조건 WHERE 조건으로 강제해야 합니다.
# 올바른 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()
증빙 파일 보안 및 스토리지 관리
영수증, 세금계산서 PDF 등 증빙 파일 역시 철저히 분리되어야 합니다. 파일을 서버 스토리지(또는 AWS S3)에 저장할 때도 물리적인 폴더 구조를 나눕니다.
이 구조에 파일 확장자 검사, 용량 제한, MIME 타입 검증을 더해 악성 스크립트 업로드를 원천 차단합니다.
자동화 서비스 (보고서 및 Dashboard)
SaaS의 진가는 연결성에 있습니다. 거래가 저장됨과 동시에 'Risk Score(이상징후)'가 자동 분석되어 저장되고, 매월 말일에는 Python이 전체 데이터를 스캔하여 AI 요약이 첨부된 PDF 월간 보고서를 자동 생성한 후 회계사에게 이메일로 발송하는 시스템을 구현할 수 있습니다.
또한, 시스템 운영자를 위한 Admin Dashboard (가입 회계법인 수, API 사용량, AI 호출 건수)와 과금(Billing) 테이블을 설계하여 비즈니스 모델(BM)의 기반을 다집니다.
46단계 예고: 실제 서버 운영 및 배포 (Deployment)
축하합니다! 코드로 구현하는 Multi-Tenant AI 회계 SaaS의 개발이 모두 끝났습니다.
하지만 내 노트북(`localhost`)에서만 도는 프로그램은 진정한 서비스가 아니죠. 다음 46단계에서는 내가 만든 FastAPI와 MariaDB를 Linux 서버에 올리고, Docker로 묶고, Nginx와 HTTPS(도메인)를 연결하여 누구나 인터넷으로 접속할 수 있는 실제 라이브 서비스로 배포(Deploy)하는 방법을 다룹니다.