Post

카카오엔터프라이즈 인턴십 회고

kakaoenterprise-title

올해(2024년) 1월부터 3월까지 카카오엔터프라이즈에서 3개월간의 체험형 인턴십을 진행하였다. 카카오엔터프라이즈 데이터베이스플랫폼팀의 RDBMS 파트에서 인턴으로 근무하면서 정말 많은 것을 배울 수 있었고, 또한 많은 것을 경험할 수 있었다.

이러한 경험을 아직 기억이 생생할때 회고를 작성해보고자 한다.

인턴십 모집

지원 동기

가천 카카오엔터프라이즈 SW 아카데미를 수료하고 공개 SW 개발자 대회가 끝날 즈음에 카카오엔터프라이즈에서 체험형 인턴십을 아카데미 연계 인턴십을 모집한다는 내용을 전달받았다. 그리고 얼마후 인턴십 채용 설명회가 진행되었고 모집 직무에 대한 안내와 Q&A가 있었다.

이때 모집 직무에 대해 자세히 알 수 있었는데 평소 개발자로서 공부를 해왔다고 생각한 만큼 개발팀에 지원하고 싶었지만 백엔드 개발 직무는 모집 분야에 없었다. 하지만 데이터베이스 엔지니어 직무가 데이터 모델링, SQL 쿼리 작성보다는 데이터베이스를 구축하고 운용하기 위한 아키텍처 설계, 복제, 백업 및 복구 솔루션 구축, 관리 스크립트 개발 등과 같은 시스템 엔지니어링에 가까운 직무라는 것을 알 수 있었고 이에 지원하게 되었다.

평소 백엔드 개발 전반에 관심이 있던 만큼 데이터를 저장하기 위한 데이터베이스와 서버 구축을 위한 인프라까지 모두 공부하기 위해 노력했었다. 특히 SW 아카데미 기간에는 프로젝트를 진행하면서 상황에 맞는 적절한 데이터베이스를 사용해 보고자 하였고 CAP 이론의 세 종류의 DB(MySQL, MongoDB, ScyllaDB)를 모두 사용하고자 하였다. 각각의 아키텍처까지 깊이있게 공부하진 못했지만 그래도 각 DB의 특징을 이해하고 사용해보는 것이 목표였다. 또한 인프라 구축을 담당하면서 클라우드와 Kubernetes를 사용해 배포 환경을 구축했었다.

이러한 경험을 바탕으로 카카오엔터프라이즈의 데이터베이스 엔지니어 직무가 나에게 적합하고 또 잘할 수 있다고 생각하여 지원하게 되었다.

모집 과정

모집 과정은 서류 전형, 코딩 테스트, 면접으로 이루어졌다. 서류에는 모집 직무에 대한 지원 동기와 경험, 프로젝트 경험 등을 작성하였고 포트폴리오로 블로그의 about 페이지를 제출했다. 그런다음 코딩테스트를 진행하였는데 4문제 정도였던것으로 기억한다. 탐색과 그래프 문제가 주로 나왔었다.

마지막으로 면접을 진행했는데 이때 하필 일본 여행과 면접이 겹치는(…) 일이 있었다. 어떻게 할지 고민하다 비대면 면접인 만큼 그냥 일본에서(!) 진행하기로 결정했다. 면접 초반에 아이스브레이킹 질문으로 집에서 면접을 참여하는지 물어봤는데 일본 여행중이라 일본에서 하고 있다고 말씀드렸던 기억이 난다.

면접은 데이터베이스 이론에 대한 질문들이 많이 나왔는데 이때 다양한 데이터베이스를 사용해본 경험을 서류에 작성해서 그런지 데이터베이스의 특징과 장단점에 대한 질문이 많이 있었다. 꼬리 질문들이 많았는데 여러 데이터베이스를 사용해보기만 했을뿐 깊이있게 공부한 것은 아니었기 때문에 답변을 잘 못한 부분도 있었다고 생각한다. 그리고 자소서에 쿠버네티스를 사용해 배포 환경을 구축했다고 적었는데 이에 대한 질문도 나왔다.

그래도 운이 좋게 면접을 통과하게 되었고 인턴십을 진행하게 되었다.

인턴십 진행

id_card

합격 안내 메일을 받고 첫 출근은 1월 8일부터 하게 되었다. 첫날에는 인턴십 프로그램에 대한 안내와 서류 작성, 장비 지급 등을 하였고 바로 팀에 배치되었다.

배치된 팀은 정확히 말하면 데이터베이스플랫폼팀의 RDBMS 파트로 언더클라우드와 오버클라우드 전반에 걸쳐 사용되는 RDBMS들을 구축하고 관리 및 운영하는 파트였다. 인턴십 기간에는 주로 MySQL과 관련된 과제를 부여받아 진행하였고 매주 모든 팀원과 함께 리뷰 시간을 가지면서 진행 상황을 공유하고 피드백을 받았다.

수행했던 과제를 정리하면 다음과 같다.

  • MySQL 아키텍처 리서치
  • MySQL 구축, 복제 토폴로지 설계 경험
  • MySQL 백업 및 복구 솔루션 구축 경험
  • Orchestrator 기반 고가용성 토폴로지 구성
  • 서버 진단 및 레포팅 툴 제작

MySQL 아키텍처 리서치

mysql_architecture

첫 과제는 MySQL 아키텍처 리서치였다. MySQL의 아키텍처를 이해하고 이를 바탕으로 MySQL을 구축하고 운영하는데 필요한 지식을 습득하는 것이 목표였다.

MySQL의 스토리지 엔진중 기본으로 사용되는 InnoDB를 위주로 InnoDB Buffer Pool, Undo Log, Redo Log, Double Write Buffer, Log Buffer 등의 개념을 이해하고 이를 바탕으로 MySQL의 아키텍처를 설명하는 문서를 작성하였다. 뿐만 아니라 관련 파라미터들을 설정하는 방법과 이를 통해 MySQL의 성능을 튜닝하는 방법에 대해서도 학습하였다.

아키텍처 리서치를 진행하면서 주기적으로 피드백하는 시간을 가졌고 마지막에는 모든 파트원들 앞에서 아키텍처 구조를 칠판에 그리면서 발표하는 시간을 가졌다. 이 과정에서 MySQL의 아키텍처를 이해하고 파라미터 튜닝을 할때 현업에서 어떤 부분을 주의해야 하는지 알 수 있었고 이를 통해 MySQL을 구축하고 운영하는데 필요한 지식을 습득할 수 있었다.

MySQL 구축, 복제 토폴로지 설계

mysql_replication

다음으로 리서치했던 내용을 바탕으로 MySQL을 구축하고 복제 토폴로지를 설계하는 과제를 진행하였다. 카카오클라우드 상에서 VM을 생성하고 MySQL을 설치하고 설정하는 과정을 진행하였다.

이때 MySQL의 파라미터를 상황에 따라 적절히 설정하는 것이 중요했는데 이때 InnoDB Buffer Pool 사이즈, Redo Log 사이즈, Binlog 사이즈 등을 적절히 설정하는 것이 중요했다. 그리고 MySQL의 복제 토폴로지를 설계할때 고려해야 하는 부분들을 고민하였고 Master-Slave, Master-Master, Group Replication 등의 방법을 학습하였다. 또한 복제 방법으로 GTID, Async, Semi-sync 등의 방법에 리서치하고 적용하였다.

MySQL 백업 및 복구 솔루션 구축

서버를 설치하였으니 이제 백업 및 복구 솔루션을 구축하는 과제를 진행하였다. 우선 MySQL 백업 방법들에 대해 리서치하며 고려해야 하는 사항과 특징, 장단점을 정리하였다. 이 과정에서 로컬 백업, 원격 백업, 스냅샷 백업, 물리적 백업, 논리적 백업 등의 백업 방법들을 비교하고 xtrabackup, mysqldump, mysql shell, mydumper 등의 백업 도구의 사용법을 공부했다.

이 과정에서 소소한 오픈소스 문서 기여도 진행했는데 xtrabackup 문서에서 오타와 잘못된 부분을 수정하고 PR을 올렸다. 평소 오픈소스에 기여해야지 생각은 하면서도 못했었는데 사소하지만 기여를 할 수 있어 좋았다.

이후 백업 스크립트를 작성하고 이를 통해 백업을 수행하고 복구하는 과정을 진행하였다. 백업을 수행할때는 백업 주기, 백업 위치, 백업 대상, 저장소 공간 등을 고려해야 했고 복구를 수행할때는 백업된 데이터를 복구하는 방법과 주의사항을 고려해야 했다.

Orchestrator 기반 고가용성 토폴로지 구성

orchestrator

다음으로는 Orchestrator를 사용해 MySQL의 고가용성 토폴로지를 구성하는 과제를 진행하였다. 이때 MySQL의 고가용성을 위해 Master-Slave 구조를 구성하고 이를 Orchestrator를 통해 관리하는 방법을 학습하였다.

Orchestrator는 MySQL의 Master-Slave 구조를 관리하고 이를 통해 자동으로 장애 발생시 트래픽을 다른 노드로 이동시키는 등의 기능을 제공한다. 이를 통해 MySQL의 고가용성을 확보하고 장애 발생시 빠르게 대응할 수 있다.

당시 팀에서도 Orchestrator와 ProxySQL을 사용한 고가용성 토폴로지 구성을 테스트 중이었는데 테스트 작업을 참관하며 현업에서 새로운 기술을 적용하는 과정을 경험할 수 있었다. 또한 이후 실제 데이터베이스 클러스터를 Kubernetes에 배포하는 과정에 참여하며 현업에서 데이터베이스를 구축하고 운영하는 방법을 경험할 수 있었다.

서버 진단 및 레포팅 툴 제작

마지막으로 서버 진단 및 레포팅 툴을 제작하는 과제를 진행하였다. 이는 MySQL의 성능을 모니터링하고 이를 정리하여 사용자에게 제공하는 툴을 제작하는 것이 목표였다.

툴 제작은 가장 편한 방식으로 제작해도 된다고 하셨고 나는 최근에 Go 언어를 사용해 프로젝트를 진행한 경험이 있어 이를 사용하여 툴을 제작했다. MySQL의 상태를 점검하기 위해 인스턴스 서버의 상태부터 informaion_schema, performance_schema 등의 MySQL 내부 정보를 수집하고 이를 정리하여 사용자에게 제공하는 툴을 제작하였다.

툴을 제작하고 리뷰 시간에 피드백을 받으며 원격으로 서버 진단을 할 수 있으면 좋겠다고 하셨고 go언어의 ssh 패키지를 사용하여 MySQL 뿐만 아니라 인스턴스 서버의 상태까지 원격으로 수집할 수 있도록 구현하였다.

회고

documents 인턴십 기간동안 공부하며 정리한 내용들

인턴십을 진행하면서 MySQL을 구축하고 운영하는데 필요한 지식을 습득하고 이를 바탕으로 과제를 진행하며 현업에서 데이터베이스를 구축하고 운영하는 방법을 경험할 수 있었다.

특히 매주 팀원들과 리뷰 시간을 가지면서 진행 상황을 공유하고 피드백을 받으면서 현업에서 어떤 부분을 고민하고 생각하게 되는지 알 수 있었다. 환경에 맞게 메모리 버퍼의 크기로 설정하고, 복제를 위한 비동기 및 반동기 설정, 백업을 위한 논리 백업과 물리 백업에 대한 비교 등을 고민해 보았다. 이 과정에서 그전에는 생각하지 못했던 데이터베이스의 동작 방식이나 아키텍처 구조를 고려하며 운영해 볼 수 있었다.

이외에도 Jira를 사용해 이슈를 관리며고 매일 스크럼과 주간 보고를 작성하며 현업에서의 업무 방식을 경험할 수 있었다. 첫 회사 생활이었던 만큼 앞으로도 잊을 수 없는 소중한 경험이었다고 생각한다.

intern_certificate

3개월의 체험형 인턴십이 끝나고 아쉽기도 했지만 마지막에는 우수 인턴 증명서를 받을 수 있었다. 이번 인턴십 경험을 바탕으로 앞으로의 취업 준비도 더욱 화이팅(!!!) 해야겠다:)

This post is licensed under CC BY 4.0 by the author.