티스토리 뷰
해당 내용은 2025 오픈소스 아카데미 체험형-1차, Redis (강대명 멘토님) 교육을 통해 나온 과제를 정리 및 학습용으로 작성되었습니다.
과제 설명
이번 과제의 경우, 이전 과제의 심화 느낌으로 등장한 과제였습니다.
echo2 abc 명령어를 입력하고, 실행하면 응답으로 echo2_abc와 같은 응답을 반환하는 것이 목표인 과제였습니다.
과제를 수행한 내용은 아래와 같습니다.
과제 수행 내역
server.c
void echoChangyeobLeeCommand2(client *c){
// 안전하게 문자열로 디코딩 (숫자 타입도 string으로 변환됨)
robj *decoded = getDecodedObject(c->argv[1]);
// 포인터는 이제 반드시 SDS임 (getDecodedObject가 보장)
sds arg = decoded->ptr;
sds result = sdsempty();
result = sdscatfmt(result, "echo_ChangyeobLee_%s", arg);
addReplyBulkCString(c, result);
// 메모리 정리
sdsfree(result);
decrRefCount(decoded);
}
c→argv[1]을 통해 클라이언트가 보낸 첫 번째 인자를 가져온 후,
getDecodedObject를 통해, 숫자 타입이 들어오더라도 sds 문자열로 변환
이후, decoded를 통해 얻은 sds (문자열) 객체의 실제 문자열 값을 가져온 이후,
비어있는 문자열(sds)를 새로 생성하고, sdscatfmt를 통해, “echo_ChangyeobLee_” 문자열 뒤에 입력된 인자를 붙어주는 과정을 진행합니다.
그 후, addReplyBulkCString(c,result)를 통해, 클라이언트에게 결과 문자열을 RESP 형식으로 전송한 이후, 앞 과정을 통해 제작된 result 문자열 메모리 해제 및 decrRefCount(decoded)를 통해, 참조 카운트를 줄임으로써 메모리에서 제거합니다.
server.h
/* Commands prototypes */
void authCommand(client *c);
void pingCommand(client *c);
void echoCommand(client *c);
void echoChangyeobLeeCommand(client *c);
void echoChangyeobLeeCommand2(client *c);
commands.def
{MAKE_CMD("echo","Returns the given string.","O(1)","1.0.0",CMD_DOC_NONE,NULL,NULL,"connection",COMMAND_GROUP_CONNECTION,ECHO_History,0,ECHO_Tips,0,echoCommand,2,CMD_LOADING|CMD_STALE|CMD_FAST,ACL_CATEGORY_CONNECTION,ECHO_Keyspecs,0,NULL,1),.args=ECHO_Args},
{MAKE_CMD("echoChangyeobLee","Returns the given string.","O(1)","1.0.0",CMD_DOC_NONE,NULL,NULL,"connection",COMMAND_GROUP_CONNECTION,ECHO_History,0,ECHO_Tips,0,echoChangyeobLeeCommand,2,CMD_LOADING|CMD_STALE|CMD_FAST,ACL_CATEGORY_CONNECTION,ECHO_Keyspecs,0,NULL,1),.args=ECHO_Args},
{MAKE_CMD("echoChangyeobLee2","Returns the given string.","O(1)","1.0.0",CMD_DOC_NONE,NULL,NULL,"connection",COMMAND_GROUP_CONNECTION,ECHO_History,0,ECHO_Tips,0,echoChangyeobLeeCommand2,2,CMD_LOADING|CMD_STALE|CMD_FAST,ACL_CATEGORY_CONNECTION,ECHO_Keyspecs,0,NULL,1),.args=ECHO_Args},
{MAKE_CMD("hello","Handshakes with the server.","O(1)","6.0.0",CMD_DOC_NONE,NULL,NULL,"connection",COMMAND_GROUP_CONNECTION,HELLO_History,2,HELLO_Tips,0,helloCommand,-1,CMD_NOSCRIPT|CMD_LOADING|CMD_STALE|CMD_FAST|CMD_NO_AUTH|CMD_SENTINEL|CMD_ALLOW_BUSY,ACL_CATEGORY_CONNECTION,HELLO_Keyspecs,0,NULL,1),.args=HELLO_Args},
server.h 및 commands.def의 경우, 이전 과제와 동일한 형태로 수행할 수 있었습니다.
실행 결과, 위처럼 echo_test / echo_1234와 같은 결과를 확인할 수 있었습니다.
멘토님 코드와 차이점
void echoChangyeobLeeCommand3(client *c){
echo = sdscatfmt(sdsempty(), "echo2_%s", c->argv[1]->ptr);
addReplyBulkSds(c, echo);
}
멘토님이 알려주신 코드와 비교시, c→argv[1]→ptr을 통해 sds 문자열을 “echo_2”에 붙여주는 형태로 동작하며, addReplyBulkSds()를 통해 RESP 형식으로 클라이언트에게 반환 후, 자동으로 해제되는 형태로 진행됩니다.
앞 과정에서 활용한 addReplyBulkCString()의 경우, C 문자열 복사 형태로, 해제는 직접 수행해야한다는 점에서 차이가 존재합니다.
'#TIL & 대외활동 > 오픈소스아카데미' 카테고리의 다른 글
2025 오픈소스 아카데미 체험형-1차 / Redis (#4 과제) (0) | 2025.05.25 |
---|---|
2025 오픈소스 아카데미 체험형-1차 / Redis (#3 과제) (0) | 2025.05.25 |
2025 오픈소스 아카데미 체험형-1차 / Redis (#1 / #2 과제) (0) | 2025.05.25 |