요즘 개인적인 개발로 https://yiunsr.tistory.com/792이것을 하고 있다. 이 동작중에 하나는 csv 파일을 읽어서 sql 에 insert 하는 동작을 한다. 처음에는 electronjs 에서 사용할 것이기 때문에 nodejs 를 사용했다. 그러나 속도가 생각보다 나오지 않아서 go 를 사용해서 새롭게 개발하고 있다. 

 내부적인 동작이 조금 복잡한데, CSV 파일의 encoding 을 자동으로 분석해서(utf8 인지 euc-kr 인지 아니면 기타 encoding 인지 자동으로 detect 한다. ), utf8 로 변환시키고 sqlite3에 insert 하는 동작을 한다. 이 동작이 nodejs 에서는 초당 만(10K) 건이 겨우 넘는 수준이었다. 여러 옵션을 섞어 받지만 초당 3만건 정도가 한계였다. 언어를 Golang 으로 변경 했더니 초당 75K 건이 나왔다. 이 옵션은 https://stackoverflow.com/questions/1711631/improve-insert-per-second-performance-of-sqlite 를 참고했다. 

 내 경우 아래 코드를 사용했다. 

db.Exec("PRAGMA synchronous = OFF")
db.Exec("PRAGMA journal_mode = MEMORY")
db.Exec("PRAGMA cache_size = 10000")
db.Exec("PRAGMA locking_mode = EXCLUSIVE")
db.Exec("PRAGMA temp_store = MEMORY")

 

그리고 여러 insert code 는 한번의 트랜잭션으로 동작해야 한다. 이 부분을 적용한 것이 속도 개선에 엄청난 차이가 있다. insert 코드 전에는 꼭 Prepare 코드를 사용해서 코드를 만든 후 사용했다. 이것도 속도의 엄청난 개선을 주었다. 

 테이블을 만들 때, inter primary key 를 만들었다. 이 primary key 가 없으면 자동으로 _rowid 가 추가된다고 한다. 그리고 auto increment 를 사용하지 않았다. 수동으로 증가하는 integer 를 전달하는게 조금 더 빨랐다.

그리고 시도는 해보지 않았지만, 하나의 insert query 에 values 를 여러가 넣는것도 시도해볼만 할 것 같다. 

INSERT INTO table1 (column1,column2 ,..) 
VALUES  
   (value1,value2 ,...), 
   (value1,value2 ,...), 
    ... 
   (value1,value2 ,...); 

 

 go 설치(https://golang.org/dl/) 는 그냥 다운 받아서 설치하면 되는 것이라 큰 문제 없었다. 그리고 당연히 vscode 에는 go lang 관련 확장을 설치(https://code.visualstudio.com/docs/languages/go) 해야 하는데 이것도 큰 문제 없었다. 

 go 가 설치되면 자동으로 설정되는 환경 변수가 있는데, go 가 설치되어 있는 경로에 GOROOT 이라는 경로가 설정된다. 그리고 GOPATH 라는 환경변수에 go get 으로 설치하는 패키들이 설정된다.

https://github.com/golang-kr/golang-doc/wiki/Go-%EC%BD%94%EB%93%9C%EB%A5%BC-%EC%9E%91%EC%84%B1%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 

golang-kr/golang-doc

Korean Translation of golang.org/doc. Contribute to golang-kr/golang-doc development by creating an account on GitHub.

github.com

이 문서에 따르면 모든 Go 코드를 단일 workspace 에서 관리한다고 한다. 이게 이해하기 힘든 구조이다. 모든 프로젝트가 같은 패키지들을 공유한다는게 좀 그렇다. 사용해야만 하는 패키지 버전이 있는데, 그 버전을 선택하지 못한다는게 나에게는 납득하기 힘든 구조이다. (물론 virtualenv 가 나오기 전 python 도 이랬긴 했다. )

 그래서 virtualenv 같은게 있는지 찾아 봤는데, https://github.com/GetStream/vg 라는 프로젝트가 있다. 그런데 윈도우즈에서 어떻게 사용해야 하는지는 잘모르겠다. 

 그래서 여러 방법을 생각하다, GOPATH 는 환경변수라서 환경변수를 어떻게든 사용할 수 있을까라는 생각을 했다. 그리고 vscode go 확장 옵션 중 inferGopath 라는 옵션이 있다. 이 옵션을 키면 Gopath 값을 현재 workspace 로 덮어쓰는 기능이 있다. 그래서 아래와 같이 .vscode/settings.json 을 구성하게 되었다.

===== settings.json  ====
{
    "go.gopath": "${workspaceFolder}", // gopath 설정을 vscode 의 workspace 로 한다. 
    "go.inferGopath": true, // 이 옵션을 켜야 위의 설정이 먹히는 것 같다.
    "terminal.integrated.env.windows": {
        "GOPATH": "${workspaceFolder}" // windows 에서 vscode 프로그램 내 터미널을 GOPATH 환경 변수 변경
    },
    "terminal.integrated.env.osx": {
        "GOPATH": "${workspaceFolder}" // osx 에서 vscode 프로그램 내 터미널을 GOPATH 환경 변수 변경
    },
}
=======

대신 패키지를 설치하기 위해서는 꼭 vscode 프로그램 내 터미널을 사용해야 한다. 

그러나 이렇게 하면 독립적인 환경을 구축할 수는 있는데, workspace 를 git 그대로 설정하게 되면 패키지들도 git에 포함될 수 있다. gitignore 를 잘 설정해야 할 것 같다. 

그리고 패키지를 이렇게 수동으로 설정해야 하는지 잘모르겠다. python 처럼 requirements.txt 파일로 pip 로 빠르게 설지하면 좋을 것 같은데, 아직 이런 방법은 잘 모르겠다. 

 예전 대학시절이에는 프로그래밍 언어를 1년에 하나씩 배우는 것이라고 생각했던 적이 있다. 자주 읽던 프로그래밍 관련 책에서 그렇게 나와서 저런 생각을 했고, 그 때는 나에게는 프로그래밍은 취미였기 때문에 재미있게 느껴졌던 것도 있다. 그리고 절대적인 시간도 많았고, 머리도 지금보다 더 잘 돌아갔다. (물론 그 때도 나자신에게 돌머리라고 생각했는데. 돌이켜 생각해 보면 실력은 그 때가 더 좋았던 것 같다. 다만 경험이 없었을 뿐이고. ) 

 그런데 이제는 주력 언어가 중요하고 공부해야 할 것이 언어만 있는 것도 아니고 플랫폼도 익혀야 하고 딥러닝도 공부하고 싶고, 이미지 쪽도 좀 공부하고 싶고.... 배운 언어도 버전업 되어서 계속 익혀야 하는 문제도 있고, 프로그래밍 방법론도 다양해 지면서 이것도 익혀야 하고, 등등의 문제로 많은 언어를 배우는게 한계가 있다. 그리고 요즘에는 이미 배운  언어들 때문에 생긴 선입관들이 새로운 언어를 익히기 어렵게한다.  그리고 언어에 대한 나의 철학이 어느정도 정착되면서 이 철학과 벗어난 언어를 습득하는게 어렵기만하다. (Ruby 와 ROR 의 경우 이 철학 때문에 나에게 좀 많이 어렵게 느껴졌다. 그래서 Ruby 습득은 실패한 것 같다. )

그래도 언어 습득은 계속 필요하다. 내가 알고 싶은 자료들이 내가 모르는 언어로 만들어 진 것일 수도 있고, 새로운 영감을 얻기에도 좋다. 그리고 특정 언어가 가지고 있는 특수한 편리함도 있다. 

어째든 이제 나도 2번째 언어가 필요한 것 같다. 내 모국어는 C 언어 였으나, 이제는 파이썬을 더 많이 사용하고 있다. 그리고 버전업된 C를 많이 접하지 못했다. C를 읽기는 하겠으나 쓰지는 못하겠다. Javascript + HTML + CSS 는 나의 1.5번째 언어이다. 첫번째라고 할 수는 없지만 2번째 라고 하기에는 너무 가깝다. 다만 Nodejs 도 해보고 싶긴하나 잘 적응이 안되더라. 그래도 잠시 관심을 딴데 두고 있다고 다시 관심을 가지면 좋은 툴들이 나와서 나를 편하게 해줄 것 같긴한다. 

자바는 내 첫번째 언어였으나(처음에 프로그램 언어를 접할 때 javascript 를 배우고 싶었으나 java 와 javascript 차이를 알지 못해 java 를 조금 익힌 적이 있다. ) 너무 방대해서 익히기 너무 어렵다. 그래도 필요할 때 간단히 java 프로그램을 짤 수 있으니 이것으로 만족하겠다. CPP 은 내가 첫 직장에서 사용했던 언어이나 너무 많은 버전 업으로 인하여 내가 CPP를 아는게 맞는지 혼동스럽다. 그리고 C나 CPP은 플랫폼을 너무 타서 나에게 너무 힘들다. 

 그래서 이런 저런 이유로 남는 것이 Go lang 이다. 적당히 native 언어이고, 적당히 유연하다. 그리고 개발환경도 어느 정도 세팅되었다. VSCode 로 개발할 만하다.

앞으로 조금씩 Go lang 을 익혀서 속도가 필요한 부분에는 Go lang 을 사용해 봐야겠다.