지난달부터 재미삼에 패치팡이란 애니팡 아류작을 하나 맹글어보고 있는데, 부득이(?)하게 랭킹서버까지 만들어야했다. 그리고 지난주였나? 페북과 연동해서 친구들과 경쟁구도를 만들기 위해 랭킹서버를 약간 수정했다. 물론 데이터 모델도 달라졌고, API도 약간의 수정이 있었다. 귀차니즘에 수정을 최소화하다보니 많은 기능을 넣지는 않았음에도 불구하고 삽질의 연속이었다. 그때 정리했어야하는데 일단 잊어먹기 전에 생각나는대로 정리해보자.
1. 청크(Chank)데이터 이어붙이기 일단
페이스북 Graph API를 이용해 친구목록을 가져와야했다. 페이스북의 모든 API는 https로 호출한다. (혹시 http로 호출하는 API가 있을찌도 모르겠으나,.. 일단 문서에는 없는듯..) 뭐 https도 암호화와 패킷 검증을 제외하면 프로토콜은 http와 거의 대동소이하다. 여튼 nodejs를 이용해 API 호출후 응답을 받으려면 다음과 같이 ‘data’ 이벤트를 통해 데이터를 수신받는다.
var https = require('https');
var url = 'https://graph.facebook.com/me/friends?fields=id&access_token='+ token;
https.get(url, function(response) {
response.on('data', function(chunk) {
console.log('receive.. chunk data...', chunk);
var friends = JSON.parse(buffer.join(''));
});
});
HTTP와 HTTPS 객체에 대한 보다 자세한 설명은 nodejs API 문서 를 참고하자. 위와 같이 코드를 작성하고 실행해보면 간간히 JSON.parse 중에 에러가 난다. 아! 왜 자꾸 에러나는거야? 짱내고 있었는데.. 생각해보니 data 이벤트로 받는 녀석은 chunk 단위다! 그럼 당연히 데이터가 짤릴수도 있는거지! 아하~~ 😀 물론 한번에 담겨서 넘어올때도 있지만ㅋㅋㅋ 여튼 콘솔에 값을 출력해보면,.. [Buffer 0x45…..] 버퍼 어쩌구저쩌구가 찍힌다 그래서 버퍼에 담았다가 이어붙이면 되겠다 싶었다. 그런데!!! 어떻게하지? 어떻게 붙이지? Buffer 객체를 만들어야하나? Stream 객체로 해야하나? 서버개발에 익숙치 않으니 Java에서 쓰던 방법들을 동원해서 별에별 방법을 다 써봣다. 너무 Java틱했나? 결론은 다 잘 안됐다. OTL… 도대체 왜 안되는거야? 라고 씩씩대면서 4시간을 날렸다. 그런데 해결책이 아~ 허무해~~! 너무나 단순했다. 그냥 배열에 담았다가 join만 하면 되는거였어!! 정말 javascirpt 다운 해결책!~ ㅜㅜ 아~ 내 아까운 시간~ 그래도 뭐 4시간동안 API문서보고 이거저거 해봤다는거에 위안을 삼으며 다음과 같이 수정!
var https = require('https');
var url = 'https://graph.facebook.com/me/friends?fields=id&access_token='+ token;
https.get(url, function(response) {
var buffer = [];
response.on('data', function(chunk) {
console.log('receive.. chunk data...', chunk);
buffer.push(chunk);
});
response.on('end', function() {
var friends = JSON.parse(buffer.join(''));
});
});
위와 같이 수정하면 데이터 짤림 없이 온전한 데이터를 파싱하는데 성공!!
2. Express 모듈에 미들웨어 장착하기
이번에도 다소간의 삽질이 있었지만, 이번엔 지극히 자바스크립트 다운 생각으로 임했더니 매우 쉽게 해결된 문제다. 먼저 nodejs 로 서버를 만들때 가장 많이 쓰는 모듈이 바로 Express 모듈이다. 이젠 거의 socket.io와 더불이 이바닥 표준이 아닌가 싶다. 여튼 GET 방식이든 POST 방식이든 요청 URL에 한글이 들어갈 경우 반드시 인코딩해서 넘겨야하고 서버에선 디코딩 과정이 필요하다. 아니면 서버에서 무조건 URL을 자동 인코딩해서 처리해야한다. 그런데 난 이 모든 것들을 Express가 알아서 해주는줄만 알았다. 그런데 그게 아니었다. ㅜㅜ 너무 맹신했나? 그래서 데이터를 넘길때 서버에서 인코딩하고 다시 응답을 만들때 디코딩하는 생쑈를 했다. 그런데 말이지.. 자꾸 이상한 생각이 든다,.. 이거 너무 귀찮은데,…-_-;;.. 왜 이걸 Express에서 안해주는거지?… API를 뒤졌다.. 역시!!.. 저 밑에 있네.. 바로
Middleware 라는 항목에.. 빙고~!!
app.use(express.bodyParser());
// is equivalent to:
app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart());
바디파서 한줄이면 인코딩은 알아서 척척척 해준다. -_-;… 역시 자바스크립트는 생각대로 하면된다. 느무 조아요!! 일단 여기까지 또 생각나면… 이어서..