대학 동기의 추천으로 오픈소스 아카데미의 존재를 알게 되었습니다.
백엔드 개발자로 일하면서 제일 친숙한 레디스에 흥미가 제일 갔습니다.
그래서 git 활용 및 Redis 섹션에 지원하게 되었습니다.
지원 동기는 직무 내용에 대해 작성했던 것 같습니다.
회원 로직 개발 내용과 함께 레디스 오픈소스에 대해 흥미가 생긴 배경에 대해
작성했습니다. 그와 더불어 자기소개도 작성해야했는데
저의 개발 성향과 최근에 했던 흥미로운 프로젝트들에 대해 작성했습니다.
OSSCA에는 체험형/참여형으로 나뉘는데 체험형의 경우 4주, 참여형의 경우 12주 정도로
기간차이가 납니다. 체험형을 통해 가볍게 오픈소스를 경험해볼 수 있었습니다.
4주간의 실습이 끝난 뒤에는 멘티별로 개별 활동서를 작성해야합니다.
1,2,3,4주차 동안 진행한 실습과 과제들이 있다면 정리해서 작성합니다.
1주차 실습
- 폴크 생성
- PR 생성
2주차 실습
1) github 포크 후 자신의 정보 업데이트 후 PR 생성
- 윈도우 환경이라 WSL로 실행
git clone <https://github.com/valkey-io/valkey> # 코드 내려받기
make # 빌드
./valkey-server # 폴더 이동
2) Redis key 조회
- cli 실행
- ./valkey-cli
- key 저장
- set redis valkey
- get redis
3) RESP - Redis 의 Request/Response Format
- Redis Serialization Protocol
- 현재 RESP v2, v3 의 두 가지 버전이 있습니다.
- 기본으로는 RESP v2를 사용하게 되고 hello 3 라는 명령을 사용하면 개별로 RESP v3를 사용하게 됩니다.
RESP v2
- 각 라인은 \\r\\n 으로 구분type 시작 구분자 내용
type 시작 구분자 내용 status + 특수문자가 없는 일반 스트링을 표현할 때 사용 +OK error - 특수문자가 없는 에러 문자열을 표현할 때 사용 -ERR integer : 정수를 표현한다. (float 표현은 되지 않는다) :1234 bulk $ 특수문자가 포함된 문자열을 표시한다. $(사이즈)\r\n 실제문자열\r\n multibulk * 배열을 표시할 때 사용한다 *1\r\n $4\r\n ping\r\n
RESP v3
- 개별 커넥션마다 업그레이드를 해야만 가능하다type 시작 구분자 내용
type 시작 구분자 내용 Blob Error ! - 특수문자가 포함된 문자열로 에러 표시때 사용
- $와 사용법은 동일
!(size)\r\n
ERR\r\nBig Number ( 큰 정수를 표현
(1234567890\r\nDouble . 실수 표시
.3.14\r\n
.inf
.-infNULL - null 표시 Boolean # #t\r\n
#f\r\n
과제 2) 다음 레디스 명령을 RESP v2 형식으로 변형하세요.
- \r\n을 다 붙여주세요.
- 과제 내용
- hset hkey ossca 2024
- ping
- incr a
hset hkey ossca 2024
=>
+hset\\r\\n+hkey\\r\\n+ossca\\r\\n:2024\\r\\n
-----
ping
=>
+ping\\r\\n
-----
incr a
=>
+incr\\r\\n+a\\r\\n
3주차 실습
과제) 레디스에 명령을 추가하세요.
- 받은 내용을 그대로 다시 돌려주는 echo 명령을 만들어봅시다
- src/ 디렉토리 밑에 commands 시작하는 다음과 같은 파일들이 있습니다.
- src/commands.h
- src/commands.c
- src/commands.def
💡 Redis 에 echo{영어이름} command를 추가해보세요.
|
깃허브
echoSUHYEONCommand 추가 · charsyam/ossca-redis-2024@ab3e898
src/commands.def
#ifndef SKIP_CMD_HISTORY_TABLE
/* ECHO_SUHYEON history */
#define ECHO_SUHYEON_History NULL
#endif
#ifndef SKIP_CMD_TIPS_TABLE
/* ECHO_SUHYEON tips */
#define ECHO_SUHYEON_Tips NULL
#endif
#ifndef SKIP_CMD_KEY_SPECS_TABLE
/* ECHO_SUHYEON key specs */
#define ECHO_SUHYEON_Keyspecs NULL
#endif
/* ECHO_SUHYEON argument table */
struct COMMAND_ARG ECHO_SUHYEON_Args[] = {
{MAKE_ARG("message",ARG_TYPE_STRING,-1,NULL,NULL,NULL,CMD_ARG_NONE,0,NULL)},
};
..............
.....
...
{MAKE_CMD("echoSUHYEON","Returns the given string.","O(1)","1.0.0",CMD_DOC_NONE,NULL,NULL,"connection",COMMAND_GROUP_CONNECTION,ECHO_SUHYEON_History,0,ECHO_SUHYEON_Tips,0,echoSUHYEONCommand,2,CMD_LOADING|CMD_STALE|CMD_FAST,ACL_CATEGORY_CONNECTION,ECHO_SUHEYON_Keyspecs,0,NULL,1),.args=ECHO_SUHYEON_Args},
src/server.c
void echoSUHYEONCommand(client *c) {
addReplyBulk(c,c->argv[1]);
}
src/server.h
void echoSUHYEONCommand(client *c);
4주차 실습
과제) 과제3을 개선해봅시다
- 받은 내용을 그대로 다시 돌려주는 echo 명령을 만들어봅시다
- echo2 abc 라고 보내면 응답이 abc 가 아니라 echo2_abc 등으로 응답이 오도록 만드는 것입니다.
응답예제
힌트
- 기존에 사용하던 client *c 의 내부구조를 살펴보아야 합니다.
- 다음 구조체와 함수들을 참고하세요.
- sds
- sdscatfmt
- sdsempty
- addReplyBulkSds
- 과제 #2의 echo2 커맨드를 개선해서 앞에 echo2_ 가 붙도록 수정해보세요.
src/server.c
void echoSUHYEONCommand(client *c) {
sds s = sdscatprintf(sdsempty(), "echo2_%S", c->argv[1]->ptr);
addReplyBulkSds(c, s);
}
- sdsempty() 함수를 사용하여 빈 SDS 생성
- sdscatprintf() 함수를 사용하여 "echo2_" 문자열과 클라이언트가 보낸 메시지를 SDS에 추가
- addReplyBulkSds() 함수를 사용하여 SDS를 클라이언트에게 응답으로 보냄
좋았던 점 💪
- 레디스 내부 구조까지 뜯어본 적이 없는데 생소한 경험이었다. 간단한 명령어를 추가하는 실습으로 다음엔 더 재밌는 명령어를 추가해볼 수 있을 것 같다.
아쉬웠던 점 🥲
- 다른 팀원들과의 교류를 열정적으로 참여하지 못한 것 같아 아쉽다
향후 ⭐
- 배웠던 것들을 블로그에 업데이트하고 다른 소스들도 뜯어보고 해석해보고 싶다!
'회고' 카테고리의 다른 글
잇츠 스터디 회고 - [INFRA] Terraform Beginners (0) | 2024.07.11 |
---|---|
K-콘텐츠 해커톤 후기 (1) | 2023.11.13 |
주니어 탤런트 쇼 1기 회고.. 및 2기 모집 (0) | 2022.08.25 |