API가 "무엇을" 할 수 있는지를 정의한다면, 프로토콜은 "어떻게" 통신할 것인지를 정의합니다.
| 특성 | HTTP/1.1 + JSON | HTTP/2 + JSON | gRPC + Protobuf |
|---|---|---|---|
| 이진 프로토콜 | ❌ 텍스트 | ✅ 이진 | ✅ 이진 |
| 멀티플렉싱 | ❌ | ✅ | ✅ |
| 스트리밍 | ❌ | ✅ | ✅ 양방향 |
| 데이터 크기 | 큼 | 중간 | 작음 |
| 타입 안전성 | ❌ | ❌ | ✅ |
| 브라우저 지원 | ✅ | ✅ | ⚠️ gRPC-Web |
// TypeScript로 표현한 Protobuf 메시지 구조
interface TranslateRequest {
text: string;
sourceLanguage: string;
targetLanguage: string;
options?: TranslateOptions;
}
interface TranslateOptions {
formality: 'CASUAL' | 'POLITE' | 'FORMAL';
domain: string;
numAlternatives: number;
preserveFormatting: boolean;
}
interface TranslateResponse {
translation: string;
confidence: number;
alternatives: Alternative[];
metadata: ResponseMetadata;
}
// gRPC 서비스 정의
interface TranslationService {
// 단일 요청
translate(request: TranslateRequest): Promise<TranslateResponse>;
// 스트리밍: 긴 텍스트 실시간 번역
translateStream(
request: AsyncIterable<TranslateRequest>
): AsyncIterable<TranslateResponse>;
// 양방향 스트리밍: 실시간 대화 번역
translateBidirectional(
stream: AsyncIterable<TranslateRequest>
): AsyncIterable<TranslateResponse>;
}
// Docker 기반 모델 패키징
interface ModelPackage {
modelId: string;
version: string;
language: string;
task: 'translation' | 'asr' | 'tts' | 'lm';
// 컨테이너 설정
container: {
baseImage: 'wia/lang-base:1.0';
requirements: string[];
entrypoint: string;
};
// 리소스 요구사항
resources: {
memory: '2Gi' | '4Gi' | '8Gi';
cpu: number;
gpu?: 'nvidia-t4' | 'nvidia-a10';
};
// 헬스 체크
healthCheck: {
endpoint: '/health';
intervalSeconds: 30;
timeoutSeconds: 5;
};
}
// Kubernetes 배포 생성기
class K8sDeploymentGenerator {
generateDeployment(pkg: ModelPackage): string {
return `
apiVersion: apps/v1
kind: Deployment
metadata:
name: wia-lang-${pkg.language}-${pkg.task}
spec:
replicas: 3
selector:
matchLabels:
app: ${pkg.modelId}
template:
spec:
containers:
- name: model-server
image: wia/${pkg.modelId}:${pkg.version}
resources:
requests:
memory: "${pkg.resources.memory}"
cpu: "${pkg.resources.cpu}"
livenessProbe:
httpGet:
path: ${pkg.healthCheck.endpoint}
port: 8080
`;
}
}
| 계층 | 기술 | 목적 |
|---|---|---|
| 전송 | TLS 1.3 | 암호화 통신 |
| 인증 | OAuth 2.0 + JWT | 신원 확인 |
| 권한 | RBAC | 접근 제어 |
| 감사 | Audit Logging | 추적 가능성 |
| 보호 | Rate Limiting | DDoS 방어 |
// 보안 미들웨어
class SecurityMiddleware {
async validateRequest(req: Request): Promise<ValidationResult> {
// 1. TLS 검증
if (!req.secure) {
return { valid: false, error: 'HTTPS required' };
}
// 2. JWT 검증
const token = req.headers.authorization?.split(' ')[1];
const decoded = await this.verifyJWT(token);
// 3. 권한 확인
const hasAccess = await this.checkPermissions(
decoded.userId,
req.path,
req.method
);
// 4. 문화적 민감성 확인
if (req.body.language) {
const cultural = await this.checkCulturalAccess(
decoded.userId,
req.body.language,
req.body.content
);
if (!cultural.allowed) {
return { valid: false, error: cultural.reason };
}
}
// 5. Rate Limit 확인
const rateLimited = await this.checkRateLimit(decoded.userId);
if (rateLimited) {
return { valid: false, error: 'Rate limit exceeded' };
}
return { valid: true, user: decoded };
}
}
HTTP/2와 gRPC의 차이점과 각각의 적합한 사용 시나리오를 설명하시오.
Protocol Buffers가 JSON보다 효율적인 이유를 데이터 크기 관점에서 분석하시오.
양방향 스트리밍이 필요한 언어 AI 응용 사례를 3가지 제시하시오.
Kubernetes 배포에서 Auto-scaling 전략을 저자원 언어 서비스에 맞게 설계하시오.
문화적으로 민감한 데이터의 보안 요구사항을 정의하시오.
SecurityMiddleware의 문화적 접근 검사 로직을 상세 구현하시오.
gRPC 서비스의 에러 처리 및 재시도 전략을 설계하시오.
엣지 디바이스 배포를 위한 경량 프로토콜을 제안하시오.
© 2025 SmileStory Co., Ltd. / WIA · 弘益人間