[OSSCA] 과제 #5 echo 응답 가공하기
과제 내용
지난 과제의 echo{영어이름} command를 개선합니다.
응답 앞에 echo2_ 가 붙도록 수정합니다.
client *c 안의 c->argv[1] 을 이용합니다.
sds , sdscatfmt() , sdsempty() , addReplyBulkSds() 를 사용해 봅니다.
branch를 만들고 PR로 보내주시면 됩니다.
해당 과정도 블로깅 후에 링크를 과제방에 공유해주세요.
echoJihoonCommand 수정
sdscatfmt(sds s, const char \*fmt, ...)
1
2
3
4
5
// command.c
void echoJihoonCommand(client *c) {
sds resp = sdscatfmt(sdsempty(), "echo2_%S", (sds)objectGetVal(c->argv[1]));
addReplyBulkSds(c, resp);
}
sdscatfmt()을 사용해서 echo2_와 클라이언트가 보낸 val_ptr을 결합하여 생성하고
addReplyBulkSds()에서 클라이언트 응답 버퍼에 resp 를 넣어 보낸다.
command.def 수정
1
{MAKE_CMD("echojihoon","Returns 'echo2_' + string","O(N)","1.0.0",CMD_DOC_NONE,NULL,NULL,"connection",COMMAND_GROUP_CONNECTION,ECHOJIHOON_History,0,ECHOJIHOON_Tips,0,echoJihoonCommand,2,CMD_LOADING|CMD_STALE|CMD_FAST,ACL_CATEGORY_CONNECTION|ACL_CATEGORY_FAST,NULL,ECHOJIHOON_Keyspecs,0,NULL,1),.args=ECHOJIHOON_Args},
Q1. 그러면 여기서 포맷을 %S로 sds 형식이 아니라 %s로 그냥 string이면 어떤 문제가 생길까?
A1. 일반 c 문자열 방식을 사용하면 \0 문자열이 포함되면 문자열의 끝으로 인식해서 데이터가 잘린다고 한다.
예) hello\0world 를 입력하면 hello까지만 출력
하지만 sds 문자열 방식을 사용하면 sds 는 메모리에 길이, 할당 크기, 타입 정보를 가진 헤더가 있다,
이것 때문에 \0가 들어가도 명시된 길이만큼 가져오기 때문에 문자열이 잘리지 않는다고 한다.
두 번째 문제는 %s는 strlen() 동작을 거치기 때문에 시간 복잡도가 O(N)만큼이라고 하고,
%S는 이미 길이가 명시되어 있어 O(1)이라 속도면에서 차이가 많이 발생한다.
branch를 만들고 PR
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.


