지난 3일 간 먼 곳에 다녀왔다. 끈닷넷에 OCaml 웹서버를 적용하고 blog.kkeun.net
이랑 kkoment.kkeun.net
을 포팅했다. 그리고 오늘 다시 롤백했다.
ㄲ마크다운을 OCaml로 성공적으로 장착시킨 것에 힘입어 잠시 미쳤나 보다. ECaml*과 http/af*를 이용하면 뭔가 될 것 같았다. 나의 착각이었다.
http://komar.in/en/code/ecaml
github.com/inhabitedtype/httpaf
ㄲ블로그는 워낙 간단해서 큰 문제가 없었다. ECaml 덕분에 type-safe한 템플릿도 아주 만족스러웠다. 하지만 꼬멘트는 조금 더 복잡했다. 작은 문제들을 하나하나 해결해 나가며 포팅을 진행했다. 점점 가면 갈수록 작은 성취들에 기쁠 거라 생각했지만 그렇지 않았다. 나 홀로 외딴 숲을 헤매는 기분이었다.
OCaml은 분명 좋은 언어지만 웹서버를 돌리기 위한 아주 많은 것들이 없다.
http/af가 OCaml 세계에서 그나마 가장 트렌디한 웹서버임에도 불구하고 ssl 지원도 없다. 아파치가 중간에 프록시 역할을 하면 되긴 하여 이건 일단 그렇게 타협했다.
웹브라우저의 캐시 기능을 쓰려면 서버로부터 전달되는 파일 헤더에 ETag
라던가 Last-Modified
필드 값이 있어야 한다. http/af는 그런 걸 모르니 직접 적어 주어야 했다. 이게 맞나 생각이 들기 시작했다.
눈을 씻고 찾아 봐도 OCaml 세계에는 멀쩡한 session 라이브러리가 없다. ocaml-session*이 가장 유력한 후보였으나 유지보수가 안 되고 있다. 다른 최신 패키지들과 함께 깔리지를 않는다.
github.com/inhabitedtype/ocaml-session
롤백을 결심한 결정타가 있었으니 multipart/form-data
지원이 없다는 것이다. 무슨 말이냐 하면 POST
로 리퀘스트를 날렸을 때 이를 파싱할 수 있는 파서가 없다는 말이다. "에이 설마 내가 모르는 거겠지. 무슨 웹서버가 POST
리퀘스트도 못 읽어?" http/af 웹서버는 못 읽는다. 이게 OCaml에서 현재 가장 핫한 서버다.
github.com/inhabitedtype/httpaf/issues/132
http/af나 너무 최신이라 그런 걸까? 아니다. 그보다 조금 더 오래 된 cohttp도 못 읽는다.
github.com/mirage/ocaml-cohttp/issues/181
위 이슈에 적혀있던 work-in-progress (=개발 중단된) 파서가 있었는데 그걸로 읽으니 읽히긴 읽히더라. 에휴. POST
리퀘스트를 읽기 위해 파서가 필요하다니. PHP를 쓰던 때엔 정말 전혀 생각하지도 못했던 이슈다.
아니다. 사실 OCaml에겐 Ocsigen이 있다. 앗, 그러고 보니 이건 4년 전에 이미 실패했다.
blog.kkeun.net/computer/2016-07-24-ocsigen
맞다. 나같은 게으름뱅이는 PHP를 벗어나지 못할지도 모른다. C#을 쓰는 여러분은 이런 걱정이 없어서 좋겠다. 😥
흥, 하지만 C#에서도 type-safe한 템플릿 엔진은 못 봤다.
하지만 나머지는 다 있지. 많은 유저까지. 부럽다.
2020-04-13 씀.