새로운 문자열 생성 -> 문자열 가공 -> 응답 반환
- Valkey 입력값 저장
Valkey는 클라이언트가 명령어를 입력하면 내부적으로 이를 파싱한 뒤 client *c 구조체에 저장한다.
echo abc를 입력하면 내부적으로는
c->argv[0] = "echo"
c->argv[1] = "abc" 형태로 저장한다.
즉 command 함수는 c->argv[] 배열을 통해 사용자가 입력한 값을 읽는다.
- sds
Valkey는 일반 C 문자열(char *) 대신 대부분 sds 구조를 사용한다.
sds는 문자열 길이와 메모리 정보를 함께 관리하는 문자열 구조이다.
일반 C 문자열은 길이를 구하기 위해 strlen()으로 끝까지 탐색해야 한다.
sds는 문자열 길이를 header에 저장하고 있어 바로 길이를 확인할 수 있다.
또한 binary safe 구조이기 때문에 중간에 \0값이 포함되어도 안전하게 처리할 수 있다.
- 사용한 함수들
1. sdsempty
// 빈 sds 문자열을 생성하는 함수이다.
// 초기 상태는 ""인 빈 문자열이다.
sds result = sdsempty();
2. sdscatfmt()
// 문자열을 이어붙이는 함수이다.
// "echo2_" + 사용자가 입력한 값
// objectGetVal(c->argv[1])는 robj 내부에 저장된 실제 문자열 값으르 가져오는 역할을 한다.
result = sdscatfmt(result, "echo2_%S", objectGetVal(c->argv[1]));
3. addReplyBulkSds()
// 완성된 sds문자열을 RESP bulk string 형태로 응답 버퍼에 추가하는 함수
// 응답 버퍼 추가 -> 내부적으로 sdsfree()까지 처리
// 함수 호출 이후에는 같은 sds 포인터를 다시 사용하면 안 된다.
addReplyBulkSds(c, result);
- 최종 구현 코드
/**
빈 문자열 생성
-> echo2_prefix 추가
-> 사용자 입력 이어붙이기
-> bulk string 응답 반환
**/
void echoYejinCommand(client *c) {
sds result = sdsempty();
result = sdscatfmt(result, "echo2_%S", objectGetVal(c->argv[1]));
addReplyBulkSds(c, result);
}

'컴공' 카테고리의 다른 글
| Valkey 이해 (0) | 2026.05.15 |
|---|---|
| Redis RESP 2,3 프로토콜 실습하기 (0) | 2026.05.02 |
| git commit 과정 (0) | 2026.04.24 |