플랫폼/데이터 엔지니어링 과제 풀이 (Prologue-문제 그리고 구상)

반응형

일단 데이터 관련해서도 직무가 크게 데이터 분석이랑 엔지니어링 있습니다. 둘이 하는 일이 아예 다른데 분석은 주어진 데이터를 지지고 볶아서 어떤 인사이트를 내는거고 데이터 엔지니어링은 데이터 분석, AI 모델링, 의사결정에 필요한 데이터를 안정적으로 수집, 저장, 처리, 변환하는 시스템(파이프라인)을 설계 및 구축하는거임. 그리고 내가 이력서 준비한거나 부트캠프 들었던건 다 분석쪽인데... 오 여기 근무조건 개꿀 이러고 이력서랑 포폴 냈던 직무가 엔지니어링인겁니다. 

 

그러니까 데이터 분석 이력서랑 데이터 분석 포폴로 데이터 엔지니어링 직무에 냈는데 서류합격을 해서 과제를 받고 오늘 새벽 3시까지 해서 제출 완료한겁니다… 예… 둘이 하는 일이 아예 다르잖아요? 해보니까 분석이랑 엔지니어링이랑 둘이 공통점은 파이썬을 쓴다밖에 없는거같음. 물론 분석쪽에서도 전처리를 하긴 하는데 보통은 결측값이나 이상치같은거 분석하기 전에 쳐내는거지 이렇게 본격적으로 한 적은 없었음… 물론 쳐내고 다듬을게 많아서 골아팠던 적은 있습니다만.

 

니콜라스형... 미안...ㅋㅋㅋㅋㅋㅋ

그래서 메일 받고나서 본인 표정은 이거였음. 사측에서도 내 이력서 보고 저 표정 지었을거임... 솔직히 두 직무가 뭔 차인지 몰라서 오 근무조건 개꿀 하고 넣은거긴 한데, 그렇다고 해서 또 과제를 대충 할 순 없잖아요? 그러니까 풀라고 준 건 최대한 성심성의껏 풀었음... 하던게 아닌것도 있고, 아예 처음 보는것도 있어서 아마 사측에서 깃헙 보면서 이건 또 뭐여 하고 계실겁니다...


과제를 제출하고 문의 메일을 보냈을 때 회사명이랑 문제를 공개해도 된다고 답변을 받았습니다. 근데 사실 허락을 받았어도 회사명은 원래 공개 잘 안해서… 문제도 100% 공개하는 건 아니고 큰 틀만 공개할거임.

 

문제

Step 1. 이벤트 생성기 작성

Python, Go, Java 중 하나를 이용해 웹 서비스에서 발생할 수 있는 이벤트를 랜덤하게 생성하는 스크립트를 작성하는 것. 단, 이벤트는 최소 두가지 이상이어야 한다.

Step 2. 로그 저장

생성한 이벤트를 본인이 적합하다고 생각하는 저장소에 자유롭게 저장할 것. JSON을 통째로 저장하지 말고, 필드를 구분하여 저장해야 한다. (JSON: 그 파이썬 딕셔너리같이 생긴거 있음)

Step 3. 데이터 집계 분석

저장된 데이터를 분석하는 쿼리(또는 코드)를 최소 2개 작성할 것. 아래 예시에서 해도 되고, 다른거 해도 된다. 

 

1) 이벤트 타입별 발생 횟수
2) 유저별 총 이벤트 수
3) 시간대별 이벤트 추이
4) 에러 이벤트 비율

Step 4. Docker로 실행 가능하게 만들기

docker-compose.yml을 작성해서 docker compose up 한 번으로 전체 스택이 실행되게 구성할 것. (앱+DB까지)

Step 5. 결과 시각화

SQL 집계 결과를 시각화하면 됩니다. 차트 생성해서 그걸 이미지로 저장하거나 BI툴(태블로)을 쓰거나 편한걸로 하시면 됨.


이게 문제인데… 일단 보자마자 대뇌 커널패닉이 온 것도 있고… 문제가 하나 더 있었음. 제가 몇 번 얘기하지 않았습니까? 리눅스 노트북이 할배노트북이라(램 8기가임…) 분석 돌리다가 뻗는다고… 윈도우에도 파이썬이 깔려는 있는데, 딱 백준 풀 용도로 파이썬만 깔아둔거라 넘파이 판다스 폴라스 플롯틀리 이딴거 하나도 안 깔려있다. 그래서 JS는 윈도우에서 하고 파이썬은 리눅스에서 돌렸다가 컴퓨터 사양 문제로 스톱했어요… 맥북은 집으로 갔고.

 

그니까 선택지가 할배노트북에서 사리적립하면서 하기 vs 게이밍 놋북(윈도)에서 최소한의 설치만으로 진행하기 두개였고 데드라인이 3일이라 나는 후자를 골랐음. 그래서 이거 도커 돌리면서 까는거 딱 하나 있습니다. matplotlib. SQL 돌리긴 돌리는데 SQLite는 파이썬 깔 때 딸려오는 친구라 별도로 설치는 안 해도 됨. 근데 내가 예전에도 한번 얘기했던... 이놈들 표준을 합치긴 했는데 그럼에도 불구하고 지네들꺼에만 되는 기능이 있다고 했죠? 오라클의 롤업 큐브 그루핑셋 이런거. 그런게 SQLite에도 좀 있으니까 문법은 한번 찾아보십셔... 합칠거면 아예 통일하든가 해야되는데 이놈들이 논의를 어떻게 한 건지 모르겠음.

 

아무튼 그래서 사만팔천가지 모듈이 다 깔렸지만 돌리다가 뻗을지도 모를 리눅스는 나중에 도커 패킹한거 테스트하는 용도로만 썼습니다. 도커 얘기는 나중에 또 털어드리겠음…


서비스 구상

서비스를 구상하는 과정에서도 뭐하지… 하다가 그래도 많이 접했던+익숙한거 하는 게 좋을 것 같아서 ChEMBL같은 데이터베이스로 하자 했음. 내가 개인적으로 다뤄봤던 데이터는 캐글 데이터 말고는 NCBI 창고 탈탈 털어서 DNA 이런거 가져온게 다였음… 그리고 마케팅 이런쪽은 아예 문외한이라(본인 뼛속까지 이과) 전에 팀플할때도 GA4 다루면서 진짜 스트레스 엄청 심했거든… 쇼핑몰 이런게 무난하긴 한데 내가 그런거 잘 몰라서 놓치는 부분도 분명 있을거란 말이죠. 그래서 DB로 하자! 하고 정했다. 그리고 웹 서비스에서 발생할 수 있는 이벤트라고 했지 뭐 하라고 딱 정해주진 않았잖아요?

 

데이터베이스에서 이벤트를 뽑아낼 수 있냐고? ChEMBL에서는 일단 1) 검색하고 2) 결과 보고 3) CSV파일로 받는것만 해도 3개 나온다. 거기다가 하나 더 추가해서 개별 화합물 정보 조회까지 하면 일단 네 개 나온다. 근데 이 이벤트를 그냥 막 갖다가 생성하면 안된다. 이 이벤트들에는 일련의 규칙들이 존재해야 한다. 생각해봐요. 화합물 검색도 안 했는데 CSV부터 받을거임? 검색 결과 띄우다가 502떴는데 CSV파일 다운로드가 되겠어요? 안됨. 이런 일련의 규칙들을 정해야 하고, 생성할 때 저장할 데이터들도 정해야 한다. 모델링 드가자 

 

Rule

1. 각 아이디는 6자리 정수형으로, 6자리가 안 될 경우 앞에 비는 만큼 0으로 채운다. (예: 1234->001234) 단, 저장할때는 걍 저장함.
2. 화합물 정보 확인, 검색 결과 조회, csv 다운로드는 검색이 반드시 선행되어야 한다.
3. 같은 검색 아이디 내에서 csv 다운로드는 한 번만 하는 것으로 한다. (보통 필요한 것만 한번에 받죠...?) 단, 화합물 조회는 검색 결과가 여러개라면 여러 번 진행될 수 있다.
4. 같은 사용자가 여러 개의 화합물을 검색할 수 있다. 예를 들어서, 한 사용자가 아세트아미노펜과 이부프로펜을 검색할 수 있다. 물론 검색 결과와 후행 이벤트 역시 다른 검색 ID에 대해서는 별개이다.
5. 검색 ID가 같다면 검색어도 같다.
6. 에러가 생겼을 때는 이벤트 아이디와 검색 아이디, 유저 아이디, 이벤트 타입, 에러 타입만 기록된다.
7. 검색하다가 오타가 났을 경우, 결과 개수가 0이 된다.
8. 오타때문에 결과가 0이 됐을 경우, 결과를 확인하고 재검색한다.
9. 검색어별 검색 결과 개수는 항상 일정해야 한다.

 

원래는 6번까지 있었는데 구현하면서 7~9번이 추가됐다. 이 규칙들이 이렇게 놓고 보면 이게 뭐여 싶지만 사실 하나하나 보다보면 어 이거구나 할 것들이긴 합니다. 아이디... 사용자랑 검색 아이디는 6자리 되는데 이벤트 ID는 안되데...

 

화합물 정보 확인, 검색 결과 조회, csv 다운로드는 검색이 반드시 선행되어야 한다. ->검색했더니 이만큼 있더라를 보려면 검색을 먼저 해야 한다. 그리고 이만큼 있었군 하고 나서 개별 화합물 정보를 보거나(안 볼 수도 있지만) 정보를 받을 화합물을 선택하고 CSV 파일을 받는다.

 

검색 ID가 같다면 검색어도 같다. ->이건 3, 4, 5를 같이 설명해드림. 일단 3번... 물론 선택을 다르게 해서 다운로드를 여러번 할 수는 있겠지만, 기본적으로 여기서는 한 번의 검색당 한 번의 다운로드를 하는 걸로 정했다. 4번은 구글 검색을 예로 들어보자... 코바늘로 텀블러백 도안도 찾고 코스터 도안도 찾고 액막이 명태 도안도 찾고 할 수 있잖아요? 인공지능 크레딧은 한도가 있겠지만 검색은 하루에 하나만 되는거 아니잖음. 5번은 2번이랑 연결해서 보면 바로 이해가 되실건데, 일련의 이벤트들이 검색이 먼저 선행되어야 합니다. 그리고 A라는 유저가 이부프로펜을 검색하고(이부프로펜의 검색 아이디 생성) 이부프로펜의 결과를 보고 이부프로펜의 결과를 다운로드 받는거니까 한 사용자가 한 검색어에 대해서 진행하는 후행 이벤트의 검색어는 모두 동일하다.

 

7번~8번은… 사실 이건 생각 못 했던건데 구현하다가 추가했음… 여러분 젠타마이신은 gentamicin인 거 아십니까? 항생제는 대부분 어쩌고마이신 어쩌고실린 이렇게 끝나는데, 마이신 들어가면 보통 접미어가 mycin입니다. 반코마이신도 Vancomycin이고 카나마이신도 Kanamycin이잖아요. 근데 젠타마이신은 Gentamicin입니다. 이런 식으로 철자를 헷갈린다거나, 모 게임의 모 대장장이마냥 손이 미끄러진다던가, 키보드가 뻑난다던가 하는 등의 이유로 오타가 날 수 있잖아요? 그러면 결과가 제대로 안 나오니까(여기서는 결과 개수가 0) 뭐여? 아 철자 틀렸네 하고 다시 검색한다 이겁니다.

 

9번은 어떻게 보면 당연한거다. 누구는 이부프로펜 찾았는데 결과 100개 나오고 누구는 똑같이 이부프로펜 찾았는데 200개 나오면 안되잖아요? 그거다. 그래서 얘는 구현단에서 아예 검색 결과 수를 매핑했다.


스키마

콜아웃 배경을 노란색으로 해서 저런거니 양해 바람... 그리고 저 에러타입은 구현단에서 값 바뀐다.

 

이거 뭐 여기 들어오시는 분들은 대부분 뭔지 알테니까 기본적인 건 생략하겠음. AI는 Auto Increment의 줄임말이고(별도로 값을 써주지 않아도 자동으로 값이 증가한다), 따로 명시하지 않았지만 event_id는 PK(프라이머리 키)이기때문에 unique & !null이 추가로 붙는다. !null이 낫 널임. 저기 열쇠는 뭐냐고? 프라이머리 키라는 얘기다.

반응형