
# 조합형 AI 마이크로‑서비스 아키텍처를 통한 확장 가능한 보안 설문 자동화

기업들은 점점 늘어나는 보안 설문지, 공급업체 평가, 그리고 컴플라이언스 감시 작업에 압도되고 있습니다. 기존의 단일형(monolithic) 도구는 특히 서로 다른 제품 생태계와 통합하고, 다국어 요청을 지원하며, 실시간 감사 로그를 제공해야 할 때 따라가기 어렵습니다.  

**조합형 마이크로‑서비스 아키텍처**는 대규모 언어 모델(LLM)과 검색 강화 생성(RAG)을 중심으로 구성되어, 자동화를 확장하면서도 규제 산업이 요구하는 유연성과 거버넌스를 유지할 수 있는 방법을 제공합니다. 이 가이드에서는 다음을 다룹니다:

* 시스템을 **안전하고, 감사 가능하며, 확장 가능**하게 만드는 핵심 설계 원칙을 제시합니다.  
* Mermaid로 도식화한 참고 구현 예시를 단계별로 살펴봅니다.  
* 각 서비스를 쿠버네티스, 서버리스 FaaS, 또는 엣지 런타임에 독립적으로 배포하는 방법을 보여줍니다.  
* 데이터 거버넌스, 가시성, 지속적인 개선을 위한 구체적인 베스트 프랙티스 권고안을 제공합니다.

> **TL;DR:** 설문 자동화 플랫폼을 작고 명확히 정의된 서비스들로 분리하고, LLM을 무상태 추론 레이어 뒤에 두며, 이벤트 기반 파이프라인을 활용해 증거와 버전 관리에 대한 단일 진실 원천을 유지하세요.

---

## 1. 왜 거대한 단일 시스템을 만들기보다 조합하는가?

| 단일형 접근 방식 | 조합형 마이크로‑서비스 |
|---------------------|---------------------------|
| 하나의 코드베이스, 특정 워크로드(예: LLM 추론) 확장이 어려움 | 독립적인 확장 – AI 추론은 GPU 노드에서, 저장은 비용 효율적인 객체 스토어에서 실행 |
| 강한 결합으로 업데이트 위험 증가; UI 버그 하나로 전체 시스템 다운 가능 | 비동기 이벤트 또는 HTTP API를 통한 느슨한 결합으로 장애 격리 |
| 언어에 구애받는 통합 제한 – 종종 하나의 스택에 고정 | 다중 언어 지원 – 각 서비스는 작업에 가장 적합한 언어로 구현 가능(인증은 Go, LLM 오케스트레이션은 Python, 고처리량 파이프라인은 Rust) |
| 로그가 뒤섞여 감사와 컴플라이언스 관리가 악몽 | 중앙 이벤트 스토어 + 불변 감사 로그로 규제당국이 쉽게 조회 가능한 명확한 흐름 제공 |

**조합형** 모델은 *“필요한 것을 만들고, 필요 없는 것은 교체한다”*는 철학을 수용합니다. 이는 새로운 제어 프레임워크(예: [ISO 27001 Rev 2](https://www.iso.org/standard/27001))가 정기적으로 등장하고, 팀이 빠르게 대응해야 하는 보안 설문지의 동적 특성과 잘 맞습니다.

---

## 2. 핵심 아키텍처 기둥

1. **무상태 API 게이트웨이** – UI, SaaS 커넥터, 외부 도구의 진입점. 인증, 요청 검증, 트래픽 제한을 담당합니다.  
2. **도메인‑특화 마이크로‑서비스** – 각각 제한된 컨텍스트를 캡슐화합니다:
   * **Questionnaire Service** – 설문 메타데이터, 버전 관리, 작업 할당을 저장.  
   * **Evidence Service** – 정책, 스크린샷, 감사 로그 등 불변 객체 스토어에서 아티팩트를 관리.  
   * **AI Orchestration Service** – 프롬프트를 구성하고 RAG 파이프라인을 실행해 답변 초안을 반환.  
   * **Change‑Detection Service** – 증거 업데이트를 감시하고 영향을 받은 답변을 재평가하도록 트리거.  
   * **Notification Service** – Slack, Teams, 이메일 등으로 이해관계자에게 이벤트를 전달.  
3. **이벤트 버스 (Kafka / Pulsar)** – `EvidenceUploaded`, `AnswerDrafted`와 같은 도메인 이벤트를 최소 한 번 이상 전달 보장.  
4. **가시성 스택** – OpenTelemetry 트레이스, Prometheus 메트릭, Loki 로그.  
5. **Policy‑as‑Code 엔진** – 답변을 “최종”으로 표시하기 전에 Rego 혹은 OPA로 컴플라이언스 규칙을 평가.  

모든 서비스는 **gRPC**(저지연) 혹은 **REST**(외부 통합)로 통신합니다. 설계는 *“멍청한 파이프, 똑똑한 엔드포인트”*를 지향해 비즈니스 로직은 해당 서비스에, 버스는 단순히 메시지를 전달하도록 합니다.

---

## 3. 데이터 흐름 – 질문에서 감사 가능한 답변까지

아래 Mermaid 다이어그램은 전형적인 요청 라이프사이클을 시각화합니다.

```mermaid
flowchart TD
    subgraph UI["User Interface"]
        UI1["\"Web UI\""] -->|Submit questionnaire| AG["\"API Gateway\""]
    end

    AG -->|Auth & Validate| QMS["\"Questionnaire Service\""]
    QMS -->|Fetch template| AIOS["\"AI Orchestration Service\""]
    AIOS -->|Retrieve relevant evidence| ES["\"Evidence Service\""]
    ES -->|Evidence objects| AIOS
    AIOS -->|Generate draft answer| RAG["\"RAG Pipeline\""]
    RAG -->|LLM output| AIOS
    AIOS -->|Store draft| QMS
    QMS -->|Emit AnswerDrafted| EB["\"Event Bus\""]
    EB -->|Trigger| CDS["\"Change‑Detection Service\""]
    CDS -->|Re‑run if evidence changed| AIOS
    CDS -->|Emit AnswerUpdated| EB
    EB -->|Notify| NS["\"Notification Service\""]
    NS -->|Push to Slack/Email| UI

    style UI fill:#f9f,stroke:#333,stroke-width:2px
    style AG fill:#bbf,stroke:#333,stroke-width:1px
    style QMS fill:#bfb,stroke:#333,stroke-width:1px
    style AIOS fill:#ffb,stroke:#333,stroke-width:1px
    style ES fill:#fbb,stroke:#333,stroke-width:1px
    style RAG fill:#fdd,stroke:#333,stroke-width:1px
    style CDS fill:#ddf,stroke:#333,stroke-width:1px
    style NS fill:#cfc,stroke:#333,stroke-width:1px
```

**흐름의 핵심 단계**:

1. **사용자**가 새로운 설문을 제출하거나 기존 설문을 선택합니다.  
2. **API 게이트웨이**가 JWT를 검증하고, 레이트 리밋을 확인한 뒤 Questionnaire Service에 전달합니다.  
3. **Questionnaire Service**가 설문 템플릿을 가져와 AI Orchestration Service에 이벤트를 발생시킵니다.  
4. **AI Orchestration**은 *검색 단계*를 수행해 Evidence Service에서 현재 제어와 관련된 모든 아티팩트를 (벡터 유사도 혹은 키워드 매치) 조회합니다.  
5. 검색된 컨텍스트와 프롬프트 템플릿을 **RAG 파이프라인**(예: `openAI/gpt‑4o‑preview`)에 전달합니다.  
6. 초안 답변이 Questionnaire Service에 저장되고 *“검토 대기”* 상태가 됩니다.  
7. **Change‑Detection Service**는 새로운 증거 업로드를 감시합니다. 정책이 업데이트되면 영향을 받은 답변에 대해 RAG 파이프라인을 재실행합니다.  
8. 최종 검토자는 초안을 수정 혹은 승인합니다; 승인 시 **Policy‑as‑Code Engine**이 모든 규칙을 만족하는지 검증하고, 불변 감사 로그에 커밋합니다.  

---

## 4. 구현 세부 사항

### 4.1. API 게이트웨이 (Envoy + OIDC)

* **라우팅** – `POST /questionnaires/:id/answers` → `questionnaire-service`.  
* **보안** – 스코프(`questionnaire:write`) 강제.  
* **레이트 제한** – 테넌트당 분당 100 요청으로 LLM 비용을 보호.

### 4.2. Questionnaire Service (Go)

```go
type Questionnaire struct {
    ID          string            `json:"id"`
    Version     int               `json:"version"`
    Controls    []Control        `json:"controls"`
    Drafts      map[string]Answer `json:"drafts"` // key = control ID
    AssignedTo  map[string]string `json:"assigned_to"` // userID
}
```

* 관계형 데이터는 **PostgreSQL**, 도메인 이벤트는 **EventStoreDB** 사용.  
* gRPC 메서드 `GetTemplate`, `SaveDraft`, `FinalizeAnswer` 제공.

### 4.3. Evidence Service (Python + FastAPI)

* 파일은 **MinIO** 혹은 **AWS S3**에 버킷 수준 암호화와 함께 저장.  
* 콘텐츠는 **Qdrant**(벡터 DB)에 인덱싱해 유사도 검색 지원.  
* `POST /search` 엔드포인트는 질의를 받아 상위 k개의 아티팩트 ID를 반환.

### 4.4. AI Orchestration Service (Python)

```python
def generate_answer(question: str, evidence_ids: List[str]) -> str:
    evidence = fetch_evidence(evidence_ids)
    context = "\n".join(evidence)
    prompt = f"""You are a compliance specialist.
    Using the following evidence, answer the question concisely:\n{context}\n\nQuestion: {question}"""
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role":"system","content":prompt}]
    )
    return response.choices[0].message.content
```

* **RAG** – 벡터 검색 결과와 *시스템 프롬프트*를 결합해 모델이 증거 ID를 명시하도록 유도.  
* **캐싱** – 24시간 동안 생성된 응답을 저장해 중복 LLM 호출 방지.

### 4.5. Change‑Detection Service (Rust)

* `EvidenceUploaded` 이벤트 구독.  
* 새 아티팩트의 **해시**를 계산하고, 기존 증거와 **차이(difference)**를 비교.  
* 차이가 설정된 임계값을 초과하면 `AnswerRequiresRegen` 이벤트를 발행.

### 4.6. Notification Service (Node.js)

* `AnswerDrafted`, `AnswerFinalized`, `AnswerRequiresRegen`을 수신.  
* Slack 블록, Teams Adaptive Card, 이메일 템플릿을 구성.  
* **중복 방지** – 설문당 변화당 한 번만 알림 전송.

---

## 5. 보안 및 거버넌스

| 우려 사항 | 완화 방안 |
|-----------|-----------|
| **데이터 누출** – LLM 프롬프트에 민감한 정책 텍스트가 포함될 수 있음 | **온프레미 LLM 추론**(예: Llama 3.2)를 VPC 내부에 배치하고, 외부 API 사용 시 PII를 마스킹 |
| **무단 증거 접근** | 증거 서비스에서 OPA 정책을 활용한 세밀한 ACL 적용 |
| **모델 드리프트** – 답변 품질이 시간에 따라 저하 | 정기적인 벤치마크 평가와 프롬프트 템플릿 재학습 스케줄링 |
| **감사 가능성** | 모든 상태 전이는 불변 이벤트 로그에 기록되고, **WORM S3**에 저장 |
| **GDPR/CCPA 준수** | 벡터 DB와 객체 스토어에서 사용자‑특정 증거를 삭제하는 *잊혀질 권리* 워크플로 구현 ([GDPR](https://gdpr.eu/)) |
| **ISO 27001** | 증거 보관, 암호화, 접근 제어 정책이 ISO 27001 표준과 일치하는지 검증 |
| **HIPAA / SOC 2** | OPA 규칙을 확장해 해당 규제 요구사항을 강제 적용 |

---

## 6. 확장 전략

1. **수평 포드 자동 스케일링(HPA)** – GPU 사용량(`nvidia.com/gpu`)을 기준으로 AI Orchestration 포드 자동 확장.  
2. **버스트 가능한 큐** – Kafka 파티셔닝을 활용해 트래픽이 많은 테넌트를 격리.  
3. **콜드 스타트 감소** – KEDA와 맞춤 스케일러를 사용해 LLM 추론 서버의 워밍 풀 유지.  
4. **비용 제어** – 테넌트별 **토큰 기반 예산** 설정, 초과 사용 시 자동 제한 또는 과금.

---

## 7. 가시성 및 지속적 개선

* **분산 트레이싱** – OpenTelemetry 스팬을 UI 요청 → API 게이트웨이 → AI Orchestration → RAG → Evidence Service까지 전파.  
* **메트릭** – `answer_draft_latency_seconds`, `evidence_upload_bytes`, `llm_token_usage`.  
* **로그 집계** – `request_id`가 포함된 구조화된 JSON 로그를 전 서비스에 전파.  
* **피드백 루프** – 답변 최종 승인 후 검토자 의견(`review_score`)을 수집하고, 이를 **강화 학습** 모델에 투입해 프롬프트 온도나 증거 선택 방식을 조정.

---

## 8. 기존 팀을 위한 단계별 마이그레이션 경로

| 단계 | 목표 | 수행 내용 |
|------|------|-----------|
| **0 – 탐색** | 현재 설문 워크플로 파악 | 데이터 소스 식별, 제어 체계 정의 |
| **1 – 기반 구축** | API 게이트웨이, 인증, 기본 서비스 배포 | `questionnaire-service`와 `evidence-service`를 컨테이너화 |
| **2 – AI 도입** | 파일럿 설문에 RAG 적용 | 샌드박스 LLM 사용, 초안 자동 생성 후 수동 검증 |
| **3 – 이벤트 기반 자동화** | Change‑Detection 파이프라인 연결 | 증거 업데이트 시 자동 재생성 활성화 |
| **4 – 거버넌스 강화** | OPA 정책, 불변 감사 로그 적용 | 프로덕션 LLM(온프레미) 전환 |
| **5 – 확장 및 최적화** | GPU 포드 자동 스케일, 비용 제어 구현 | 가시성 스택 배포, SLO 설정 |

조합형 아키텍처를 점진적으로 도입하면 ‘빅뱅’ 위험을 피하고, 초기 ROI(보통 **30‑50 %**의 설문 처리 시간 단축)를 빠르게 확인할 수 있습니다.

---

## 9. 스택 미래 대비 전략

* **연합 학습** – 각 테넌트 데이터를 외부로 이동하지 않고 로컬에서 경량 어댑터를 학습해 답변 정확도 향상 및 데이터 주권 보장.  
* **제로 트러스트 서비스 메시** – **Istio** 혹은 **Linkerd**와 mTLS 적용해 서비스 간 트래픽 보안 강화.  
* **시맨틱 거버넌스** – Policy‑as‑Code 엔진이 답변 내용뿐 아니라 증거와 제어 언어 간 **시맨틱 유사도**도 검증하도록 확장.  
* **생성 추적성** – 각 답변에 사용된 LLM 온도, top‑p, 시스템 프롬프트 등을 함께 저장해 포렌식 감사를 지원.

---

## 10. 결론

조합형 마이크로‑서비스 아키텍처는 보안 설문 자동화를 **고통스러운 수작업**에서 **확장 가능하고 감사 가능한 지속 엔진**으로 전환시킵니다. 책임을 분리하고, 무상태 RAG 레이어를 통해 LLM을 활용하며, 이벤트 기반 백본으로 모든 것을 연결함으로써 조직은:

* 공급업체 평가에 몇 분 안에 대응  
* 자동 변화 감지로 증거를 항상 최신 상태 유지  
* 규제당국에 명확하고 불변의 감사 로그 제공  

작게 시작하고, 빠르게 반복하며, 마이크로‑서비스 철학을 통해 컴플라이언스를 **기능**으로, 병목 현상은 **제거**하도록 하세요.

---

## 관련 자료

- [OPA 정책 코드로 마이크로‑서비스 보호하기](https://www.openpolicyagent.org/docs/latest/policy-language/)