Nobody Understands REST or HTTP라는 글이 Hacker News 1면에 올라오고나서 여러가지 토론이 일어났다. 토론의 내용은 실용적인 관점에 있어 Pure RESTful interface가 유효한가에 대한 부분이 꽤 중요한 부분을 차지하고 있다.
야간개발팀에서 만들고 운영중인 VLAAH의 경우에도 1G때 개발 아키텍트인 민희가 여러모로 신경을 써서 HTTP 프로토콜을 거의 완전하게 이용하는 Pure RESTFul API를 선보인 바가 있다. 2G로 올라가면서 2G API가 아직 미구현인 부분이 꽤 있지만, 국내는 물론 세계적으로 통틀어보아도 이정도로 원칙적으로 완전하게 RESTful API를 구현한 사례는 거의 없다고 생각한다.
그러하다보니 야간개발팀에서도 이 부분에서 많은 논의가 있었고, 그 당시의 경험과 여러 개발 API를 만져본 나의 소감은 이러하다.
우리가 당시에 Pure REST API를 구현하면서 생길 가장 큰 걱정거리는 개발자 접근성이었다. Nobody Understands REST or HTTP을 읽어보면 알 수 있지만, Pure REST API는 HTTP Request Header를 적극적으로 활용한다. 받아올 데이터 형식도 헤더에 명시하고, 버전도 헤더에 명시한다. 엄연히 Request Header에 표준으로 존재하는 것을 쓰지 않고 URL에 버전명과 요청 포맷을 명시하는 것은 깔끔하지 못하기 때문이다.
하지만 세상에는 HTTP 프토토콜에 대한 이해도가 거의 없으면서 웹서비스를 개발하는 개발자들이 굉장히 많다. Request Header를 못고치는 개발자가 존재하냐는 의문이 들지만, 의외로 찾아보면 대다수의 개발자들은 자신이 개발하는 환경에 대한 이해도가 상당히 떨어지는 것을 알 수 있다. 이는 결국 개발자 접근성의 하락을 가져오고, 결국 손해는 플랫폼 홀더가 지게된다. 개발자들이 할 줄 모른다고 API를 가져다 쓰길 거부하기 때문이다. 많은 웹개발자들은 브라우저만으로 API를 테스트할 수 있기를 원하고 우리는 이에 대해 고민해야했다.
우리들은 여기서 가장 깔끔한 방법을 선택했는데, 브라우저로 API를 테스트하는 것을 포기하는 대신, 더 쉽게 이용할 수 있는 언어별 클라이언트를 만들어주기로 했다. 언어별 클라이언트 라이브러리가 있으면 브라우저를 통한 API 테스트를 할 필요도 없으며, 그렇기 때문에 Pure REST를 포기하지 않아도 되었기 때문이다.
하지만 이 방법의 가장 큰 문제는 비용이었다. 대부분의 메이저 언어에 대한 API를 만들어야했는데, 민희가 루비 Gem을 만들고, 강성훈님이 파이썬 라이브러리를 만들어주셨고, 여러 다른 분들의 도움이 있었지만 유지보수까지 생각하자니 비용이 너무 커졌다. 결국 2G로 업데이트시 프로토콜 업데이트를 하며 많은 것을 포기해야했었다.
그래서 나의 결론은 이렇다. 개발자가 이용하는 인터페이스일지라도, 개발자또한 사용자로 보며 지식수준을 최대한 넓게 커버할 수 있어야 한다. 하지만 이와 동시에 만드는 주체의 개발비용도 고려대상에 들어가야 한다. Pure를 조금 타협보는 대신, 다른 가치를 제공하는 것에 더 시간을 투자할 수 있다면 그것이 더 좋은 결과로 이어질 것이다. 다만, 몇가지 요소를 제외하면 실용적인 부분에서 많은 REST의 기본 원칙은 분명히 유효하다.
그래서 나의 REST 인터페이스에 대한 원칙은 최대한 지키되, 브라우저로 쉽게 테스트할 수 있도록 설계한다이다. 브라우저에서 지원하지 않는 PUT과 DELETE는 이용하지 않거나 우회법을 제공하고 1, 버전이나 데이터형식은 URL에 할당하여 브라우저 테스트를 가능하게 하는 것이다.
Dropbox의 API 디자인도 이와 비슷한 생각을 가지고 있다.2