파일 버전 관리 시스템을 개발해보자.
엑셀로 시작한 회사일은 24,25,26 3년에 걸친 시간동안 내게 점점 더 어려운 문제들을 던져주었고, 엑셀에서 파이썬으로, 구글 클라우드 환경으로, 그리고 이제는 웹 서비스로 구동할 차례라고 판단해 프로젝트를 시작했다. 엑셀은 엑셀을 처음부터 다뤄본 사람이 db의 구조를 짜는데, 중간에 다른 분들이 해당 파일로 업무를 보다보면, 자동화를 할 수 없는 상태가 되기 일쑤다. 구글 클라우드 환경은 파이썬 기반이 아닌지라 내가 코드가 익숙하지도 않고, 어디까지나 구글 드라이브의 ‘spreadsheet’를 데이터베이스로 사용하며 자동화를 하기에, 엑셀과 같은 한계, 그리고 파일 in/out에 관한 실시간 기록이 구현하기 어려웠다(26살 초반에 시도했다). 주제가 무엇으로 바뀌든, 어떤 일이 벌어졌음을 기록하고, 이를 더 큰 db에 기록하는 일이 안정적이지 않았다.(‘실물 파일의 변동’과 ‘엑셀 시트에 기록된 정보’는 서로 확실히 맞물리기가 쉽지 않았고, 엑셀의 ‘한 행’에 모든 정보를 기록하기엔 1행 1열로 표현되지 않을 더 복잡한 기록들이 있었다.
그리고 27살 봄, 그동안 원래 하고싶었던 디자인을 공부하며 우연히 기획과 디자인을 익혔다. 27살 가을, 그동안의 일들보다 데이터베이스 자체도 복잡하고, 파일 이동과 업데이트가 더 잦은 프로젝트를 회사가 진행하며 생긴 문제들을 ‘사람’이 아닌 ‘시스템’이 감지하고 대응하고, 사람에게 보고하는 시스템을 만들기 위해 이 개인 프로젝트를 시작한다.
왜 개인 프로젝트일까?
내 욕심이다. 앞으로 프로젝트를 수없이 한다고 가정했을때, 처음부터 끝까지 혼자서 해볼 수 있는 유일한 기회라고 생각했다. 나 다 할줄 아는 사람이다. 라고 스스로 자부하고 싶기도 했다.
진행 기록
배포구현
시작부터 결과가 중요해서 배포를 가장 먼저 구현했다. 사실, 그동안 웹사이트를 전세계에 띄워보는 꿈이었다. 결국, 실제로 접속할 수 있는 사이트와 도메인을 구현하는데에 성공했다(1~3일차). 이 목표를 이루기 위해 작년부터 몇번씩 시도를 했었고, 적절한 과정을 거치지 않아 항상 실패했었다.
사실 디자인 부트캠프를 하며 우연히 코딩 과정을 살짝 들었고, 그때 heroku로 3시간만에 배포를 해서 굉장히 허탈했던 기억이 있다. 하지만 그 과정에서 내가 부족한 지식이 ‘네트워크’와 ‘컴퓨터 기초’라고 판단, 인프런에서 해당 강좌를 결제해 들으면서 copilot에 ‘가장 간단한 fastapi와 react앱 배포’라는 주제로 질문을 했고, 코드로 나온 답변을 따라하고, 필요한 도메인 구입, nginx 구동, https 인증, docker-compose 빌드 및 실행 등의 과정을 거치며 실제로 성공했다.
여전히 모르는 것 : 도커로 빌드를 할 때에 소스 디렉토리를 보면 다양한 폴더와 파일들이 서로 참조하고 있다. 도커는 빌드를 하며 어떻게 이들이 한 데 어우러져 한치의 오류도 없이 작동하도록 하는지 궁금하다. 디렉토리 구조 내 각 파일들이 무슨 역할을 하는지, 사실 코딩 이전에 그 역할이 왜 필요한지 알지 못한다. (router, index, model..)
파이썬 비즈니스 로직 고도화
굳이 웹서버를 개발하기 전에 지금 당장 회사에서 처리해줘야하는 로직을 짜고, 예외처리를 잘 구현하여 회사일을 먼저 수행했다. 하나의 기능을 담당하는 코드라도 예외처리를 제대로 주고, 클래스를 제대로 정의하고, try except와 raise error등으로 코드가 유하게 흘러가도록 처리하도록 해주었다. 나중에 해당 기능을 두고두고 사용하며 하나의 코드라도 제대로 작성하면 정말 좋은 자산이 된다는 것을 깨달았다.
MongoDB 공부
6~9일차에는 웹 서버에 엑셀을 달 수는 없으니 프로젝트 성격에 알맞는 MongoDB를 사용하는 법을 공부했다. 진짜 고통 그자체였다. 새로운 기능을 익히나, 어떻게 활용하는지가 매우 단편적으로 흩어진 채로 소개되어서 항상 새로운 것을 익히고 까먹는 청소기가 된 것 마냥 정신없이 진도를 나갔다.
fastapi 공부
10일차부터는 가장 자신있는 백엔드 부분을 공부했다. MongoDB에서 배운 데이터베이스 구조와 다양한 기능, transaction을 활용하기 위한 방법을 신경썼다.
특히 내가 개발하는 시스템이 특정 단계에 있는 소비자의 수요에 따라 작동하는 순서 중 어디에 개입할지를 판단하고, 소비자에게 요청을 받아 적절한 결과를 주는 역할을 한다.