스마트 키친 생태계에서 다양한 장치와 서비스 간의 원활한 통신은 표준화된 데이터 형식과 프로토콜에 의존합니다. WIA-IND-008 표준은 모든 스마트 키친 장치가 제조업체, 모델 또는 기술 세대에 관계없이 이해할 수 있는 공통 언어를 정의합니다.
이 장에서는 WIA-IND-008에서 사용되는 데이터 구조, API 설계 원칙, 통신 프로토콜 및 데이터 동기화 메커니즘을 자세히 살펴봅니다. 이러한 기술적 기초는 상호 운용 가능한 스마트 키친 생태계를 구축하는 데 필수적입니다.
WIA-IND-008은 그 단순성, 가독성 및 광범위한 지원 때문에 JSON(JavaScript Object Notation)을 주요 데이터 교환 형식으로 채택합니다:
| 장점 | 설명 | 스마트 키친에서의 이점 |
|---|---|---|
| 사람이 읽을 수 있음 | 텍스트 기반, 명확한 구조 | 디버깅 및 개발 용이 |
| 경량 | 최소한의 오버헤드 | 대역폭 효율적 |
| 언어 독립적 | 모든 프로그래밍 언어 지원 | 다양한 장치 플랫폼 |
| 스키마 검증 | JSON Schema로 구조 정의 | 데이터 무결성 보장 |
| 계층 구조 | 중첩된 객체 및 배열 | 복잡한 데이터 표현 |
WIA-IND-008은 다양한 데이터 유형에 대한 표준 JSON 스키마를 정의합니다:
// 장치 상태 스키마
{
"$schema": "https://wia.org/schemas/kitchen/device-status/v1.0",
"type": "object",
"required": ["deviceId", "deviceType", "timestamp", "status"],
"properties": {
"deviceId": {
"type": "string",
"pattern": "^[A-Z]+-[0-9]{3,6}$",
"description": "고유 장치 식별자"
},
"deviceType": {
"type": "string",
"enum": ["refrigerator", "oven", "dishwasher", "coffee_maker", "hood"],
"description": "장치 카테고리"
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "ISO 8601 형식의 타임스탬프"
},
"status": {
"type": "object",
"properties": {
"online": {"type": "boolean"},
"operational": {"type": "boolean"},
"errorCode": {"type": ["string", "null"]},
"lastUpdate": {"type": "string", "format": "date-time"}
}
},
"metrics": {
"type": "object",
"description": "장치별 메트릭"
}
}
}
{
"recipe": {
"id": "RECIPE-KR-001234",
"name": "김치찌개",
"language": "ko-KR",
"servings": 4,
"prepTime": 15,
"cookTime": 30,
"difficulty": "easy",
"tags": ["한식", "찌개", "매운맛", "발효식품"],
"ingredients": [
{
"item": "김치",
"amount": 300,
"unit": "g",
"preparation": "송송 썰기",
"alternatives": []
},
{
"item": "돼지고기",
"amount": 200,
"unit": "g",
"preparation": "얇게 썰기",
"alternatives": ["소고기", "참치"]
},
{
"item": "두부",
"amount": 1,
"unit": "모",
"preparation": "큼직하게 썰기"
}
],
"steps": [
{
"stepNumber": 1,
"instruction": "냄비에 김치와 돼지고기를 넣고 중불에서 볶습니다",
"duration": 5,
"temperature": null,
"appliance": "stovetop",
"image": "https://recipes.wia.org/kr-001234/step-01.jpg"
},
{
"stepNumber": 2,
"instruction": "물 4컵을 붓고 끓입니다",
"duration": 10,
"temperature": 100,
"appliance": "stovetop"
}
],
"nutrition": {
"calories": 320,
"protein": 22,
"carbohydrates": 12,
"fat": 18,
"fiber": 4,
"sodium": 1200,
"unit": "per serving"
}
}
}
WIA-IND-008은 장치 및 서비스 간 통신을 위한 RESTful API 아키텍처를 지정합니다:
| HTTP 메소드 | 엔드포인트 | 목적 | 예시 |
|---|---|---|---|
| GET | /api/v1/devices | 모든 장치 목록 | 연결된 모든 가전제품 조회 |
| GET | /api/v1/devices/{id} | 특정 장치 상태 | 냉장고 온도 확인 |
| POST | /api/v1/devices/{id}/commands | 장치 제어 | 오븐 예열 시작 |
| PUT | /api/v1/devices/{id}/settings | 설정 업데이트 | 온도 설정 변경 |
| DELETE | /api/v1/devices/{id} | 장치 제거 | 시스템에서 장치 해제 |
// 냉장고 재고 조회
GET /api/v1/devices/FRIDGE-001/inventory
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Accept: application/json
// 응답 (200 OK)
{
"deviceId": "FRIDGE-001",
"timestamp": "2025-12-27T10:30:00Z",
"inventory": {
"totalItems": 42,
"categories": {
"dairy": 8,
"vegetables": 15,
"meat": 6,
"beverages": 9,
"condiments": 4
},
"expiringS
oon": [
{
"item": "우유",
"expiryDate": "2025-12-29",
"daysUntilExpiry": 2,
"location": "상단 선반"
},
{
"item": "요구르트",
"expiryDate": "2025-12-30",
"daysUntilExpiry": 3,
"location": "문 수납"
}
],
"lowStock": [
{
"item": "계란",
"currentQuantity": 2,
"recommendedQuantity": 12
}
]
}
}
// 오븐 예열 명령
POST /api/v1/devices/OVEN-001/commands
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json
{
"command": "preheat",
"parameters": {
"temperature": 180,
"unit": "celsius",
"mode": "convection",
"scheduledTime": null
}
}
// 응답 (202 Accepted)
{
"commandId": "CMD-20251227-001234",
"status": "accepted",
"deviceId": "OVEN-001",
"estimatedCompletion": "2025-12-27T10:45:00Z",
"currentTemperature": 25,
"targetTemperature": 180
}
실시간 업데이트와 이벤트 알림을 위해 WIA-IND-008은 WebSocket 프로토콜을 사용합니다:
// WebSocket 연결 초기화
const ws = new WebSocket('wss://kitchen.wia.org/v1/stream');
ws.onopen = () => {
// 구독할 장치 지정
ws.send(JSON.stringify({
type: 'subscribe',
devices: ['FRIDGE-001', 'OVEN-001', 'DISHWASHER-001'],
events: ['status_change', 'alert', 'completion']
}));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
switch(data.type) {
case 'status_change':
console.log(`장치 ${data.deviceId} 상태 변경:`, data.newStatus);
break;
case 'alert':
console.log(`경고: ${data.message}`);
handleAlert(data);
break;
case 'completion':
console.log(`작업 완료: ${data.taskName}`);
notifyUser(data);
break;
}
};
| 이벤트 | 트리거 | 페이로드 |
|---|---|---|
| status_change | 장치 상태 변경 | deviceId, oldStatus, newStatus, timestamp |
| temperature_alert | 온도 임계값 초과 | deviceId, currentTemp, threshold, severity |
| task_completion | 작업 완료 | taskId, deviceId, result, duration |
| inventory_update | 재고 변경 | deviceId, itemChanges, newInventory |
| maintenance_required | 유지보수 필요 | deviceId, maintenanceType, urgency |
배터리 구동 센서와 저전력 장치를 위해 WIA-IND-008은 MQTT(Message Queuing Telemetry Transport)를 지원합니다:
// 토픽 계층 구조
wia/kitchen/{home_id}/{device_type}/{device_id}/{data_type}
예시:
wia/kitchen/HOME-12345/refrigerator/FRIDGE-001/temperature
wia/kitchen/HOME-12345/oven/OVEN-001/status
wia/kitchen/HOME-12345/sensors/TEMP-SENSOR-01/reading
// 온도 게시
PUBLISH wia/kitchen/HOME-12345/refrigerator/FRIDGE-001/temperature
{
"timestamp": "2025-12-27T10:30:15Z",
"fridgeTemp": 3.5,
"freezerTemp": -18.0,
"unit": "celsius"
}
// 상태 구독
SUBSCRIBE wia/kitchen/HOME-12345/+/+/status
// 모든 장치의 상태 업데이트 수신
여러 장치와 서비스 간의 데이터 일관성을 유지하는 것은 중요합니다:
{
"conflictResolution": {
"strategy": "last-write-wins",
"metadata": {
"version": 15,
"lastModified": "2025-12-27T10:30:00Z",
"modifiedBy": "USER-001",
"deviceId": "MOBILE-APP-123"
},
"conflictDetection": {
"enabled": true,
"vectorClock": {
"MOBILE-APP-123": 15,
"FRIDGE-001": 14,
"CLOUD-SERVICE": 15
}
}
}
}
모든 데이터 통신은 암호화되고 인증되어야 합니다:
| 프로토콜 | 보안 메커니즘 | 용도 |
|---|---|---|
| HTTPS/REST | TLS 1.3, OAuth 2.0 | API 요청/응답 |
| WSS (WebSocket Secure) | TLS 1.3, JWT 토큰 | 실시간 스트리밍 |
| MQTTS (MQTT over TLS) | TLS 1.3, 클라이언트 인증서 | 센서 데이터 |
대역폭을 절약하고 응답 시간을 개선하기 위한 최적화 기법:
// 압축 요청
GET /api/v1/recipes?category=korean&servings=4&fields=name,ingredients
Accept-Encoding: gzip, deflate
Authorization: Bearer ...
// 응답 헤더
Content-Encoding: gzip
Content-Length: 1240
// 원본 크기: 4850 바이트, 압축률: 74%
하위 호환성을 유지하면서 API를 발전시키기 위한 버전 관리 전략:
| 방법 | 예시 | 장점 | 단점 |
|---|---|---|---|
| URL 경로 | /api/v1/devices | 명확함, 캐시 친화적 | URL 중복 |
| 쿼리 매개변수 | /api/devices?version=1 | 유연함 | 덜 명확함 |
| 헤더 | Accept: application/vnd.wia.v1+json | RESTful | 복잡함 |
표준화된 오류 응답 형식:
// 오류 응답 구조
{
"error": {
"code": "DEVICE_OFFLINE",
"message": "장치가 오프라인 상태입니다",
"details": "OVEN-001이 10분 이상 응답하지 않습니다",
"timestamp": "2025-12-27T10:30:00Z",
"requestId": "REQ-20251227-001234",
"suggestedAction": "장치의 전원과 네트워크 연결을 확인하세요"
},
"statusCode": 503
}
// 표준 HTTP 상태 코드
200 OK - 성공
201 Created - 리소스 생성됨
202 Accepted - 비동기 작업 수락됨
400 Bad Request - 잘못된 요청
401 Unauthorized - 인증 필요
403 Forbidden - 권한 없음
404 Not Found - 리소스 없음
429 Too Many Requests - 속도 제한 초과
500 Internal Server Error - 서버 오류
503 Service Unavailable - 서비스 이용 불가
WIA-IND-008의 데이터 형식과 프로토콜은 완전히 공개되고 문서화되어 있습니다. 누구나 이러한 표준을 구현하고, 호환 제품을 개발하며, 생태계에 기여할 수 있습니다. 弘益人間의 정신에 따라 우리는 독점적 제약이 아닌 개방형 협력을 통해 혁신을 촉진합니다. 작은 스타트업부터 대기업까지 모두가 평등하게 참여할 수 있습니다.
WIA-IND-008 데이터 형식과 프로토콜은 상호 운용 가능한 스마트 키친 생태계의 기초입니다. JSON을 주요 데이터 형식으로, RESTful API를 주요 통신 메커니즘으로, WebSocket을 실시간 업데이트에, MQTT를 경량 메시징에 사용합니다.
표준화된 스키마, 보안 프로토콜, 효율적인 데이터 압축 및 명확한 오류 처리를 통해 WIA-IND-008은 강력하고 확장 가능하며 사용하기 쉬운 스마트 키친 시스템을 가능하게 합니다. 모든 것이 개방형 표준으로 문서화되어 弘益人間 원칙을 구현합니다.
제4장에서는 스마트 키친 시스템의 보안과 개인정보 보호를 다룹니다. 암호화, 인증, 권한 부여, 데이터 보호 및 규정 준수에 대해 배우게 됩니다.