안녕하세요
아이들나라Backend팀에서 데이터 레이크와 데이터 웨어하우스 및 데이터 파이프라인 개발과 운영을 맡은 신윤철이라고 합니다.
입사하여 쿼리를 할 수 있는 환경을 구축한 이후에 쿼리 스터디를 진행하게 된 경험을 소개해 드리고자 합니다.
시작하기 전에 관련 개념에 대해서 간략하게 설명해 드리자면, 데이터 레이크란 기업에서 분산된 데이터를 원시 형태로 받아들여 원하는 형태로 데이터를 처리하고 중앙화된 곳에서 관리할 수 있는 저장소를 의미합니다. 데이터 웨어하우스란 정형, 반정형 데이터를 비즈니스 의사결정에 맞게 활용할 수 있는 시스템입니다. SQL을 사용하여 데이터를 탐색, 변환, 적재할 수 있고 현재는 비즈니스 의사결정 이외에도 머신러닝 등 다양한 목적에 맞게 사용하는 추세입니다. DW와 연동하여 시각화 도구인 비즈니스 인텔리전스(BI) 툴과 함께 사용하는 경우가 많습니다. 마지막으로 데이터 파이프라인이란 원천 데이터 수집에서부터 최종 소비자가 사용할 수 있는 곳까지 데이터를 전달하는 작업입니다.
아이들나라와의 첫 만남
2022년 5월 아이들나라의 서비스 내에서 데이터 활용의 근력을 키우고 서비스 성장의 기반을 견고하게 하기 위한 역할을 부여받아 입사하게 되었습니다.
입사 당시에는 아이들나라를 포함한 유플러스 전체에서 사용 중인 DW 환경이 이미 구축되어 있었고, 아이들나라에서는 서비스 내에서 더욱 기민하게 움직일 수 있도록 클라우드상에서 자체 데이터 레이크를 구축하는 미션을 받아 입사와 동시에 서비스를 파악하고 데이터 레이크, 데이터 파이프라인 및 데이터 웨어하우스를 구축하는 업무를 진행하게 되었습니다.
실제로 데이터 분석 환경까지의 시스템 구축은 많은 분들께서 도움을 주셨습니다. 제가 속해있는 Backend팀에서부터 아이들나라의 모든 시스템을 담당하는 사이트 신뢰성 엔지니어링팀(SRE), 분석과 서비스의 성장을 견인하기 위해 전략을 만들어주시는 그로스전략팀, 아이들나라의 모바일앱을 책임지는 모바일팀 등 유관부서의 많은 도움을 받아 4개월 정도 지난 시점이 되어서야 데이터 수집 환경을 구축하고 DW 환경에서 쿼리할 수 있는 환경을 제공 드릴 수 있었습니다. 온보딩과 수습 기간의 평가를 함께 진행했기 때문에 생각만큼 속도를 내지 못한 점이 아쉬웠습니다.
쿼리 스터디를 시작하게 된 계기
우여곡절 끝에 데이터 분석 환경은 구축되었지만, 막상 데이터를 활용하시는 분들은 예상보다 많지 않았습니다.
당시 쿼리를 추출하여 데이터를 확인하는 방법과 관련해서 U+ 본사의 DW 시스템이 많이 사용되고 있었고, DA분들께 많은 작업량이 몰려있었습니다. 아이들나라의 자체 데이터웨어하우스로 데이터를 수집과 제공을 해드리기 시작했지만, 각 현업 부서에서 업무에 연결하여 활용하시는 부분까지는 어려움을 겪고 계셨습니다.
그 이유를 저는 두 가지로 생각했습니다.
1.
어떤 데이터가 적재되어 있는지 알 수 없음
2.
데이터가 적재되어 있는 걸 알아도 쿼리에 익숙하지 않아 데이터를 추출할 수 없음
1번의 방법은 데이터가 필요하신 분들께서 요청하시면 열심히 데이터를 모으고 안내해 드리거나 데이터를 직접 생산하는 팀에 도움을 요청하여 해결할 수 있다고 생각했습니다. 하지만 월급을 계속 받기 위해서2번의 방법을 해결하기 위해서는 스터디가 절실하게 필요하다고 생각했습니다.
이런 생각이 들 때쯤 아이들나라의 DevRel 새롬님께서 쿼리 스터디를 하고 싶다고 말씀 주셨습니다. 저는 이 기쁜 소식을 팀장님께 말씀드렸고, 현장의 소리를 더 많이 들어주고 계셨던 팀장님께서는 저만 괜찮다면 판을 더 키워보자고 말씀해 주셨어요
그렇게 스터디를 아이들나라 그룹 전체 단위로 모집하게 되었고 많은 관심을 받을 수 있었습니다. 1차에서 총 16분께서 신청해 주셨고, 2차와 3차 스터디를 더 만들게 되어 전체 조직의 40%가 넘는 분들께서 스터디에 참여해 주셨고, 지금도 스터디는 진행 중입니다.
스터디 진행
처음에 스터디의 진행은 구체적인 커리큘럼을 만들지는 않았어요. 큰 주제만 생각해서 필터하는 방법, 단일행 함수, 다중행 함수, 조인, 서브쿼리의 순서로 데이터를 추출하실 수 있게 도와드리고 마지막에는 BI 대시보드를 활용하여 데이터를 확인하실 수 있게 지원해 드리고 싶다고 생각했습니다.
BI 대시보드가 궁금하시다면
스터디는 매주 한 시간 정도의 점심시간을 활용하였고, 공휴일을 제외한 매일 아침에 그 주에 배우고 손수 익히셨던 쿼리들을 상기하실 수 있도록 문제를 하나씩 만들어 드렸습니다. 매일 해왔던 것을 떠올리는 방식이 쿼리를 익히는데 가장 좋은 방법이라고 생각했습니다.
매일 문제를 공유드렸어요
스터디 진행 단계
쿼리를 처음 만나는 시간
쿼리에 두려움이 많으신 분들을 위해 첫 시간은 화면 설명과 쿼리에 대한 자신감을 만들어가실 수 있는 시간으로 채웠습니다.
처음 나가는 진도는 너무나도 만족해 해주셨습니다.
첫 시간을 들어주시고 데이터 관련 업무를 모두 팀 내에서 진행하겠다고 말씀 주신 팀장님도 계실 정도였어요.
스터디의 진행은 오라클의 사원 학습용 테이블로 진행하였습니다.
선정한 이유는 단순하게 인터넷에 자료가 많았기 때문이었습니다. 유명한 데이터로, 개인적으로 학습하기에도 좋고 나중에 다시 찾게 되더라도 수월하게 많은 자료를 찾을 수 있을 것 같다는 판단이 있었습니다.
처음 만나는 쿼리는 가장 기본적인 형태부터 설명해 드렸어요.
예약어인 FROM 절과 SELECT 절을 설명해 드리고 원하는 데이터를 어떤 예약어를 통해서 가져와야 하는지, 원하는 컬럼들은 어떻게 작성해야 하는지, 컬럼 사이를 구분하는 구분자와 SQL 쿼리에서 사용하는 특수기호들에 대해서 공유해 드리는 부분부터 시작했습니다.
또한 쿼리는 머리로 많이 아는 것보다 피아노를 치거나 자전거를 배우듯이 몸으로 습득해 나가는 게 제일 좋다고 생각하고 있었기 때문에, 스터디는 개념 설명과 실습의 비율을 동일하게 주어 진행하려고 노력했습니다.
필터와 연산자, 스키마
이렇게 첫 시작을 마쳐주신 분들께서는 쿼리 작성에 즐거움과 흥미로움을 많이 가져주셨습니다. 물론 앞으로 많은 오르막길이 있다는 것은 설명해 드리지는 않았어요.
WHERE 절 필터로 필요한 행을 추출하는 방법을 소개해 드리면서 데이터의 문자열과 숫자, 날짜 타입과 해당 타입의 데이터를 추출하는 방법을 같이 소개해 드렸습니다. 이미 엑셀과 스프레드시트로 많이 단련되신 분들이셨기 때문에 관련 개념은 어렵지 않게 이해해 주셨어요. 논리 연산자로 필요한 데이터들을 추출할 수 있도록 연산을 추가하는 방법도 함께 소개해 드렸습니다.
WHERE 절에서 활용할 수 있는 다양한 예약어들을 소개해 드리며 실습을 함께 진행했습니다. 중간중간 컨벤션에 대한 설명도 함께 드렸습니다. 쿼리로 커뮤니케이션할 때 가장 중요한 부분이라고 생각하고 있기 때문에 놓치고 싶지 않았습니다. 또 지치시지 않았으면 하는 마음에 힘들 때는 지금까지 알게 된 정보들을 공유해 드리면서 잘 성장하고 계신 부분들은 적극적으로 어필하였습니다.
첫 번째 언덕, 단일행 함수
단일행 함수 역시 엑셀과 비슷한 부분이 많아서 엑셀과 비교하며 말씀드렸습니다. 이미 저장된 데이터를 검색해서 가져오는 개념이 아닌 데이터를 원하는 형태로 변경하고 입맛에 맞게 출력하는 개념을 설명하는 부분이 어려웠던 것 같습니다. 그런데도 엑셀의 함수를 사용해서 데이터 조작 경험이 있으셨던 분들께서는 수천만 행이 넘는 데이터를 조작하거나 파싱하여 추출 결과를 확인할 수 있다는 부분에서 항상 많은 관심을 많이 가져 주셨습니다.
단일행 함수는 컬럼의 데이터 유형을 알고 있어야 활용할 수 있었기 때문에 관련 개념에 대해서 다시한번 설명해 드리면서 해당 파트 스터디를 시작하였습니다.
또, 단일행 함수는 함수의 수가 많고 암기 형태로 외우는 것은 의미가 없다고 생각하고 있었기 때문에, 각 유형에 해당하는 주요한 함수만을 소개해 드리고 필요하다고 생각하는 함수가 있다면 인터넷에서 검색하거나 채널에서 공유하여 찾아보는 것이 좋을 것 같다고 안내해 드렸습니다.
•
조건문 : IF, CASE
•
문자열 : CONCAT, LPAD, REPLACE, LENGTH
•
숫자 : ABS, ROUND
•
날짜 : EXTRACT, DATE
•
형 변환 함수 : CAST
스터디를 진행하고 나면 말씀드렸던 것처럼 채널을 통해 매일 문제를 제공해 드리고 문제를 풀어주시고 나면 DM으로 저에게 쿼리를 공유해주셨습니다. 이 방법은 다른 방법으로 풀 수 있지를 공유해 드리면서 저도 함께 배우는 시간이 되었습니다.
두 번째 언덕, 집계와 다중행 함수
GROUP BY와 HAVING절을 설명드리는 부분에서도 많은 어려움이 있었습니다. 저 역시도 쉽게 설명해 드리지 못하는 부분이 있었고, MIN, MAX, COUNT, SUM, AVG의 함수로 데이터를 조작하여 집계한다는 부분이 매우 생소하셨던 것 같습니다. 지금 생각하면 마음을 가라앉히고 잠깐 휴식하면서 천천히 다시 설명해 드렸으면 어땠을까 싶지만, 그때는 당황하여 말이 빠르게만 나갔던 것 같습니다.
이즈음부터 스터디에 집중하지 못하시는 분들도 점점 생겨났습니다. 스터디를 시작하고 한 달 반 정도 되어가는 시점이라, 업무 우선순위에 밀려 스터디를 진행하지 못하시는 분들이나 휴가를 다녀오셔서 달라진 진도에 흥미를 다시 붙이지 못하시는 분들도 계셨습니다. 이런 경우는 따로 시간을 내어 스터디 참여하지 못한 분들을 모아 스터디를 보충하거나 슬랙 채널을 적극 활용하였습니다. 그리고 스터디를 시작할 때 처음부터 리뷰를 한번 드리고 시작하게 되었어요.
조인과 서브쿼리
좋아하는 짤입니다
조인 부분은 총 5가지 개념(INNER, LEFT, RIGHT, FULL OUTER, SELF JOIN)을 설명드렸어요. 두 테이블을 키 관계를 확인해서 하나의 줄로 표현할 수 있는 부분을 설명해 드렸고, 키 관계에 따라서 DEPT 테이블을 활용한 EQUAL 조인과 SALGRADE 테이블을 활용한 NON EQUAL 조인 부분을 설명해 드렸습니다. 스프레드시트를 활용하여 조인이 어떤 방식으로 이루어지게 되는지 데이터를 하나씩 추가해 가며 설명해 드렸을 때 가장 빠르게 이해해 주셨던 것 같아요.
서브쿼리에서는 차례대로 WHERE절 서브쿼리, FROM절 서브쿼리, 스칼라 서브쿼리 순으로 설명해 드렸습니다. 서브쿼리는 실제로 어떤 경우에 많이 사용되는지 사례를 들어가며 소개해 드렸고 조인과 함께 많은 문제를 드리고 익숙해지실 수 있게 가장 많이 신경을 쓴 것 같습니다. 서브쿼리까지 설명해 드리고 난 후 분석할 때 많이 사용되는 WITH절 예약어까지 함께 설명해 드렸습니다.
마지막으로 UNION 함수까지 소개해 드리고 기초가 되는 쿼리 문법은 모두 설명해 드리게 되었어요.
윈도우 함수
윈도우 함수의 경우에는 가장 잘 설명해 드리고 싶고 매우 욕심나는 부분이었습니다. 윈도우 함수를 잘 활용하면 데이터를 활용하는 부분에서 원하는 형태로 데이터를 무리 없이 만들 수 있다고 생각하기 때문이었습니다.
생소할 수도 있는 부분인 LEAD OVER, LAG OVER 함수를 설명해 드리면서 해당 부분이 사용자 행동 로그를 활용하여 사용자의 유입 시점이나 이탈 시점을 파악하고 퍼널의 단계를 직접 설정하여 쿼리 할 수 있는 함수라고 말씀드렸습니다.
MIN, MAX, COUNT OVER 등의 함수로 원하는 데이터를 집계하고 FIRST_VALUE OVER, LAST_VALUE OVER의 함수로 데이터를 원하는 지점에만 데이터를 만드는 부분까지 설명해 드릴 수 있었습니다.
스터디의 마무리
3개월 정도가 지나자, 기본적인 쿼리의 문법은 거의 모두 설명해 드렸다는 생각이 들때쯤, 갑작스럽지만 한번 끊어가야 할 것 같다고 생각하게 되었습니다. 아래의 3가지 이유였습니다.
•
큼지막한 개념들은 모두 소개해 드려서 다음 주에 소개해 드릴 만한 내용이 생각나지 않는다.
•
이제는 쿼리를 응용하여 원하는 데이터를 출력하는데 많은 시간을 투자해야 할 때인 것 같다.
•
스터디 구성원분들의 집중력이 갈수록 급격하게 낮아지고 있다.
관련해서 더욱 다양한 데이터를 활용하여 쿼리 해볼지 생각도 했지만, 다양한 도메인의 스터디원 분들께서 모두 집중할 수 있는 주제를 찾아내기가 쉽지 않았습니다.
마지막 과제
이런 고민을 스터디 운영을 도와주시는 새롬님과 함께 나누었고, 마지막인 만큼 의미 있게 마무리할 방법을 생각해 내 주셨습니다. 바로 스터디를 졸업하는 느낌으로 마지막 과제를 수행하는 것이었어요. 졸업 과제는 쿼리하여 얻은 집계 결과를 BI 도구를 연동하여 대시보드를 구축하는 것이었어요. 차주 스터디 시간에 졸업 공지와 함께 BI 도구의 사용법을 간단하게 공유해 드렸습니다. 이미 쿼리에 익숙해져 계셨기 때문에 1시간 정도로 많은 기능들을 소개해 드릴 수 있었어요.
보름 정도의 기간을 두고 업무와 관련된 대시보드를 직접 만들어주셨고, 처음 대시보드를 만들면서 어려운 부분이 있다면 함께 만들어가며 직접 하실 수 있도록 지원해 드렸습니다. 그 결과 스터디 이전에는 데이터에 접근도 어려워하셨던 분들이셨는데 스터디 이후에는 직접 대시보드에 활용되는 집계 데이터를 추출하고 매일 자동으로 업데이트된 데이터를 확인할 수 있게 대시보드를 개발하여 업무에 활용하고 계십니다.
회고
대시보드를 각자 만들어주고 계신 와중에 스터디를 마무리하는 겸 해서 회고를 진행하게 되었습니다. 3개월 반 정도의 스터디 기간에 좋았던 점, 아쉬웠던 점을 함께 공유해주셨어요. 좋았던 점은 전반적으로 숙제와 좋은 분위기를 이야기해 주셨습니다. 좋은 분위기를 위해서 한 분 한 분 신경 써주신 부분들이 생각나서 너무 감사했습니다.
좋았던 점
아쉬웠던 점에 대해서도 많은 의견을 남겨주셨습니다. 스터디 전체 오버 뷰를 충분히 공유해 드리지 못한 것 같아 아쉬웠고, 스터디 후반부에는 속도 조절에 실패한 것 같다는 생각도 들었습니다.
개선점
이렇게 좋은 분들 덕분에 회고까지 잘 마무리하게 된 것 같습니다.
요즘은 새로운 분들과 2번째 스터디를 마무리하고 3번째 스터디를 추가로 진행하고 있습니다.
회고에서 말씀 주신 부분대로 아쉬웠던 부분이 있었지만, 즐겁고 의미 있는 마무리였다는 생각이 들었습니다. 소중하게 작성해 주신 의견들은 아이들나라의 더 좋은 문화를 만들 수 있는 밑거름으로 사용될 것이라 믿습니다.
긍정적인 변화
스터디에 참여해 주신 분들이 많아지면서 서로 좋은 영향을 주고받고 있다는 생각이 들었습니다.
아이들나라의 리더분들께서 분위기를 이끌어주셨고, 팀장님들과 팀원분들이 만들어주시는 ‘스스로 해보고 싶은’ 분위기들이 모여서 스터디가 만들어지고 2차, 3차의 스터디가 생겨난 것 같습니다. 이러한 기조가 이어져서 선순환 구조가 만들어졌으면 좋겠다는 생각이 들었습니다.
데이터를 직접 추출하는 방식으로 대화하며 커뮤니케이션 비용이 감소하길 기대하고 있습니다. 데이터를 추출하기 위한 설명들이 쿼리의 예약어나 추출의 개념으로 짧게 설명이 가능하게 된다면 전체적인 비용이 많이 감소하게 될 것으로 생각하고 있습니다. 개인적으로는 이미 쿼리 추출과 관련된 부분을 설명해 드리면서 경험하고 있습니다.
데이터 요청 방식이 변화하기를 기대하고 있습니다. 단순 집계 요청 혹은 쿼리에서 단순한 에러가 날 때 요청으로 발생하는 비용들이 감소하고 쿼리 리뷰를 통해서 쿼리가 잘 짜여졌는지 함께 논의하는 시간이 많아졌으면 좋겠습니다.
데이터 생성 단계에서부터 데이터가 쌓이고 저장되는 방식을 모든 구성원이 이해하고 데이터를 집계하는 부분까지 함께 논의되고 더 좋은 방향으로 데이터를 생성하고 저장할 수 있는 다양하고 많은 논의들이 생기기를 기대하고 있습니다.
개발 단계에서부터 함께 데이터를 검증하고 개발이 완료되기 전에 피드백을 받아 더 좋은 구조를 만들어 나가는 더 작은 순환 구조가 생기기를 기대합니다.
마무리
아이들나라에 계신 모든 분께서 데이터로 문제를 해결하고 성장하는 데 많은 갈증이 있었던 것 같습니다. 데이터 레이크와 웨어하우스를 구축하면서 이 문제를 해결해 나가는데 도움이 되고 싶었습니다.
스터디를 진행하면서 부족한 부분도 많았고 새롭게 알게 된 개념들도 많았습니다. 개인적으로는 도전적인 역할을 수행했다고 생각했는데, 이러한 부분들이 매끄럽게 진행이 될 수 있도록 배려해 주신 팀장님들과 스터디를 함께해주신 분들, 관심 가져주신 리더분들께도 감사하다는 생각이 들었습니다. 앞으로 어떤 방향으로 진행될지는 모르겠지만 지금까지의 경험만으로도 저는 스터디와 아이들나라의 문화에 대해서 조금 더 깊이 생각하는 계기가 되었습니다.
스터디를 열정적으로 참여해주시는 분들과 함께 반년이 조금 넘는 시간을 보냈습니다. 스터디 이후에 SQL 자격증을 추가로 취득하시며 스스로 더 높은 곳을 향해 정진하시는 분들을 보면서 많은 자극을 받는 시간이 되기도 했습니다. 아이들나라가 오래도록 구성원 간 좋은 자극을 주고받으며 더 좋은 커뮤니티를 유지 강화해 나갈 수 있었으면 좋겠습니다.