9월부터 3명이서 C++로 웹서버로 만드는 프로젝트를 진행했다.
본격 구현에는 4주, 수정까지 6주가 걸려 프로젝트가 드디어 이번 주에 끝났다.
제대로 팀을 이루어 코딩을 하고 결과물을 내본 건 처음이라 기록하고자 글을 쓴다.
42 모든 과제를 시작할 때 항상 그렇지만 아무 것도 모르는 상태에서 무언가를 만들어내야 하니까 막막했다. 웹 서버를 만들라는 건 알겠는데 과제에 나와 있는 내용 중 반도 알아 들을 수 없었다. 우선 인터넷에 올라와 있는 소켓 프로그래밍 예제를 보면서 client에 hello world만 보내주는 http server를 만들었다. 그리고 나서 서버 테스터를 처음 돌려봤는데 GET, POST 같은 명령어를 서버에 요청하는 걸 보면서, client 저런 명령어와 함께 여러 정보를 담아 request를 보내면 우리 server에서는 그 request를 파싱하고 해석해서 그에 맞는 결과를 보내줘야 한다는 것을 깨달았다. 그래서 GET, POST 등의 method의 의미, status return code, headers 등을 공부하면서 하나씩 구현해갔다.
과제를 하면서 CGI 구현과 non-blocking socket read & write를 main loop 안에서 한 번씩만 사용하는 게 가장 힘들었다.
CGI는 개념도 알겠고, 어떤 함수를 어떻게 써야 하는지도 알았지만 구현하는 게 정말 힘들었다.
3일 동안 진척이 없어서 결국 42 파리에 계신 분께 조언을 구해 힌트를 얻었다. CGI는 또 cgi-tester를 사용하기도 해야 했는데, 테스터 결과가 우리 예상과 달라서 결과가 잘 나왔는데도 잘 안 나왔다고 생각해서 엄청난 삽질을 했다. CGI 구현에만 꼬박 일주일이 걸렸다.
non-blocking socket read & write는 CGI와 달리,
non-blocking & select 콤보를 제대로 이해하지 못해서 처리를 제대로 하지 못했다.
이 부분을 처리하고 나서야 비로소 non-blocking이 어떤 것인지 깨달았다.
코딩하다가 이토록 중간에 그만 두고 싶은 생각이 드는 과제는 처음이었다.
정말 우리가 구현할 수는 있긴 한 걸까 좌절하고 슬픈 순간들이 많았다.
안 되는 부분을 되게 하려고 집에 돌아와서 새벽까지도 계속 코드를 보고 수정하고 돌려보고...
정신적으로 육체적으로 가장 힘든 프로젝트였다.
이 프로젝트를 무사히 끝낼 수 있었던 건 팀으로 작업해서 가능했기 때문이다. 내가 해결 못 하는 걸 팀원이 해결하기도 하고, 반대로 내가 문제를 해결 하기도 하고...
딱 3인용 자전거 타는 느낌이었다. 내가 페달을 밟아 앞으로 나아가기도 하고, 잠깐 페달을 밟지 않을 때에도 다른 팀원이 페달을 밟아서 앞으로 나아가고...
함께 하는 것의 위대함을 진심으로 배웠다. 함께해서 정말 고마웠다!
이번 프로젝트에서 애초에 설계를 잘하는 게 정말 중요하구나 배웠다.
처음에 넌블러킹 소켓만 select에 넣었는데 모든 file descriptor가 select를 거치게 해야 해서 file read&write 부분을 main loop로 빼야 했다. 근간을 바꾸는 거라서 꼬박 이틀동안 고생했다. 그런데 사실 아무것도 모르는 상태에서 설계를 완벽하게 하기는 어렵지 않나 싶다. 그래도 다음 프로젝트에서는 설계를 좀 더 잘 해보고 싶다.
앞으로는 어떤 프로젝트를 하든 팀을 이뤄서 할 일이 더 많을텐데, 그때마다 이번처럼 팀원에게서 많이 배우고 같이 해내고 싶다!