RESP2에서 RESP3로 마이그레이션하기
RESP2에서 RESP3로 마이그레이션하기 (Guide for migrating from RESP2 to RESP3 replies)
Redis JSON의 RESP3 프로토콜 지원에 대해 클라이언트 개발자들을 위한 참고 페이지예요. RESP3에서는 선택적 path 인자의 기본값이 .에서 $로 바뀌면서 일부 명령의 응답(reply)이 약간 달라졌습니다. 이 페이지는 클라이언트를 RESP2에서 RESP3로 옮기는 개발자들이 JSON 명령의 응답 차이를 이해하도록 RESP2/RESP3 응답을 비교해 줍니다.
배경: 왜 응답이 달라지나
RESP3에서 선택적 path 인자의 기본값이 .에서 $로 변경되었어요. 이로 인해 일부 명령의 응답이 약간 바뀌었습니다. 특히 $ 기반 경로는 여러 결과(배열)를 반환할 수 있기 때문에 응답 타입이 배열로 감싸지는 형태로 달라질 수 있죠.
JSON 명령 응답 비교 (JSON command replies comparison)
유형들은 "TypeScript-like" 구문으로 표현해요. Array<a>는 요소의 타입은 알지만 개수는 알 수 없는 배열을 뜻합니다.
| 명령 (Command) | RESP2 | RESP3 |
|---|---|---|
| 모든 JSON 명령 | 선택적 path 인자의 기본값: . |
선택적 path 인자의 기본값: $ |
| JSON.ARRAPPEND, JSON.ARRINDEX, JSON.ARRINSERT, JSON.ARRLEN, JSON.ARRTRIM, JSON.OBJLEN, JSON.STRAPPEND, JSON.STRLEN, JSON.TOGGLE | $ 기반 경로 인자: 응답: `Array<BulkString |
null> *.기반 경로 인자:* 응답:BulkString` |
| JSON.GET | 응답: JSON 인코딩 문자열. 예: > JSON.SET k $ "[1,2,3]" > JSON.GET k "[1,2,3]" |
응답: 최상위 배열을 가진 JSON 인코딩 문자열. 예: > JSON.SET k $ "[1,2,3]" > JSON.GET k "[[1,2,3]]" |
| JSON.NUMINCRBY, JSON.NUMMULTBY | $ 기반 경로 인자: 응답: `JSON-encoded BulkString |
null *.기반 경로 인자:* 응답:BulkString |
| JSON.OBJKEYS | $ 기반 경로 인자: 응답: Array<Array<BulkString>> . 기반 경로 인자: 응답: Array<BulkString> |
$ 기반 경로 인자: 응답: Array<Array<BulkString>> . 기반 경로 인자: 응답: Array<BulkString> |
| JSON.TYPE | $ 기반 경로 인자: 응답: Array<BulkString>. 예: > JSON.TYPE k $ 1) "array" . 기반 경로 인자: 응답: BulkString |
$ 기반 경로 인자: 응답: Array<Array<BulkString>>. 예: > JSON.TYPE k $ 1) 1) "array" . 기반 경로 인자: 응답: Array<BulkString> |
핵심 포인트
- RESP3에서는 기본 경로가
$가 되어, 경로가 여러 요소에 매칭되면 결과가 배열로 감싸진(top-level array) 형태로 돌아와요. - 예를 들어
JSON.GET은 RESP2에서"[1,2,3]"을 주지만 RESP3에서는"[[1,2,3]]"을 줍니다. 한 겹 더 감싸진 거죠. JSON.TYPE도$기반 경로에서 응답이Array<BulkString>→Array<Array<BulkString>>로 한 단계 더 깊어져요.
클라이언트를 마이그레이션할 때는 응답을 파싱하는 부분이 RESP3의 배열 래핑을 올바르게 처리하는지 꼭 확인하세요.