순간을 성실히, 화려함보단 꾸준함을

[OSS] 나만의 Redis Command 만들어보기 본문

나의 개발 메모장

[OSS] 나만의 Redis Command 만들어보기

폭발토끼 2024. 4. 27. 17:22

안녕하세요.

오랜만에 블로그 글을 포스팅 합니다.

 

현생에 치이고 제가 요즘에 개발 외적인 취미활동을 가졌습니다.

일상이 반복적이고 스스로 심적으로 많이 지쳤다는 것을 느끼고 이를 탈피해보려고 노력 중입니다.

그래서 블로그에 잠시 관심을 꺼둔 상태로 지내고 있는데요. 오늘은 '오픈소스컨트리뷰션' 이라는 프로그램에 참여하여 멘토님이 내주신 과제에 대해 포스팅을 하려고 합니다.

 

주제는 '나만의 Redis Command' 만들어 보기 입니다.

 

먼저 Redis 오픈소스는 버전 7.4 부터 상업적인 목적으로 사용하려면 계약을 따로 체결해야 합니다.

이 때문에 리눅스 재단이 Redis 의 대체제로 기존 소스를 fork 해 valkey 라는 오픈소스를 따로 개발한다고 합니다.

https://news.hada.io/topic?id=14436

 

Valkey가 빠르게 Redis를 대체하고 있음 | GeekNews

AWS, Ericsson, Google Cloud, Oracle, Verizon 등 많은 기업들이 Redis의 오픈소스 라이선스 변경에 반발하여 만들어진 Valkey 포크 프로젝트를 지원하기로 함.Alibaba Cloud, Aiven, Heroku, Percona 등도 추가로 지원 선

news.hada.io

 

저희도 이 때문에 valkey 프로젝트로 과제와 수업을 진행하고 있습니다.

https://github.com/valkey-io/valkey

 

GitHub - valkey-io/valkey: A new project to resume development on the formerly open-source Redis project. We're calling it Valke

A new project to resume development on the formerly open-source Redis project. We're calling it Valkey, since it's a twist on the key-value datastore. - valkey-io/valkey

github.com

해당 레포지토리 입니다.

 

Readme 에 어떻게 빌드할 수 있고 실행시킬 수 있는지에 대해서 서술이 잘 되어있으니 해당 문서를 참고하셔서 적용하면 될 것 같습니다.

서두가 길었는데 어떤 과제를 부여받았고 어떻게 해당 과제를 수행했는지에 대해 말씀드리도록 하겠습니다.

 

과제 내용

echo 명령어와 동일한 기능을 수행하는 echoXXX 명령어를 직접 추가해보세요.

src 폴더내에 있는 commands.h, commands.c, commands.def 와 server.h, server.c 를 이용하세요.

 

해결 과정

먼저 멘토님이 알려주신 파일들을 하나씩 확인하였습니다.

src 폴더 내에 해당 파일들이 있는 것을 확인한 뒤 주요 소스를 확인하였습니다.

(소스를 전부 첨부하기에는 방대해서 직접 확인해보시는 것을 추천드립니다)

 

commands.h

- command 를 만들기 위해 필요한 파라미터들의 정보들이 들어가 있는 변수들이 선언되어 있습니다.

정의할 명령어의 이름과 type 등 다양한 여러가지 정보들이 정의가 되어있습니다.

각각 무엇인지는 저도 잘 모르겠네요 ㅎㅎ

 

그럼 여기에 정의되어 있는 serverCommandArg 구조체를 대체 어디서 사용하냐???

 

command.def

- 커스텀할 명령어를 추가하기 위해 commands.def 파일에 새롭게 정의해주면 됩니다.

어떻게 커스텀 명령어를 정의해주었을까요?

쉽게 찾고 싶으시면 commands.def 파일에서 echo 키워드로 검색하시면 쉽게 찾을 수 있으실 겁니다.

 

저희가 구현하고 싶은 기능은 echo 와 동일한 기능이니 echo 가 정의되어 있는 소스를 그대로 복사 붙여넣기 합니다. 그리고 명칭을 변경해주시면 되겠죠?

전 저의 이름을 따 echoSeongJu 라는 명령어를 정의해주었습니다.

또한, 파라미터에 들어갈 변수들도 새롭게 정의를 해주었습니다.

 

근데...MAKE_ARG 와 MAKE_CMD 는 대체 무엇일까요??

함수일까요???

이를 확인하기 위해 commands.c 파일을 확인해보았습니다.

 

commands.c

- commands.h, commands.def, sever.h,server.c 등 command 에 관한 내용을 담고 있는 본문입니다.

이 파일을 보시면 MAKE_ARG 그리고 MAKE_CMD 가 전처리기로 정의가 되어있습니다.

 

server.h / server.c

- 무슨 역할을 하는 소스인지는 정확하게는 모르겠으나, 소스를 보다 보면 각 명령어들의 동작과정이 정의되어 있는 것을 확인할 수 있습니다. 해당 파일에서 위와 마찬가지로 echo 키워드로 검색하여 하나씩 따라가 보면서 추가해주었습니다.

sever.h

server.h 에 새롭게 정의한 echoSeongJu 커멘드를 입력하면 동작하는 함수명을 정의해주었습니다.

server.c

server.c 에 어떤 동작을 할 건지 정의해주었습니다. 사실상 echo 커멘드와 동일한 동작을 하는 소스이니 함수명만 변경한 채로 적용하였습니다. 이때, echoSeongJu 커멘드를 입력하면 진짜로 제가 커스텀한 함수를 호출하는게 맞는지를 확인하기 위해 printf 함수를 사용하여 로그성 문자열을 출력하게끔 하였습니다.

 

*주의할 점

{MAKE_CMD(
"echoSeongJu",
"Returns the given string.",
"O(1)",
"1.0.0",
CMD_DOC_NONE,
NULL,
NULL,
"connection",
COMMAND_GROUP_CONNECTION,
ECHOSeongJu_History,
0,
ECHOSeongJu_Tips,
0,
echoSeongJuCommand,
2,
CMD_LOADING|CMD_STALE|CMD_FAST,
ACL_CATEGORY_CONNECTION,
ECHOSeongJu_Keyspecs,
0,
NULL,
1),.args=ECHOSeongJu_Args},

위 소스는 commands.def 에 커스텀한 커멘드인데요. 이때 반드시 sever.h 와 server.c 에 정의해준 함수명과 14 번째 파라미터의 명칭이 동일해야 합니다.

 

빌드 및 테스트(결과)

make 명령어를 통해 빌드를 실행해 줍니다.

그리고 valkey(redis) 를 실행시켜주고 cli 로 들어가서 제가 만든 명령어를 직접 실행시켜 봅시다.

아래 명령어로 valkey(redis) 를 실행시켜줍니다.

./valkey-server

잘 실행되는 것을 확인했으면 cli 를 실행시켜 확인해보겠습니다.

(iTerm 을 사용하고 있는데 새로운 창을 여는 단축키는 command + T 입니다)

정상적으로 출력이 되는 것을 확인할 수 있었습니다.

그럼 제가 커스텀한 함수가 정말로 호출되었는지 확인해볼까요?

아까전에 server.c 에 printf 함수로 문자열을 출력하도록 했죠?

잘 나오는 것을 확인했네요.

 

여기까지 OSS 3주차 '나만의 Redis Command 를 만들어보자' 과제였습니다.

 

감사합니다.