CafeM0ca

[계획] 2023년 마무리 본문

카테고리 없음

[계획] 2023년 마무리

M0ca 2023. 12. 30. 03:14
반응형

子曰, 知之者不如好之者, 好之者不如樂之者(자왈, 지지자불여호지자, 호지자불여락지자: 공자가 말씀하시길, 아는것은 좋아하는 것만 못하고 좋아하는 것은 즐기는 만 못하다)

- 2022년 마무리 글에 썼던 논어 구절이다.

 

컴퓨터를 공부한지 80개월이 지났다.

1월

  • 작년 11월 25일에 백엔드 개발자로 입사하고, 22년도 12월에 간단한 텔레그램 챗봇 서비스를 만들었다.
  • 이후 1월부터 내부 서비스에서 사용되는 주민등록증, 여권, 운전면허증 인증 방식을 내재화 하여 비용절감을 목표로 솔로 프로젝트를 진행했다.
  • 1월에는 과외 학생을 모집하여 직장 다니면서 주말에 1회 프로그래밍 과외를 진행했다.

2월

  • 신분증 인증 서비스는 앞단에 API-gateway가 클라이언트의 요청을 받고 요청에 따라 주민등록증 / 여권 / 운전면허증 마이크로서비스로 서빙하는 방식이다. 통신은 gRPC로 구현했다.
  • 주민등록인증은 처음엔 20~30초정도, 여권도 20~30초, 운전면허증은 0.3초 이내의 응답속도를 보였다. 
  • chromedp를 사용하여 최적화를 진행한 결과, 주민등록증은 4초까지 응답속도를 개선했고, 여권은 1초~2초대까지 성능을 개선했다. 
    • 내가 글로는 쉽게 썼는데 클릭할 때 발생하는 이벤트 제어가 생각보다 정수리 뜨겁게 만들어서 야근도 조금 했다.
      • 덕분에 나는 웹 자동화 마스터를 해버렸다.
        • 나한테 간간히 티케팅 메크로 만들어달라고 요청이 오는데, 그게 얼마짜리 프로그램인줄 알고 그냥 만들어 달라는건지 모르겠다. 암표 사는게 더 싸다.
          • 그리고 만들기도 귀찮고 우리 부모님이 임영웅 콘서트 가보고 싶다고 평생 소원이라고 메크로 만들어 달라고 하더라도 나는 불속성 효자니까 안만들 것이다. 
          • 그러니 만들어 달라고 하지 말아다오. 
          • 정당하게 전국민과 반응속도 대결해서 표를 얻어라.
  • 주민등록증에는 자동화 방지로 문자열로된 캡챠를 풀어야한다.
    • 이를 해결하기 위해 captcha-cracker(https://wooiljeong.github.io/python/captcha-cracker/) 라이브러리를 사용하여 머신러닝 방식으로 캡챠를 풀려고 했다.
    • 뭐 어렵지 않게 캡챠 데이터 500개~1000개를 수집하고 학습 잘 시킨 다음에 캡챠 푸는 서버를 주민등록증 서버와 grpc 통신하도록 구현했다.

3월

  • 부하테스트를 진행했는데 chromedp 기반으로 돌아가다보니 복수의 요청을 한 컨테이너가 다 받아내지 못해서 응답속도가 지연되는 문제가 발생했었다. 이 문제는 각 인증 마이크로서비스의 레플리카를 늘려서 해결했다.
  • 프로젝트가 마무리될 쯤 운전면허증 서비스가 로직이 바뀌어서 캡챠가 추가되었다.
  • 나는 AI 엔지니어가 아니다. 그냥 CNN이랑 ReLu함수나 역전파 같은 키워드만 조금 들어본 정도다.
  • 개편된 운전면허증 서비스는 캡챠가 추가 되었다. 그런데, 주민등록증 캡챠는 흑백이라 라벨링(컴퓨터한테 정답을 알려주는 행위)만 잘 하면 정확도 99%가 나왔는데 이번 캡챠는 컬러풀해서 학습데이터는 2000개를 라벨링해도 정확도가 안나왔다.
    • 나는 이 문제를 해결하기 위해 컬러풀한 문자열 이미지에서 컬러를 빼버리기로 결정했다.
    • Mac 터미널 환경에는 컬러 뺴주는 명령어가 내장되어 있는데 컬러풀한 캡챠 이미지를 input로 넣으면 쉘스크립트로 흑백으로 만들어서 output으로 뱉어주면 된다.
    • 문제는 캡챠 서비스가 컨테이너에서 돌아가다보니 linux 환경에 맞춰야 하는데, 해당 명령어는 내장되어 있지 않아서 컨테이너에 imagemagick 툴을 설치해줘야한다.
    •  도커에서 imagemagick을 설치하는건 어렵지 않다. wget으로 다운로드하고 압축풀고 install하면 알아서 설치하기 때문.
    • 하지만 나는? 도커를 최대한 가볍게 만들어서(우리 실장님이 '마이크로서비스는 가벼워야한다' 주의. 나 또한 동의) 빌드시간을 최대한 줄이고자 multi-stage build 방식으로 imagemagick를 설치하는데 꽤 많이 고생했다.
      • 이것도 정수리가 살짝 뜨거웠던 걸로 기억한다. ㅋㅋ 근데 내가 이겼다.
    • imagemagick을 설치하고 컬러풀한 이미지를 흑백으로 만들어주니 기가막힌 인식율을 보여주며 운전면허증 인증 서비스도 '해치웠다'.

4월

누가 '해치웠나?' 소리를 내었는가?

  • 3개월이나 걸려버린 신분증 인증 프로젝트는 사실 드랍되었다. 그 이유는 다음과 같다.
    • 운전면허증 사례처럼 사이트가 개편될 경우 매번 로직을 수정해야하는 문제
    • codef가 스크래핑 기술이 미쳤다는 점. 내가 못이기겠더라. 
      • 정부기관 사이트에는 라온시큐어에서 개발한 각종 보안 프로그램이 철통성마냥 지키고 있는데
      • codef는 그 떡칠된 프로그램을 어떻게 잘 우회하더라. 나는 3개월만에 그 수준까지는 도달하지 못했다.
      • 나는 내 친구가 라온시큐어에 있기 때문에 자주 생각났다. (보고있니 친구야?)
    • 또한  codef에서 제공하는 신분증 인증 서비스를 돈 내고 사용하는게 내 인건비보다 저렴했다.
      • 운전면허증은 codef보다 성능이 좋았고, 여권은 codef와 비슷했지만 실제로 우리나라에서 가장 많이 사용하는 인증 방식은 주민등록증인데 코드에프한테 졌다.
        • 최종 최적화 때는 내가 주민등록증 2.5초까지 최적화를 진행했었다.
        • 쓸만은 하지만 잦은 변동에 따른 인건비가 감당이 안되기 때문.
  • 이후에는 블록체인쪽에 투입되었다.

5월

  • USDT라는 미국 달러랑 1:1 가치를 가진 토큰이 있다.
  • 나는 USDT 토큰의 출처를 파악하기 위한 코인판 AML(Anti Money Laundering)을 개발에 투입되었다. 
  • USDT는 블록체인 데이터라 과거 트랜잭션이 존재한다. 당시 기준 12억건의 블록체인 트랜잭션이 존재했다.
    • 블록체인 네트워크와 통신할 수 있는 API가 제공되는데 12억건이 작은 데이터 처럼 보이는가??
      • API가 초당 수십~수백건의 transaction 데이터를 응답하는데 어림도 없다.
  • 그래서 원장 데이터를 수집하기로 했다.
    • 근데 앞서 API가 많아야 초당 수십~수백건이라 하지 않았는가? 
    • 단순 계산으로 1,200,000,000 / 100 = 12,000,000초(=3,333 시간 = 138일)가 걸린다.
    • 그러니까 원장 데이터 수집만 138일이나 걸리는데(당시 계산했을때는 2년이었다.), 우리팀 실장님이 AWS에 인스턴스 40개 돌려놔서 서버비 50만원으로 2주만에 수집을 완료했다.

6월

  • 원장 데이터를 수집했으니 이제 트랜잭션의 출처를 역추적 하면 된다!
    • 여기서부터가 머리가 뜨거워졌다.
    • 이해하기 쉽게 당신이 부모님한테 용돈 10만원을 받았다. 이 용돈 10만원의 흐름을 알아보자.
      • 부모님은 각자 노동소득, 사업소득, 기타소득을 합친 재산중 10만원을 당신에게 준 것이다.
      • 따라서 10만원은 노동소득에서 나왔을 수도 있고, 사업소득에서 나왔을 수도 있고, 기타소득에서 나왔을 수도 있다.
      • 어디서 나왔는지 모르니 일단 다 추적해야한다.
      • 어머니와 아버지가 맞벌이로 월급을 받는다면, 10만원은 각각 월급에서 나왔을 수도 있다. 
      • 그럼 그 직장에서 10만원은 단기 예금 이자일 수도, 아니면 거래처 납품 대금일 수도 있다.
      • 단기 예금이면 은행이 누구한테 대출해주고 받은 이자인지를 조사해야하고, 거래처 납품 대금일 경우 거래처는 누구한테 돈을 받았는지를 조사해야한다.
    • 이렇게 자금이 닿았던 모든 곳을 되돌아 올라가다보면 원화의 경우 한국은행이 나오게 된다.
      • 그럼 몇 Depth를 타고 올라가야 한국은행이 나올까? 정답은 모른다! 그러나 최초가 한국은행이라는 점은 안다.
    • 연말 회고록이니 지금부터는 짧게 요약하겠다.
    • 아무튼 USDT 역추적의 목표는 이 USDT가 어느 거래소에서 튀어 나왔는지를 아는게 목표였다.
    • 10억건의 데이터가 담긴 DB에 출처 금액만큼 역추적하게 될 경우, 1Depth올라갈 때 마다 기하급수적으로 늘어난다. 그럼 DB에 SELECT절로 질의하게 될 테니까 장담하건데 이 글을 보는 모든 사람의 수명을 더한 시간만큼이 흘러도 역추적이 끝나지 않는다. 
    • 아무튼 그래서 table full scan하는건 매우 매우 매우 비효율적이라 나는 DB 쿼리 성능튜닝을 1주일간 공부했고 한번 실행에 60분과 10분이 걸리던 쿼리는 각각 10분과 5초로 줄였다. 
  • 요약하면 10억건 이상의 데이터가 든 DB를 인덱싱하고 쿼리 튜닝을 적절히 해서 드라마틱한 성능개선을 이뤄냈다는 것이다.
    • 조금 더 나아가면 파티셔닝과 캐싱레벨까지 할 텐데...
  • DB성능튜닝이 끝난 이후에 평화가 오는 듯 했지만 추적한 결과를 시각화 하는 작업이 남았다.
    • 여기서 또 머리가 뜨거워진다.

7월

  • 어차피 끝까지 역추적하는건 불가능하니, 특정 depth까지만 역추적하도록 구현은 했다.
  • 자 그럼 그 방대한 데이터를 아래와 같이 시각화 해야한다.

왼쪽 데이터를 오른쪽 처럼 depth별로 선이 꼬이지 않도록..

  • 이걸 layout algorithm의 한 일종인데 이것 때문에 정수리가 핫했다.
  • layout algorithm에 해당하는 여러 알고리즘은 O(n)이나 O(nlogn)이 절대 안나온다. 그래서 매우 느리다!
    • 웹브라우저에서 JS로 렌더링하니까 원래 느리던놈이 v8엔진 위에서 팔짝팔짝 뛰어봐야 얼마나 빠르겠는가?
  • C++로 수기야마 알고리즘 사용하여 전처리한 결과를 프론트로 넘겨주는 방식으로 랜더링 하는 방식으로 애초에 알고리즘이 느려터져서 그 또한 오래걸렸다.
    • 뭐 GPU로 최적화하는 방법에 관한 논문도 있었지만 시도할 용기와 시간이 없었다.
  • 내가 찾은 가장 이상적이라 생각한 것은 노드를 압축해서 하나로 표현하는 방법이다.
  • 이를 위해서 neo4j와 같은 그래프 데이터베이스 종류를 사용해야했는데, 이미 10억건 DB 쿼리 성능튜닝과 layout algorithm으로 정수리가 뜨거워질대로 뜨거워진 나는 자신이 없어서 적절히 흐름은 볼 수 있는 수준으로 구현을 마무리 했다.

8월

  • 이때부터는 퇴사하고 창업을 할 생각을 갖게 되었다. 회사가 가는 길과 나의 길이 틀어졌음을 느꼈기 때문이다.

9월~12월

  • 퇴근하고 창업준비 했다.
  • 12/29일이 퇴사일인데 이날 회사에서 병특 T.O가 3개 나왔다. (말이 되나?)
    • 물론 11월말에 퇴사 통보해서 나는 병특에 별 관심이 없다.
    • 미친놈인가 싶지만, 그렇다. 나는 평범한 사람과 다른게 좋다.

기타

  • 5년짜리 Q&A 다이어리를 쓰기 시작한지 5년차가 되었다. 19살 12월때부터 썼던게 벌써 1년만 더 쓰면 완결이다.
    • 산업기능요원(언제 될지 모른다)
      • 퇴사날에 T.O 3개가 나왔지만 나는 병특을 포기했다. 창업하려고. 
    • 영어/일본어 공부
      • 이건 좀 해야겠다.
    • 그랜드하프 사서 flower dance 완곡하기
      • 하프 안친지 6개월되어서 사랑의 인사 말고 못치겠더라.
    • 부동산 공부
    • 골격근량 40kg찍기
      • 찍었다.
    • 대학 (사실 잘 모르겠다)
    • 알고리즘 공부
      • 안할거다. GPT한테 풀어달라고 할거다.작년에 적었던 장기 계획이다.

 

子曰, 知之者不如好之者, 好之者不如樂之者(자왈, 지지자불여호지자, 호지자불여락지자: 공자가 말씀하시길, 아는것은 좋아하는 것만 못하고 좋아하는 것은 즐기는 만 못하다)

첫 직장의 월급이 290만원대였고 내가 아는걸로 돈을 벌었다.

7개월만에 퇴사하고 내가 좋아하는 것을 하기 위해 연봉 1xxx만원을 삭감하면서 이직했다.

그리고 13개월만에 퇴사하고 나는 내가 즐길 수 있는 일을 하기 위해 이제 창업에 도전한다.

 

창업에 도전한다고 주변에 말했을 때 감사하게도 비아냥은 없던 것 같고 응원이 많았다. PT샵 센터장님부터 브런치카페 사장님, 친구들, 소마 동기분들, 42 동기분들, 고모...그리고 우리 아빠. 주변에 좋은 분들이 많아서 참 좋다.

 

12/30일 새벽 3시 작성

 

P.S 12/29일이 퇴사날이자 종무식이라 술 좀 마시고 글을 썼다. 양주 글라스로 4잔 원샷해서 글에서 술 냄새가 좀 나는 것 같다. 뭐 글이 꼭 간결해야하나. 일기장처럼 쓰는건데 정철마냥 쓰는거지.

P.S 2 나 탈 개발자 한다. 이제 창업가 할래!!!

반응형
Comments