요즘 사용하는 stack 은 Python Flask + SQLAlsqlalchemy + Postgresql(+postgis) 이다. 기존 구현이 RubyOnRails + Mysql + elasticsearch 였다. 내가 지금 회사로 와서 Python 기반으로 변경 했다. (솔직히 내 처음 생각은 내가 그냥 Ruby 를 배우는 것이었다. ). 기존 구현들이 yaml 을 사용해서 Text Column 에 값을 저장한 경우가 많았다. 내가 이 것을 Postgresql 에서 지원하는 Jsonb 데이터 형으로 변경했다.  Yaml 내부 값 검색과 GIS 좌표의 거리 계산을 위해 elasticsearch  를 사용했는데, Jsonb 와 postgis 때문에 elasticsearch  를 사용할 필요가 없어졌다.

 이 이후 꽤 많은 구현이 Jsonb 를 이용했다. 뭔가 복잡한 데이터가 있을 때는 json 의 dictionary 형태를 그리고 array 형태가 필요할 때는 json 의 list 형태를 사용했다. 

그리고 오늘 Many to Many relationship 을 표시하기 위해 foreign key 형태의 Jsonb 를 사용했다. 그리고 깨달았다. 이건 좀 위험한 구현인 것 같다고. relationship  구현에는 기존 처럼 associative table 을 이용하는 형태로 구현해야 안전할 것 같다. 

 예전 부터 엑셀 같은 프로그램을 만들고 싶었다. 그래서 https://yiunsr.tistory.com/660  이런 프로그램을 만든 후 잘 변형해서 엑셀처럼 만들어 보려고 했었다. (저 프로젝트가 8년전이라니.) 

 얼마전부터 electronjs 를 가지고 만들어 보고 있다. 프로젝트 명은 lightsheet (https://github.com/yiunsr/lightsheet ) 이다. 

 

약간의 목표도 정하려고 하는데 개발할 때마다 한계에 부딪힐 때마다 목표가 바뀌고 있다. 현재 목표는 엄청난게 큰 최대 4GB CSV 파일 편집과 약간의 엑셀 함수지원이다. 아무래도 개발의 편의성을 위해 embedded db 를 사용하려고 하는데 sqlite3 를 생각 중이다. 그래서 현재 가장 많은 공을 들이고 있는 부분은 CSV 파일을 sqlite3 에 저장하는 방법에 대해 많은 고민 중이다.  하다보니 CSV 파일을 분석하는 것도 만만찮다. 파일 크기가 클 경우 CSV 파일을 array 로 만드는 것도  시간이 너무 걸려서 C를 이용해서 array 로 만드는 nodejs addon 을 만들고 있다. 뭔가 메인 일을 하는게 아니라 사이드 일을 더 많이 하는 것 같은 느낌이 있다.


이번 프로젝트는 좀 오래 해야 하는데. 

  요즘 엑셀 비슷한 CSV Viewer + 엑셀함수 가능한 스프레드 시트 를 개발 중이다. 

우선 1차 목표가 엄청나게 큰 (1GB 이상) CSV 파일을 편집할 수 있는 기능을 우선적으로 개발중이다. 이를 위해 levelDB를 이용하려고 한다. 메모리의 한계로 엄청나게 큰 CSV 파일을 열게 되면 파일 크기몇 배의 메모리를 사용하게 된다. 이 때문에 일시적으로 데이터를 저장하려고 하는데 이 때 levelDB를 사용하려고 하는데 snappy 압축을 적용할 수 있다. 그러다 snappy 자체에 대해 관심을 가지고 되면서 여러 압축을 찾게 되었다. 

https://quixdb.github.io/squash-benchmark/ 에 가보면 압축속도, 압축해제 속도, 압축률을 비교해 볼 수 있다.


snappy : 압축속도과 압축해제속도를 중심으로 만들어진 압축알고리즘으로 Google 에서  압축률은 보통 원본의 50% 정도로 줄어든다. 

brotli : 이것도 구글에서 만들었는데, 웹사이트 content를 다운받을 때 사용하는 gzip 이나 deflate 의 대용으로 만든 것으로 보인다. 압축레벨을 지정할 수 있다.

zstd : 저 위 링크에 들어가서 오늘 처음으로 알게된 압축 알고리즘으로 facebook에서 만들었다. snappy 에 비해 속도가 늦은 감이 있지만 압축률이 높다.