지난 웹프레임워크 포스팅에 이어 Ocsigen/Eliom를 사용한 후기를 기록한다. Ocsigen은 OCaml로 구현된 웹서버이고 Eliom은 그 위에 구현된 웹프레임워크이다. 지난 며칠간 이것들을 이용해서 작은 웹페이지를 만들어 보았다.
거두절미하고 결론을 짧게 내면 "좋긴 한데 아직 상용 서버에 쓰기엔 적당하지 않음." 인 것 같다.
하나의 언어(OCaml)로 DB/서버/클라이언트 모두 작성한다. OCaml로 작성된 코드가 DB 코드, OCaml 바이너리/네이티브, Javascript 코드로 알아서 컴파일된다. 개발자가 신경쓸 것이 줄었다. 개인적으로는 이것이 옳은 방향인 것 같다.
OCaml의 있는 타입 시스템, 없는 타입 시스템을 모두 끌어 모아 최대한 안전한 웹페이지를 만들기 위해 노력했다는 느낌이다. 물론 다른 웹프레임워크들도 입출력을 꼼꼼히/쉽게 검사할 수 있도록 도구들이 준비되어 있지만 개발자가 깜빡하면 그만이다. 반면, Ocsigen에서는 타입 시스템을 통해 안전한 입출력을 강제하고 보장한다. 덕분에 나같은 보안 문외한도 희망을 가진다.
언제나 그렇듯이 세상엔 공짜가 없다.
DB 코드를 직접 작성하지 않는다고 좋아했지만 그렇게 좋아만 할 일이 아니다. Ocsigen 메뉴얼을 보면 다음과 같은 문구가 있다.
Persistent data are serialized on hard drive using OCaml's unsafe Marshal module, ... If you ever change the type of serialised data, don't forget to change the persistent reference name, or the server will probably crash while deserializing!
DB에 들어갈 데이터의 타입이 바뀌면 그 이름도 바꾸란다. 안그럼 서버가 죽을지도 모른다고. 다르게 말해 DB 스키마 변경 지원이 없다. OCaml의 값이 DB에 0101로 저장(marshalling)되니 그럴만도 하다.
OCaml의 값을 DB가 이해하지 못하는 0101로 저장하는 것에는 문제가 있는데,
따라서 작지 않은 DB를 위한 서버에는 사용해선 안되는 물건으로 생각된다. 적어도 OCaml 기반의 DB가 준비되고 이것이 스키마 변경을 지원하기 전까지는 말이다.
강력한 타입 시스템 덕분에 진입장벽이 꽤나 높다. OCaml의 polymorphic variants와 phantom 타입, 거기에 멀티쓰레드를 위한 Lwt 모나드까지 안전한 웹페이지를 만들기 위해 모두 엄청나게 쓰인다. 마치 이를 위해 OCaml 타입 시스템을 확장한 것처럼. 우연히라도 타입 검사에 성공한다면 여느 OCaml 프로그램처럼 신기하게도 큰 문제없이 돌아갈 것이다. 단, 우연히 그러기엔 타입 시스템이 너무 복잡하다. OCaml에 익숙하다고 생각했는데도 타입 검사에 한참 골머리를 앓았다.
참고로 내가 Ocsigen/Eliom으로 작성한 페이지는 '내가 볼/본 방송을 관리하는 페이지'이다. 할 일을 기록하는 것을 "to do"라고 한다면 이 페이지는 "to watch" 정도 되겠다. 생긴건 아래와 같다.
예전에 완전히 같은 일을 하는 페이지를 Codeigniter 위에서 구현한 적이 있다. 그때 작성한 코드의 크기는 대략 375줄이었고 Ocsigen/Eliom 위에서 구현한 건 352줄이다. PHP에서 OCaml로 오면서 크기가 많이 줄어들 것이라 예상했는데 차이가 거의 없는 것이 충격적이다. 나의 허접한 PHP 코딩을 생각하면 오히려 늘어날 수도 있겠다 싶다.
끈닷넷에서 OCaml 사용을 그만 두어야 할 것 같다. OPAM의 최저 메모리 사용은 1GB인데 나는 이것 하나 때문에 시스템 사양을 올리고 싶은 생각이 없기 때문.
1GB of memory should be all you need. It was reported that you may run into problems with 512MB of RAM and no swap. (from OPAM - FAQ)
2016-07-24 씀.