AI 통합이 소프트웨어 아키텍처에 가져온 근본적 변화, 결정론에서 확률론으로의 전환, 그리고 AI-Native 시스템의 핵심 특성을 조망합니다.
소프트웨어 아키텍처는 지난 수십 년간 모놀리스에서 마이크로서비스로, 온프레미스에서 클라우드 네이티브로 진화해 왔습니다. 그리고 지금, 대규모 언어 모델(Large Language Model, LLM)의 등장으로 또 한 번의 근본적인 전환이 일어나고 있습니다.
기존 소프트웨어 시스템은 결정론적(Deterministic)이었습니다. 같은 입력을 주면 항상 같은 출력을 반환하고, 실행 경로를 예측할 수 있었으며, 오류의 원인을 추적하는 것도 비교적 명확했습니다. 하지만 AI를 핵심 컴포넌트로 통합하는 순간, 시스템은 확률론적(Probabilistic)인 특성을 갖게 됩니다.
이 전환은 단순히 "AI API를 호출하는 코드를 추가하는" 수준의 변화가 아닙니다. 시스템을 설계하고, 테스트하고, 운영하는 방식 전체를 다시 생각해야 하는 패러다임의 전환입니다.
전통적인 소프트웨어와 AI 기반 시스템의 차이를 구체적으로 살펴보겠습니다.
동일한 프롬프트를 동일한 모델에 전달해도 매번 다른 응답이 나올 수 있습니다. temperature 설정을 0으로 낮춰도 완전한 결정론은 보장되지 않습니다. 이는 테스트, 디버깅, 재현성 확보에 근본적인 도전을 제기합니다.
import anthropic
client = anthropic.Anthropic()
# 같은 프롬프트를 세 번 호출해도 결과가 다를 수 있습니다
for i in range(3):
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=256,
messages=[{
"role": "user",
"content": "Python의 장점을 한 문장으로 설명해 주세요."
}]
)
print(f"응답 {i+1}: {response.content[0].text}")LLM(Large Language Model)은 본질적으로 상태가 없습니다. 매 요청마다 전체 컨텍스트를 함께 전달해야 합니다. 하지만 동시에 컨텍스트 윈도우라는 제한된 공간 안에서 풍부한 맥락을 제공해야 하므로, "상태는 없지만 맥락은 있어야 하는" 독특한 설계 과제를 만들어 냅니다.
AI 시스템에서는 연산 비용이 토큰 단위로 측정됩니다. 입력 토큰과 출력 토큰의 가격이 다르고, 모델마다 토큰당 비용이 크게 차이납니다. 이는 아키텍처 설계에서 비용 최적화를 일급 관심사로 격상시킵니다.
| 모델 | 입력 비용 (1M 토큰) | 출력 비용 (1M 토큰) | 컨텍스트 윈도우 |
|---|---|---|---|
| Claude Sonnet | $3 | $15 | 200K |
| Claude Haiku | $0.25 | $1.25 | 200K |
| GPT-4o | $2.50 | $10 | 128K |
| GPT-4o mini | $0.15 | $0.60 | 128K |
전통적인 API 호출이 수십 밀리초 단위라면, LLM 추론은 수백 밀리초에서 수십 초까지 걸릴 수 있습니다. 더욱이 응답 길이에 따라 지연 시간이 선형적으로 증가합니다. 이는 스트리밍, 비동기 처리, 타임아웃 전략을 아키텍처 수준에서 반드시 고려해야 함을 의미합니다.
AI를 통합하면서 기존에는 없었던 새로운 아키텍처 관심사들이 등장합니다.
프롬프트는 AI 시스템의 비즈니스 로직에 해당합니다. 하드코딩하면 유지보수가 어려워지고, 버전 관리 없이 수정하면 예기치 않은 동작 변화가 발생합니다.
interface PromptTemplate {
id: string;
version: string;
template: string;
variables: string[];
model: string;
maxTokens: number;
}
class PromptRegistry {
private prompts: Map<string, PromptTemplate> = new Map();
register(prompt: PromptTemplate): void {
const key = `${prompt.id}@${prompt.version}`;
this.prompts.set(key, prompt);
}
get(id: string, version?: string): PromptTemplate | undefined {
if (version) {
return this.prompts.get(`${id}@${version}`);
}
// 최신 버전 반환 로직
const latest = [...this.prompts.entries()]
.filter(([key]) => key.startsWith(`${id}@`))
.sort(([a], [b]) => b.localeCompare(a))
.at(0);
return latest?.[1];
}
}모든 작업에 가장 비싼 모델을 사용할 필요는 없습니다. 작업의 복잡도에 따라 적절한 모델로 라우팅하는 것이 비용과 성능 양면에서 중요합니다.
AI의 출력을 무조건 신뢰할 수 없으므로, 가드레일(Guardrail)이 일급 아키텍처 관심사가 됩니다. 입력 검증(프롬프트 인젝션 방지), 출력 검증(유해 콘텐츠 필터링, 형식 검증), 행동 제한(허용된 도구만 호출) 등이 시스템 설계 단계에서 반영되어야 합니다.
전통적인 관측 가능성(Observability)이 로그, 메트릭, 트레이스를 중심으로 했다면, AI 시스템에서는 여기에 프롬프트/응답 기록, 토큰 사용량, 응답 품질 점수, 환각(Hallucination) 비율 같은 AI 고유 지표가 추가됩니다.
AI 관측 가능성은 단순한 모니터링을 넘어, 모델 성능의 드리프트(drift)를 감지하고 프롬프트를 지속적으로 개선하는 피드백 루프의 핵심입니다. LangSmith, Langfuse, Phoenix 같은 도구들이 이 영역에 특화되어 있습니다.
AI를 통합한 시스템의 전형적인 계층 구조를 살펴보겠습니다.
핵심은 AI 오케스트레이션 계층의 존재입니다. 이 계층이 프롬프트 구성, 모델 선택, 도구 호출 조율, 결과 검증 등 AI 관련 복잡성을 캡슐화합니다. 비즈니스 로직은 AI의 세부 구현에 의존하지 않으며, 모델이 교체되더라도 상위 계층에 영향을 주지 않습니다.
이 시리즈에서는 AI 시대의 소프트웨어 아키텍처를 체계적으로 다룹니다. 총 10장에 걸쳐 설계 원칙에서 실전 구현까지 순차적으로 진행합니다.
| 장 | 주제 | 핵심 내용 |
|---|---|---|
| 1장 | 새로운 패러다임 | 결정론에서 확률론으로의 전환, 새로운 아키텍처 관심사 |
| 2장 | AI-Native 설계 원칙 | 추론 분리, 폴백 전략, 비동기 처리, 인간-AI 협업 |
| 3장 | LLM 통합 패턴 | Gateway, Router, Chain, Orchestrator, RAG 아키텍처 |
| 4장 | 이벤트 드리븐 AI | 비동기 추론, 스트리밍, 메시지 큐, 백프레셔 |
| 5장 | 캐싱 전략 | 의미론적 캐시, 프롬프트 캐시, KV 캐시, 비용 절감 |
| 6장 | 비용 관리 | 토큰 최적화, 모델 티어링, 예산 제어 |
| 7장 | 보안 아키텍처 | 프롬프트 인젝션, 데이터 유출, 접근 제어 |
| 8장 | 테스트 전략 | 비결정적 시스템 테스트, 평가 파이프라인 |
| 9장 | 운영과 관측 | 모니터링, 드리프트 감지, 인시던트 대응 |
| 10장 | 실전 프로젝트 | 처음부터 AI-Native 시스템 설계하기 |
각 장은 독립적으로 읽을 수 있지만, 순서대로 읽으면 개념이 자연스럽게 쌓여갑니다. 특히 2장의 설계 원칙과 3장의 통합 패턴은 이후 모든 장의 기반이 되므로 먼저 읽기를 권장합니다.
2장에서는 AI-Native 애플리케이션의 설계 원칙을 다룹니다. 추론을 비즈니스 로직에서 분리하는 방법, AI가 실패할 때를 대비한 폴백 전략, 비동기 우선 설계, 그리고 인간-AI 협업 패턴까지 — AI를 시스템의 핵심으로 설계하기 위한 원칙들을 살펴보겠습니다.
이 글이 도움이 되셨나요?
관련 주제 더 보기
AI를 핵심 컴포넌트로 설계하는 AI-Native 애플리케이션의 설계 원칙 — 분리된 추론, 폴백 전략, 비동기 처리, 그리고 인간-AI 협업 패턴을 다룹니다.
LLM을 시스템에 통합하는 핵심 아키텍처 패턴 — Gateway 패턴, Router 패턴, Chain 패턴, Orchestrator 패턴, 그리고 RAG 아키텍처의 설계를 다룹니다.
이벤트 기반 아키텍처로 AI 워크로드를 처리하는 패턴 — 메시지 큐, 스트리밍 처리, 비동기 추론, 그리고 실시간 AI 파이프라인 설계를 다룹니다.