Search

[스터디 후기] Cubrid 데이터베이스 엔진

Created
2022/01/27
Tags
C
C++
Database
Engine
Open Source
Cubrid
Study

최종 결과물

dbstudy
innovationacademy-kr

선발

Golang 해커톤을 거의 마무리 해갈 때 쯤, 42_global_random 채널에 DB 엔진 오픈 스터디 참여 모집 글이 올라왔다. 단순한 데이터베이스 스터디라기엔 엔진이라는 글이 조금 눈에 띄었고, 보통 이런 스터디의 경우 C 혹은 C++로 진행하는 경우가 있어서 굉장히 호기심이 갔다.
글을 올리신 분은 OKKY 서비스를 만드셨던 허광남 멘토님이셨고, 스터디 자체는 허광남 멘토님 혼자서 리딩하는 것이 아니라 Cubrid의 실무자들과 함께 진행하는 것이었다. 이 때까지만 해도 무언가를 해보려는 시도를 C 혹은 C++ 쪽으로 잡아보고 경험해볼지 웹 백엔드 개발 쪽으로 경험해볼지 고민하던 차였는데, 멘토님으로부터 C와 C++에 대해서 좋은 경험이 될 것이라는 답변을 듣게 된 후로 고민 끝에 스터디 모집에 지원하게 되었다.
그렇게 10월 29일에 DB 엔진 오픈 스터디에 참여할 수 있다는 소식을 듣게 되었고, 11월부터 약 3개월간 커리큘럼에 맞춰서 스터디를 진행할 수 있게 되었다.
스터디 진행은 Phase 별로 조금씩 달랐는데, 주마다 공통적으로 권장하는 사항은 구성된 팀원끼리 2회 이상 오프라인에서 스터디를 진행하는 것이었다. 그리고 매주 월요일마다 허광남 멘토님과 목요일에 진행할 세미나를 위한 중간 점검 시간을 가졌고, 목요일마다 모든 팀들이 모여서 Cubrid 실무진들 앞에서 세미나를 진행했다. 세미나는 Zoom을 이용하여 온라인으로 진행되었다. 그리고 오픈 스터디였던 만큼 각 주차 별로 진행되었던 내용들은 반드시 MD 파일로 정리하여 GitHub에 공유하도록 규칙을 정하게 되었다.

Phase 1

Phase 1은 2주로 진행되었고 멘토님으로부터 3인 1팀을 배정받아 총 4개의 팀으로 구성되었다. 각 팀은 시작하세요 Cubrid라는 책을 파트를 나누어 읽은 뒤, 세미나에서 발표하는 시간을 가졌다. 1주차에는 2개의 팀이 각각 Cubrid를 설치하고 설정하는 방법Cubrid에서 사용할 수 있는 SQL과 그 예시에 대해서 진행했다. 2주차에는 트랜잭션과 잠금, 그리고 복구와 백업으로 2개의 팀이 세미나를 진행했다.
내 경우에는 jinbekim님과 bypark님과 한 팀이 되었고, 트랜잭션과 잠금을 맡아서 세미나를 진행했다. 다행스럽게도 전공 수업 때 열심히 했던 부분이라 책을 읽으면서 다시 한 번 복기할 수 있는 시간을 가졌고, 팀원들에게도 모르는 부분을 알려주면서 세미나도 무사히 마칠 수 있었다.

Phase 2

Phase 1이 끝나면서 기본적인 데이터베이스에 대한 이해가 쌓였을 시점에 Cubrid 오픈 소스를 분석하도록 기존의 4개의 팀에서 2개의 팀으로 재구성 되었다. Cubrid의 소스 코드가 꽤 방대하기 때문에 모든 소스를 분석하기엔 무리가 있었고, Cubrid 실무진들의 권유에 따라 Disk Manager 모듈 그리고 Double Write Buffer 모듈로 팀이 나눠졌다.
나는 Disk Manager 모듈 쪽을 분석하게 되었는데, 각자 맡아야 하는 부분을 Cubrid에서 지정해주진 않았기에 제공 받은 전반적인 로드맵을 통해 팀원들의 역할을 배분하게 되었다. Phase 2는 8주간 진행되고, 마지막 8주는 Phase 3를 위한 준비 기간이었기 때문에 7주에 대한 역할만 나눠야 했다. Phase 1을 진행하는 도중에 인원이 한 명 늘었었고, Disk Manager 조가 7명이었기 때문에 주마다 한 명씩 세미나를 전담하는 것으로 합의했다.
여담으로 DWB 팀은 6명이었다가 Phase 2를 진행하면서 인원이 2명 줄었던 것으로 기억하는데, 매 주마다 각자 발표하는 시간을 가졌었다. 꽤나 힘들겠다 싶었는데도 끝까지 분석을 이어갔고, 분석 퀄리티도 좋아서 놀랐던 기억이 난다.
1주차 (bypark)
entry-point : disk_manager_init()
Disk Manager 의 역할
disk_manager_init()
Disk Manager 전반적인 초기화
2주차 (jolim)
entry-point : disk_manager_init()
disk_format()
Volume 파일 생성
disk_stab_init()
Disk Sector Table 생성
3주차 (seubaek)
entry-point : disk_reserve_sector()
disk_reserve_sectors()
Disk Sector 예약 전반적인 과정
4주차 (jseo)
entry-point : disk_reserve_sector()
disk_reserve_from_cache()
Disk Cache 예약
5주차 (jinbekim)
entry-point : disk_reserve_sector()
disk_reserve_sectors_in_volume()
Disk Sector 비트 변경
6주차 (hyeonkki)
entry-point : disk_extend()
disk_extend()
볼륨 전반적인 확장
7주차 (samin)
entry-point : disk_extend()
disk_add_volume()
볼륨 추가
각자 맡은 파트는 위와 같은데, 내 파트는 디스크 섹터의 예약을 진행하기 이전에 캐쉬로부터 사전 예약을 진행하는 disk_reserve_from_cache를 맡았다. 스터디 진행은 각자 파트에 국한되지 않고, 매 주마다 진행해야 하는 부분을 모두 이해할 수 있도록 주마다 2~3회 씩 오프라인으로 만나서 진행되었다. 아무래도 첫 주부터 굉장히 생소한 개념과 함께 어려운 코드를 봐야 하다보니, 질문을 주고 받으면서 서로 모르는 부분을 공유하기 위해 자연스럽게 모이게 되었던 것 같다.
아무래도 1~3주차 쯤에 Disk Manager에 대한 전반적인 개요, 그리고 흐름을 파악할 수 있었다보니 Phase 2가 끝바지에 다다를 쯤에는 코드의 의문도 점점 사라졌던 것으로 기억한다. 특히 매 세미나 시간마다 Cubrid 실무진들로부터 내용을 잘 이해했는지 확인하기 위한 질문을 받았었는데, 이것도 시간이 지나면서 점점 능숙히 답할 수 있었다.

Phase 3

Phase 2가 마무리 될 때쯤 스터디 기간도 시간도 꽤 길었기 때문에 마음이 많이 붕떴었고, Phase 3 쯤 오게 되니까 거의 스터디가 끝났구나 하는 생각이 많이 들었던 것 같다. Phase 3의 3주는 크게 2가지 활동으로 스터디가 진행되었는데, 하나는 코드 기여이고 나머지는 Cubrid 방문 및 발표였다.
긴 시간 동안 스터디에 열정적으로 참여해준 것이 고맙다고 Cubrid 측에서는 스터디에 참여한 Cadet들에게 오픈 소스에 PR을 날릴 수 있는 기회를 주기로 했고, 이를 위한 지도가 이뤄졌다. 물론 코드에 기여하려는 내용들이 코어 모듈에 큰 영향을 끼치는 그런 부분들은 아니었고, 간단한 논리적 오류라든가 불필요한 주석, 안 쓰는 변수 혹은 불필요한 루프 제거 등 대체적으로 작은 부분들이었다.
나를 포함한 스터디에 참여한 Cadet들은 코드에 기여하는 것이 굉장히 뜻 깊다고 느꼈을 것이라 생각하는데, 비록 단순한 코드를 고치더라도 실제로 Cubrid와 같이 작지 않은 기업에서 일할 때 업무 프로세스가 어떤 식으로 이뤄지는지 간접적으로라도 경험해볼 수 있었기 때문일 것이다.
단순히 학생들끼리 협업을 해본다고 툴을 끄적여 보는 것과는 달리 실무에서 협업으로 Jira를 어떻게 이용하고, GitHub과는 어떤 연동이 되어 있으며, 기여를 위해선 어떤 등록 절차를 밟아야 하는지, 이슈 상태 별 해야할 일들이 개발자들에게 어떻게 부여되어 있는지, 이슈 제보를 위한 형식이 이슈 타입마다 어떻게 다른지, 리뷰는 어떻게 이뤄지고 테스트는 어떤 것을 얼마나 거치는지 등을 경험할 수 있었다. 내게는 이 경험이 어려운 작업이 아니라고 하더라도 느끼는 점들이 많은 경험이었다.
그렇게 위 그림처럼 Cubrid에 성공적으로 기여를 마치고 나서야, Phase 3의 절반이 끝났고 마지막으로 사내 방문만을 남겨두고 있었다.
사내 방문에서는 Phase 2 때 진행했던 코드 위주의 세미나와 달리 코드 내용을 전반적으로 제거한 채로 모듈 별로 어떤 유기적인 상호작용으로 Disk Manager가 동작하는지 요약하여 각자 발표하는 시간을 가졌다. 그리고 발표를 마친 후에 다 같이 피자 먹으면서 대화의 시간을 가졌고, Cubrid의 기업 분위기와 42가 어떤 곳인지를 서로 알 수 있는 시간을 보냈다.

느낀 점

1.
장기간 스터디는 처음 진행해보면서 굉장히 체력적으로 힘이 드는 일인 것을 느낄 수 있었다.
2.
C, C++이 싫지 않지만 Golang을 하고 싶다는 생각을 더 많이 되뇌고 있었다는 것을 문득 깨달았다.
3.
업무 프로세스를 이슈를 통해 한 싸이클 직접 경험해보는 것이 정말 좋았다. (정말 깨달은 것들이 많은데 표현이 잘 안 된다.)
4.
Cubrid는 정말 좋은 기업이고, 스터디를 진행하면서 모르는 것들을 세세하게 피드백 받을 수 있어서 좋았다.
5.
DB 엔진의 일부 모듈만을 분석한 것이지만 이 과정에서 복기한 것들과 새로 알게 된 것들이 많았다.
6.
처음부터 혼자서 작성한 코드로 일을 하게 되는 경험은 많지 않을 것이다. 어딜 가더라도 남들이 짜놓은 코드 위에서 작업을 하게 되는 경우가 많을 것인데, 이 때 기존의 코드를 정확히 이해하는 것은 굉장히 중요하다고 느꼈다. 특히 기존 코드를 따라가는 과정에서 이미 먼저 그 코드를 알고 있는 사람과 서로의 맥락을 맞춰가며 소통하는 과정이 중요함의 90% 이상을 차지하는 것 같다고 생각했다. 오픈 소스 기여도 이와 크게 다르지 않고 소통이 반 이상이겠구나를 느낄 수 있었다.