Code Metaphor

Programming, Writing, Reading, Thoughts…

이 블로그는 더이상 운영되고 있지 않습니다. 단지 예전 URL을 유지하는 용도로만 남아 있습니다. 새 블로그의 주소는 blog.dahlia.kr입니다.

Archive for May, 2009

Me2PHP 유지 중지 및 포크 소식

Wednesday, May 20th, 2009

Me2PHP를 공개한지 거의 2년이 다 됐다. 사실 작년 중순까지만 해도 API 명세가 바뀌면 최대한 빠르게 반영해왔고, 그런 점 때문에 많은 분들이 Me2PHP를 사용해 주셨다.1 하지만 너무 자주 바뀌는 API 명세에 맞게 유지하기는 점점 힘들어졌고, 근 반 년 정도는 Me2PHP에 손을 놓은 상태였다. 워낙 많은 분들이 Me2PHP를 사용하고 있는 상황이라 애초 마음과 달리 재미가 아닌 의무감에 의한 유지를, 치명적인 버그가 발생했을 때만, 조금씩 해왔을 뿐이다. 그나마도 모든 치명적인 버그를 다 해결한 것도 아니었다.

여담으로, 이참에 미투데이 API의 명세 업데이트에 관한 중요한 문제점을 하나 지적하고 넘어가자. 기본적으로 미투데이의 명세 업데이트는 최대한 하위호환성을 염두하는 듯하다. 하지만 이 하위호환성은 “에러가 나지 않을 정도”의 호환성이지, “버그가 나지 않을 정도”의 호환성을 뜻하지는 않는다. 예를 들어 제공하던 애트리뷰트를 빼려고 하는데, 아예 제거하면 오류가 날 수도 있으니 공백 문자열을 넣어주는 식이다. 난 이런 어중간한 친절함이 항상 좋다고 보진 않는다. 오히려 에러가 났다면 빨리 발견할 수 있는 버그를 오랫동안 남게 만들 수도 있다.

Me2PHP 같은 경우 더 큰 문제가 생긴다. Me2PHP는 객체 모델 맵핑을 하는 디자인이고, 예를 들어 포스팅을 가져오는데도 $person->getPosts(array('offset' => 0, 'limit' => 200, 'from' => '2009-01-01', 'to' => date('Y-m-d')))와 같은 형태를 쓰지 않고 반복자를 사용해 $person->posts->from('2009-01-01')->slice(0, 200)2과 같이 쿼리를 가능하게 한다. 하지만 백조가 헤엄치듯 클라이언트 코드에서만 예쁘고 내부 구현은 지저분하게 되어 있다. 예를 들어 미투데이 API가 예전에는 포스팅을 가져오는데 갯수 제한이 없었지만, 이제는 최대 100개만 가능하게 되었다. 그래서 200개를 가져온다거나, slice()를 생략하고 모든 포스팅을 가져오려고 하면, 내부적으로는 100개씩 가져오는 요청을 알아서 여러번 해야 한다. 최근 미투데이 API 명세가 업데이트되는 것들을 보면, 스트레스 문제 때문인지 이런 식으로 한 요청에서 가능한 범위를 줄이는 것들이 많이 있다. 당연히 Me2API는 기존의 행동을 유지하기 위해 더 지저분한 고려를 내부적으로 하게 된다.

하지만 정말 중요한 문제는 이것이 아니라, 모든 명세의 변경과 그 공지가 일방적이라는 데에 있다. 명세가 변경되면 문서가 바뀐 다음, MDN에 공지 글이 올라온다. 그리고 정말 중요한 변화인 경우 꽃띠앙 님의 미투데이에도 포스팅이 된다. 꼼꼼한, 혹은 나처럼 중간 라이브러리를 만들었기 때문에 의무감이 생긴 개발자라면 명세가 올라오는 스프링노트도 구독하고, MDN 메일도 꼬박꼬박 읽고, 꽃띠앙 님의 미투데이도 자주 확인하겠지만, 그렇지 않다면 업데이트 소식을 모를 수도 있다. 그렇다고 명세를 2년 전 그대로 유지해야 하나.

Me2PHP를 만들고 유지한 경험이 내게 큰 도움을 줬다고 생각한다. VLAAH의 API를 설계하는 데에 있어서. 애초에 VLAAH API는 설계할 때부터 프로토콜 버전을 자연스럽게 올릴 수 있도록 염두를 많이 했다. 클라이언트 라이브러리 개발자, 매시업 개발자로서 유지에 어떠한 고충이 있는지 꽤 많이 겪어본 뒤이기 때문에, 명세를 디자인하는데 이 부분의 우선 순위는 가장 높았다. VLAAH API가 선택한 방법은 HTTP의 내용 협상(content negotiation)과 같은 방식이다. VLAAH API에서는 그것을 프로토콜 협상(protocol negotiation)이라고 한다. 요청시 X-Accept-Protocol: 1.0; q=0.5, 0.9; q=1.0 헤더를 함께 보내면, 이것은 API 0.9를 우선으로 하되, 차선으로 API 1.0 형식도 괜찮다는 뜻이다. 만약 API 0.9가 여전히 지원되고 있다면, X-Protocol: 0.9와 같은 응답을 할 것이다. 그렇지만 API 0.9가 유지되고는 있으나 곧 사라질 운명이라면, X-Protocol: 0.9; expires=2009-12-25와 같은 응답을 하게 된다. 이미 API 0.9의 유지가 끝났다면, X-Protocol: 1.0으로 응답할 것이다. 요청 시에 X-Accept-Protocol 헤더를 보내지 않으면 그것은 X-Accept-Protocol: *; q=1.0과 같다. 항상 최신 버전의 포로토콜로 응답할 것이다.3

그리고 이러한 프로토콜 협상에 관한 사항은 API 문서의 맨 처음에 언급된다. 또한 직접 HTTP 요청 코드를 만드는 대신, 이미 있는 클라이언트 라이브러리를 쓰라고 권고한다. 클라이언트 라이브러리들에는 이미 버전 협상에 관한 것과, 협상에 실패했을 때의 예외 처리, 곧 파기될(deprecated) 프로토콜 버전에 관한 경고에 대해 잘 고려해서 작성되어 있기 때문이다. 현재 있는 클라이언트 라이브러리는 VLAAH-Ruby, vlaah-python 둘 뿐이지만, 모두 해당 부분에 관해 잘 고려되어 있다.

또 다른 문제가 하나 있다면, 회귀 테스트(regression test)가 불가능하다는 점이다. 가능한데 못 찾는게 아니라, 정말 불가능하다. 나는 그렇게 결론지었다. 이것은 꼭 미투데이 API만의 문제는 아니라고 생각한다. API에서 아예 샌드박스(sandbox)를 지원하기 전까지는 회귀 테스트는 요원하다. 그렇지 않으면 일시에 명세가 업데이트될 경우 테스트가 실패하도록 구성할 방법이 없다. 업데이트 공지를 발견하고 부랴부랴 가짜 응답 코드를 고쳐야 하기 때문이다. 아니면 API가 읽기 전용(read only)이여야 한다. 읽는 것만 가능하면(현재 VLAAH API가 그렇다) 그나마 테스트가 가능해진다. 예를 들어 sandbox라는 아이디로 계정을 만들어서 픽스쳐(fixture)를 구성할 수 있다. 하지만 데이터를 조작하는 API는 테스트하기 힘들다. 이를테면 포스팅하는 API를 테스트하고 그것을 삭제해야 하는데, 포스팅과 삭제가 동시에 잘 되는지 둘 다 작동하지 않는지는 가려내기 힘들다. 결정적으로 미투데이는 낙장불입이다. 한번 포스팅을 해버리면 픽스쳐가 영구히 변경된다;;;

여하튼 위와 같은 많은 고충들이 있어서, 결국 나는 손을 놓기로 결정했다! 대신 내 후배인 이흥섭이 프로젝트를 포크했다.

http://bitbucket.org/heungsub/me2pheungp/

프로젝트 이름이 Me2PHeungP랜다. 작명 진짜 구리다. 여하튼 이건 최근의 API 명세를 확실히 반영하고 있다. 앞으로는 이 라이브러리를 이용하길 권한다. 어차피 기존 Me2PHP를 포크했으므로 인터페이스는 동일하게 유지된다. 다만 내가 유지하는게 아니니 디자인이 약간 달라질 수도 있다. 그리고 가끔 나도 패치를 제공할 예정이다. 그러니까, 내 Me2PHP 리파지토리에는 이제 커밋이 되지 않을 예정이다.

주변에 Me2PHP를 쓰는 사람이 있다면 이 소식을 널리; 알려주시기 바란다.


  1. 사실 공개된 Me2API 클라이언트 라이브러리 중에서 Me2PHP의 API 디자인이 가장 편하게 되어 있었다(고 자부한다). 대개 HTTP 요청을 추상화하고, 인증키에 nonce를 덧붙여 해싱하는 것을 감싸주는 선에서 얇은 랩핑(wrapping)을 하고 그쳤는데, Me2PHP는 ORM마냥 객체 모델로 아예 맵핑을 한 형태다. 나는 지금도 좋은 클라이언트 라이브러리는 이런 형태여야 한다고 생각하고, VLAAH-Ruby도 그렇게 디자인했다. 그리고 vlaah-python 역시 내가 작성한 것은 아닌데 다행히(!) 그런 디자인이어서 정말 만족했다. 

  2. to()가 생략된 것을 볼 수 있다. 생략되었다면 범위는 당연히 현재까지가 된다. 

  3. 이상의 정교한 프로토콜 협상 방식을 만드는데 강성훈 님의 기술적 조언이 큰 도움이 되었다. 이 분이 vlaah-python을 명세에 의도에 정확하게 부합하는 형태로 만들어 주신 것도, 애초에 API 디자인을 거의 함께 했기 때문. 

VV: VLAAH 대결 구도 뷰 애플리케이션

Saturday, May 16th, 2009

VV

VLAAH 점수를 이용해서 대결 구도 뷰로 보여주는 애플리케이션을 만들었다. 이름은 VV. “븨븨”라고 읽어주면 된다. VLAAH Versus의 약자다.

http://vlaahversus.appspot.com/

대결 구도라고 하면 잘 모를 수 있는데, 어떤 식으로 나오는지 보면 단번에 알 수 있다.

아래와 같은 것들을 조립해서 만들었다.

  • 데이터 추출을 위해 vlaah-python 모듈을 사용한다.
  • 대결 구도를 보는데 심심하지 않게 하기 위해 Adobe Kuler의 컬러셋을 아무거나 가져와서 색을 칠하게 했다.
  • URL에서 유추할 수 있듯 Google App Engine에 올렸다.
  • 템플릿 엔진은 Jinja2를 썼다.
  • 간단한 JavaScript와 애니메이션에 jQuery를 썼는데, Google에서 호스팅해주는 파일을 링크했다.

사실은 몇달 전에 Ruby에 Sinatra를 이용해서 만들고 있었는데, 중간에 재미가 없어 손을 놓고 까맣게 잊고 있다가 소스 코드를 잃어버리게 됐다. 그래서 이번에 Google App Engine에 올릴 생각으로 다시 만들어본 것이다. 훈련 끝나고 좋은 워밍업이 된 것 같다.

다만 문제가 좀 있는데, GAE에서 외부 URL 접근에 타임아웃 제한이 있다보니, 항목 수가 많아지면 오류가 나버린다. 이건 사용하는 사람이 알아서 살살 피해갈 수밖에 없을 것 같다. 그리고 CSS는 하다가 짜증나서 대충 마무리했다. text-shadow 속성을 쓰는데, 이게 Safari와WebKit과2 Opera에만 구현이 되어 있고, Mozilla Firefox는 3.5 버전부터 추가되기 때문에 글씨가 잘 안 읽힐 수도 있다. Internet Explorer는 처음부터 고려하지 않았다. 심심풀이로 한 건데 스트레스 받기가 싫었다.

여기까지는 인지하고 있는 문제들이고, 이 외에 버그가 있으면 알려주기 바란다.


  1. 나에 대한 평가가 제일 좋다. 헤헿 

  2. 같은 WebKit 엔진인데도 Google Chrome에서는 구현하지 않은 것 같다.Google Chrome 2.0이 나오면서 text-shadow가 지원되기 시작했다. 잘 보인다 이제. 

근황

Monday, May 11th, 2009

원래 신변잡기를 좋아하지는 않지만, 블로그에 글을 올린지 오래되서 소식이라도 전하기 위해 쓴다.

최근에 있었던 가장 중요하고 많은 시간을 보냈던 일은 논산 육군훈련소에서의 4주 훈련이다. 4월 9일에 입소하여 5월 7일에 무사히 훈련을 수료하고 퇴소했다. 느낀 점이 매우 많고, 내게 무척 큰 영향을 끼친 경험이었다. 정말로 살인하는 방법에 대해 배운다는 생각이 들었고, 군대라는 조직에 대해서도 조금 이해하게 되었다. 원래 RSS를 구독하고 있던 블로그의 주인공도 우연히 만나게 되었는데, 바로 고어핀드 형이다. 훈련소 전우끼리는 결국 다 친해지긴 하지만, 아무래도 어느 정도 말이 통하는 사람과 특별히 친해질 수밖에 없더라.

그리고 훈련을 받는 동안 내 서버가 사용 기간이 만료되어 죽어있었다. 그리고 오늘에서야 다시 살렸다. 내 서버에 있던 Me2PHP 등도 물론 접속이 안됐고, 후배 이흥섭 군의 홈페이지도 접속이 안됐다고 한다.

입소 전, 훈련중, 입소 후에서도 조금씩 진행하고 있던 일이 하나 있는데, 지금까지 주로 아이디어를 모으고 헐렁한 구상만 해왔던 Metaphor 언어의 명세 작성이다. 아무래도 훈련소에서는 심심할 때가 종종 있기 때문에 연습장에 뭔가 끄적일 일이 잦았는데, 대체로 Metaphor에 관한 것들이었다. 명세 외에도 언어 디자인에 대한 간단한 회고록 같은 것들도 끄적였다. 그나저나 안되는 저질 영어 실력으로 작문하기가 참 힘들다.

그 외에도 나와 관련된 IRC 채널들1의 서버를 HanIRC에서 강성훈 님이 새로 운영을 시작하신 오징어로 옮겼다. 이제 CP949 대신 UTF-8을 쓸 수 있다. 야간개발팀도 둘이나 빠져서2 활동이 지지부진했는데, 다시 활기를 띄기 시작했다. 회사도 오늘 퇴소 후 첫 출근을 다시 했고, 업무를 파악하고 있다.

이제 큰 난관 하나가 해결되었으니, 앞으로는 모든 일이 순조롭게 되길 바라고 있다.


  1. LangDev 채널 #langdev, 이르니아 연대기 채널 #ernia, Vlastic 개발자 채널 #vlastic 등. 

  2. 나와 이동근 선배가 같은 날 입소해서 운좋게 같은 소대원으로 훈련받았다. 

Powered by WordPress. Styled by Hong, MinHee. XML Feed, Comments XML Feed.