환율, 원자재, WTI 등, 시장지표도 포함시켜 주세요.
위의 문장은 실제 고객이 요청한 내용이다.
나는 '차세대 트레이딩 플랫폼' 서비스를 만드는 백엔드 개발자이다. 우리 서비스는 주식과 가상화폐에 대한 시세 정보, 차트, 종목분석과 같은 투자에 유용한 기능들을 제공한다.
하지만 우리는 지수, 환율, 원자재 같은 시장지표는 아직 제공하지 못하고 있었는데 위에서 언급한 고객 요청사항처럼 양질의 정보를 고객에게 제공하기 위하여 시장지표 프로젝트를 진행하기로 했다.
이번 글은 내가 실무자로서 프로젝트를 어떻게 진행했는지, 그 과정과 배운 것을 정리한 회고글이다.
요구사항
나는 프로젝트의 목적을 다음과 같이 정의하고 목적에 맞게 요구사항을 세웠다.
<프로젝트 목적>
지수, 환율, 원자재 데이터를 제공하여 고객이 시장지표를 쉽게 확인하고 다양한 투자전략을 세울 수 있도록 돕는다.
<요구사항>
- 고객은 지수, 환율, 원자재 총 41개 지표에 대해 검색할 수 있다.
- 고객은 지수, 환율, 원자재 지표의 차트를 확인할 수 있다.
- 고객은 지수, 환율, 원자재 지표의 가격 정보를 확인할 수 있다.
프로젝트 결과
1. 고객은 지수, 환율, 원자재 총 41개 지표에 대해 검색할 수 있게 되었다.
2. 고객은 지수, 환율, 원자재 지표의 차트를 확인할 수 있게 되었다.
3. 고객은 지수, 환율, 원자재 지표의 가격 정보를 확인할 수 있게 되었다.
진행 과정
1. 프로젝트 시작은 기존 소스코드 '리팩터링'
프로젝트를 진행하기 전 기존 소스 코드의 맥락을 파악할 필요가 있었다.
하지만 그냥 코드를 들여다보기만 해서는 머릿속에 들어오지 않았다. 그래서 이번 프로젝트에서는 아이패드를 이용하여 다이어그램을 그렸다. 함수와 함수, 객체와 객체 간에 관계도를 그려내니 기존 소스 코드의 동작원리와 각각의 역할을 파악할 수 있었다.
파악을 한 후에는 내가 제대로 이해했는지 확인하기 위해 기존 소스코드의 순서나 변수명 등을 가독성 있게 바꾸며 리팩터링을 진행했다. 리팩터링에 대한 PR리뷰를 받으면서 내가 이해한 것이 맞는지 다른 작업자들로부터 확인을 받았다.
2. 검증이 필요한 데이터는 '스프레드시트'에서 관리
벤더사로부터 가져온 데이터가 올바른지 검증할 필요가 있었다.
이를 print 출력이나 DB에 저장하여 검증하는 것은 꽤나 번거로운 일이었다. 그래서 나는 가져온 데이터를 스프레드시트에 넣어두고 특이사항은 메모로 남겨 누가 보더라도 쉽게 데이터의 상태를 파악할 수 있도록 관리하였다. 또한 스프레드시트로 데이터를 관리하면 자체 함수를 사용하여 수천, 수만 개의 데이터도 빠르게 검증할 수 있어 효율적이었다.
PM님은 프로젝트 마무리 미팅에서, 스프레드시트 덕분에 데이터를 정확히 확인할 수 있었다는 긍정적인 피드백을 주셨다.
3. 새로운 기술은 'TIL'로 작성하며 연습
이번 프로젝트에서는 생소한 기술들을 많이 접했다. 몰랐던 Python 내장 모듈에서부터 외부 API, calendar 라이브러리, redis, Airflow 등 매일매일이 두려움의 연속이었다. 이러한 기술들을 곧바로 실무에 적용하고 테스트하기가 쉽지 않은데, 나는 따로 연습용 파일을 만들어 테스트해보고 직접 배우고 익힌 것을 TIL로 작성하며 기술들을 연습했다.
이렇게 했을 때의 장점은 해당 기술의 이해도가 높아지고 실제 프로젝트에 적용하는 데에도 용기?를 얻게 된다는 점이다. 단점은 그만큼 시간이 걸린다는 점인데.. 누군가는 기술을 따로 연습하고 글로 정리하는 시간이 아깝다고 생각할지 모르겠다. 하지만 나는 TIL과 같은 사전 연습이야말로 시행착오를 먼저 겪을 수 있기 때문에 개발 생산성을 높여준다고 믿는다.
이번 프로젝트 기간동안 내가 작성한 TIL은 다음과 같다.(아직 작성 중이거나 관련 없는 TIL은 제외)
2022.08.30 - [Dev/Library] - 파이썬으로 해외 증권거래소 개장일/휴장일 확인하는 방법
2022.08.27 - [Dev/Library] - Tenacity _ 예외가 발생한 함수를 다시 실행하려면?
2022.08.21 - [Dev/Library] - Click _ argument, option으로 인자 전달하기
2022.08.14 - [Dev/Debug] - Pytest _ mock 사용하여 테스트 코드 작성하기
2022.08.13 - [Dev/Library] - python-dotenv _ 환경변수를 .env 파일로 관리하기
2022.07.24 - [Dev/Library] - websockets _ Python 으로 비트코인 실시간 시세 가져오기 (feat. twelvedata)
4. 이슈는 '내용'과 '대처 방법'을 함께 공유
이번 프로젝트는 외부 데이터를 사용하기 때문에 특히나 이슈가 많았는데 나 나름대로 이슈에 대한 대응 지침을 정했다.
먼저 이슈가 발생하면 크기를 파악한다. 여기서 크기란 '나혼자 곧바로 해결할 수 있는 문제인가'. 아니면 '시간이 좀 걸리거나 타인의 확인이 필요한 문제인가'로 구분했다. 만약 크기가 큰 이슈라면 즉각 관련 채널에 내가 '파악한 상황'과 어떻게 하겠다는 '구체적 대처 방법'을 함께 공유했다. 공유 후에는 직접 원인을 찾아 문제 해결을 시도해보고 그래도 해결이 되지 않는다면 팀원들과 함께 논의하면서 해결책을 찾아내었다.
또한 이슈를 해결하는 과정은 모두 기록으로 남기려 했다. 기록으로 남기는 이유는 똑같은 실수를 반복하지 않고, 유사한 이슈에는 선례를 보고 빠르게 대응하기 위함이었다.
어려웠던 점
1. 도메인 지식 부족
도메인 지식이 부족하면 생산성이 크게 떨어진다.. 이번 프로젝트에서도 여실히 느낄 수 있었다. 나는 시장지표에 대한 지식이 없었는데 이들의 '심볼', '거래소의 특성', '시간대의 차이' 등을 구분할 수 있어야 했다.
이러한 도메인 지식은 직접 찾아보거나 기존 소스코드를 읽으며 익혀야 했다. 특히 시고저종(시가, 고가, 저가, 종가), 거래량, 실시간 tick, 분봉, 일봉 등의 개념을 이해하고 데이터를 가공하는 건 꽤나 머리가 아팠다.
그럼에도 좋았던 건, 실무를 통해 직접 부딪혀보면서 도메인을 배워나갔다는 점이다. 이번 프로젝트를 진행하면 할수록 우리 서비스에 대한 이해도가 높아짐을 느꼈다.
2. 벤더사 데이터 이슈
외부 벤더사를 통해 데이터를 가져오는 과정에서 예상하지 못한 데이터가 들어오는 경우가 있었다. 때문에 가져온 데이터를 정제하고 우리에게 맞게 가공하는 과정이 필요했는데, 처음에는 원인을 몰라 헤매는 시간이 있었다.
데이터 이슈를 효과적으로 관리하기 위해 모든 이슈는 기록으로 남기고 스프레드시트를 활용하여 데이터 검증을 하였다.
이번 프로젝트를 통해 외부 API를 사용하기 전, 예상 데이터가 정상적으로 들어오는지 꼼꼼히 체크해야겠다는 교훈을 얻었다. 나, PM, PO님은 이에 대한 대책을 마련하기로 논의했고 현재는 외부 API 사용에 대한 체크리스트를 작성하고 있다.
프로젝트를 마치며
좋았던 점
이번 시장지표 프로젝트는 우리 서비스에 직접적으로 영향을 주는 프로젝트이기 때문에 더 큰 책임감과 성취감을 느낄 수 있었다.
기술적으로는 websockets, redis, airflow 등 새로운 기술과 툴을 사용해볼 수 있었고, 외부 데이터를 받아 가공하는 로직을 짜는 것은 특히나 즐거운 작업이었다.
예상하지 못한 문제가 발생했을 때, 그 문제를 팀원들과 함께 고민하고 해결해나가는 과정에서 소속감과 유대감을 느낄 수 있었다.
아쉬운 점
물론 아쉬운 점도 있었다. 이슈를 관리하고 문제를 해결하는 것은 즐거운 일이었지만, 이 때문에 일정이 뒤로 밀리는 건 스스로에게 아쉬웠다.
프로젝트 킥오프 당시 전달받은 작업의 범위가 모호했는데, 해당 작업이 익숙하지 않은 실무자 입장에서는 ‘어디서부터 어디까지 작업을 해야할까?’ 라는 의문이 들었다. 앞으로는 킥오프 전에 프로젝트 내용을 미리 숙지하고 질문을 통해 의문점을 해소해야겠다.
앞으로도 프로젝트마다 회고를 남기려 한다. 내가 사용한 기술이나 지식이 아닌, 어떻게 문제를 정의하고 해결했는지 위주로 소개할 예정이다.
이상으로 시장지표 프로젝트 회고를 마친다!!! (... 해치웠나!?)
'나는 이렇게 일한다 > 업무' 카테고리의 다른 글
제약 이론을 통해 시스템 개선하기 (0) | 2024.08.19 |
---|---|
인앱결제 서버 구현 _ 플레이스토어 편 (1) | 2023.07.02 |
인앱결제 서버 구현 _ 앱스토어 편 (2) | 2023.06.18 |
저장소 패턴(Repository Pattern) 도입기 (0) | 2022.07.10 |