박근핵닷컴 알렉스의 이야기

그리고 서버 개발일지

0. 소개

안녕하세요, 박근핵닷컴에서 서버 개발을 담당했던 알렉스입니다. 아래 글은 전적으로 (이런저런 기술만 잡다하게 알고 정작 어떤 것 하나 제대로는 모르는) 개발자 관점에서 쓴 글로, 박근핵닷컴을 어떻게 개발하였고 어떤 삽질(?)을 했었는지에 관해 적은 글입니다.


1. 시작

2016년 10월 29일 1차 촛불집회 때, 1차 집회임에도 불구하고 2만 명의 사람들이 모였다는 소식을 페북 라이브로 보고 있는데 레베카님이 페북 메시지를 통해 연락이 왔습니다.

박근핵닷컴의 시작.jpg

레베카님과는 ‘우리동네후보’를 만들고 운영하셨던 몇 년 전부터 알고 지냈는데, 항상 레베카님의 기획력과 실행력에 대한 믿음이 있었습니다. 또한 저도 이 시국에 제가 할 수 있는 일이 무엇인지 고민하던 차라 바로 가겠다고 대답했습니다. 그리하여 바로 다음날 레베카님과 제인님, 로빈님, 그리고 제가 모여서 박근핵닷컴을 시작하게 됩니다.


2. 스택 선택 및 개발

저는 RestAPI 서버 개발을 맡았습니다. 빠르게 개발하고 유지 보수가 쉬운 것이 우선이었기에 저에게 가장 익숙한 스택을 사용했습니다.

  • 서버는 Google App Engine
  • 언어 + 프레임워크는 Python + Flask
  • DB는 Cloud SQL을 이용한 MySQL
  • 로그는 Cloud Logging
  • 로그를 저장하고 분석하기 위한 Cloud Storage BigQuery

앱엔진을 선택한 이유는,

  • 이 서비스를 사람들이 얼마나 사용할지 예상 불가. 앱엔진은 ms단위의 Automatic Scaling을 제공하여 Load Balancing을 걱정을 할 필요 없음.
  • 서비스가 얼마나 복잡해질지 예상 불가.
  • Cloud Logging, Stackdriver Monitoring으로 자동 연동되어 Logging, Monitoring, Error Alerting 등을 이용하기 위해 따로 세팅할 필요 없음.

등의 이유가 있었지만, 단순하게 생각해봤을 때 서버를 지속적으로 관리할 시간 및 인력이 없었습니다. (지금 돌이켜 생각해보면, 앱엔진을 선택했던 것이 어쩌면 이 서비스를 만드는 과정에서 가장 잘 한 결정이었습니다.)

대략적인 박근핵닷컴 서버 아케텍처

이메일의 경우 의원들의 이메일 확인 및 응답 클릭 추적을 위해 Open Tracking과 Click Tracking이 필요했습니다.

처음에는 MailChimp 같은 외부 서비스를 사용하려고 했지만, Email Tracking의 원리를 찾아보니 생각보다 간단해서 Flask에 기본 내장된 itsdangerous와 Google Mail API를 사용하여 어쩌어찌 직접 개발하게 되었습니다 (후에 직접 개발한 것이 큰 활약을 하게 됩니다).

그리하여 약 2주간의 기획과 1주간의 개발 기간을 거친 박근핵닷컴이 완성되었고 12월 1일 밤 11시, 드디어 서비스를 오픈했습니다.


3. 오픈

두근거리는 마음으로 오픈했지만 사람들이 알아서 찾아 들어올리도 만무하고 딱히 홍보할 채널이 있던 것도 아니었기 때문에 처음에는 각자 이곳저곳에 알아서 홍보를 했습니다.

내가 이곳저곳 알아서 한 홍보 중 하나(…)

예상외로 이곳저곳 알아서 홍보한 것이 효과가 있었는지, 오픈 1~2시간 뒤부터는 동접 10명 정도가 떴고 다음날 아침까지 약 500개의 청원을 받으며 순조롭게 출발했습니다.


4. 동접(동시접속) 폭발

기대했던 것 보다 많은 분들이 청원을 보내주셔서 기뻤던 것도 잠시, 이른 아침부터 동접이 약 100명까지 올라가기 시작했습니다. 급기야 오후에는 동접이 2천 명이 넘어가면서 서버가 급격히 느려졌습니다.

동접이 늘어날 것을 대비해 Automatic Scaling을 지원하는 앱엔진을 사용했기 때문에 처음에는 문제가 없었으나, 오픈 하루만에 동접 2천 명은 예상하지 못했던 상황이었습니다. 당시 회사에서 근무 중이었기 때문에 코드를 수정하거나 할 수는 없었고, 할 수 있는 건 DB 성능을 높이는 것 밖에 없어 우선은 최대로 높였습니다. 그랬더니 초당 800건을 처리하던 DB가 바로 초당 2500으로 뛰는 것을 보고 DB 처리 속도에 bottleneck이 있다는 것을 알게 되었습니다.

성능을 높이자 처리량이 초당 800에서 2500으로 치솟던 DB

하지만 여전히 회사 근무 중이라 더는 손을 못쓰고 있었는데… 오후 5시쯤부터 박근핵닷컴이 포털사이트 실시간검색어에 등극하는 대형사고(?)가 발생하여 순식간에 동접 1만을 넘기게 됩니다. 실검에 오른 걸 기뻐해야 할지 서버가 터지려는 걸 슬퍼해야 할지 고민할 겨를도 없이, 저는 여전히 회사에서 근무 중이었기 때문에 시간을 들이지 않고 서버 성능을 높일 수 있는 방법을 찾아야만 했습니다. 고민 끝에 DB replica를 만들어 대응하기로 했지만, 역시나 근본적인 해결책은 아니었습니다. 계속 늘어나는 동접수를 지켜보며 제발 퇴근시간까지만 버텨주기를 서버신(?)께 빌면서 근무를 했습니다.

퇴근을 하자마자 DB 부하를 줄이는 작업에 들어갔습니다. 박근핵닷컴에서 제공하는 데이터가 실시간이긴 하지만, ms단위로 제공될 필요는 없는 데이터이기 때문에 cache를 사용하면 될 거 같아 앱엔진에서 제공하는 Memcache를 사용하기로 했습니다. 다행히 Flask-Cache 라는 Flask extension에서 앱엔진 Memcache 지원이 되어 손쉽게 Memcache를 적용시킬 수 있었습니다.

Memcache를 적용한 뒤에는 서버와 DB에 모두 부하가 10분의 1이하로 줄었고, 동접 1만에도 느려지거나 접속이 안되는 등의 문제는 더 이상 발생하지 않았습니다. 심지어 다음날 모든 포털 실검 1위를 찍고 나서 동접 2만을 넘기고, JTBC 뉴스룸에 나오면서 동접 3만을 기록했을 때도 특별한 문제없이 운영이 가능했습니다.

영광의 실검 1위를 찍던 순간과 당시 동접수

5. 오류 논란

청원수가 늘면서 국회의원들의 응답도 빠르게 들어오기 시작했고, 얼마 지나지 않아 야당은 거의 모든 의원들이 찬성으로 응답했습니다. 당시 여당의 몇몇 국회의원들도 응답을 했는데, 찬성과 반대가 반반 정도였습니다. 그런데 여당에서 찬성으로 응답한 의원 중 한 분이 자신은 찬성 응답을 한 적이 없고 박근핵닷컴은 들어본 적도 없다며 법적 조치를 취하겠다고 한 언론에 인터뷰한 것을 기사를 통해 알게 되었습니다.

혹시라도 제 실수로 찬성으로 찍힌 거라면 재빨리 무응답으로 돌리고 해당 의원님께 사과드려야 하는 상황이라 생각해서,

  • 시스템상 오류 (버그)
  • 실수로 운영 데이터 수정
  • 테스트 중 오류

위의 항목들을 포함해서 실수가 있을만한 부분을 모두 검사해보았습니다.

확인 결과, 코드 자체가 내부 오류로 인해 찬성 혹은 반대가 찍힐 수는 없는 구조였기 때문에 시스템 오류는 아닐 것이라는 결론을 내렸습니다.

다음으로 저희 중 누군가가 실수로 데이터를 직접 수정하거나 테스트 중에 발생한 오류인지 확인해 보았습니다. 하지만 DB 접근 권한은 저에게만 있었고, 응답이 적힌 시간에 저는 컴퓨터를 사용하지 않았기에 데이터를 직접 수정했을 가능성도 배제할 수 있었습니다.

남은 건 테스트 중 발생가능한 오류인데, 테스트는 저희 중 누구라도 가능했기에 기억에 의존해서는 확인이 불가능했습니다. 기록으로 확인해야 했지만 DB에 찍힌 것은 응답과 응답시간뿐이어서 막다른 길목이라 생각하는 찰나, Cloud Logging을 통해 자동으로 Cloud Storage와 BigQuery로 수집되고 있던 로그가 생각났습니다. 다행히 Email Tracking을 직접 개발했기 때문에 이메일을 오픈했을 때의 서버 요청과 응답을 클릭했을 때의 요청이 로그로 남아있었습니다. 모든 로그에 요청 IP 주소가 남아있어서 해당 IP 주소들과 저희가 테스트했을 때의 IP 주소들을 비교해볼 수 있었습니다.

상황을 종합적으로 판단했을 때 시스템 상의 오류나 운영 과정에서의 실수로 인해 잘못된 응답이 기록된 것이 아니라는 결론을 내렸고, 특별한 조치는 취하지 않기로 했습니다.


6. 후기

마침내 12월 9일 국회에서 탄핵안이 가결되어 박근핵닷컴의 목표는 이루어졌습니다. 이번 프로젝트는 여러모로 저에게 큰 의미와 배움이었습니다.

우선 클라우드 기술의 발전으로 개인이 동접 3만 서비스를 만드는 것이 가능하게 되었다는 것에 놀랐습니다. 이전에는 동접이 몇만이 되는 서비스를 운영하려면 개인은 물론이고 소규모 회사에서도 쉽지 않으며, 최소한 풀타임 서버 담당자가 필요할 거라고 생각했습니다. 하지만 개발자 둘이서 AWS와 GCP를 이용해 큰 어려움 없이 박근핵닷컴을 개발했고, 개발 이후에는 따로 손을 쓰지 않아도 운영이 가능했습니다. 심지어 서버 기술을 잘 몰라도 사용할 수 있는 클라우드 서비스들이 이미 많이 나와있어서 개발만 조금 할 줄 안다면 혼자서도 충분히 몇십만 유저들이 사용하는 서비스를 만들고 운영할 수 있다는 것을 실감했습니다.

다음으로, 남녀노소를 불문하고 많은 분들이 박근핵닷컴을 통해 국회의원에게 청원하고, 서비스 운영진인 저희에게 적극적으로 의견을 보내주셨습니다. 크게 어렵지 않은 IT 기술로도 우리의 목소리를 우리를 대변하는 사람들에게 직접 전달하는 데 작은 보탬이 될 수 있었다는 것이 가장 기뻤습니다. 박근핵닷컴의 성과를 보면서, IT 기술을 통해 사람들의 좀 더 적극적인 정치 참여를 이끌어 낼 수 있다는 것과 그런 정치 서비스를 사람들이 기다리고 있었다는 것을 느낄 수 있었습니다. 앞으로도 더 많은 정치 서비스들이 나와서 정치인들이 국민의 목소리를 더 잘 들을 수 있도록, 더 나아가 우리나라 정치가 한 단계 더 발전할 수 있는 발판이 되기를 바랍니다.

마지막으로, 저는 항상 ‘이 세상에 도움이 되는 일을 하고 싶다’는 생각을 가지고 있었습니다. 하지만 ‘나에게 그런 능력이 있는가’라는 의문도 항상 함께였습니다. 이전에도 여러 서비스들을 혼자 혹은 팀으로 개발을 해보았지만 제대로 된 성과를 내본 적이 없어 개발자로서의 제 실력이 너무 부족해서 그런 것은 아닌지에 대한 고민도 많았습니다. 하지만 우연한 기회로 박근핵닷컴을 처음부터 함께 만들고 운영하며 성공적으로 마무리까지 할 수 있는 사람들을 만났고, ‘좋은 팀과 함께라면 나도 가능하다’는 것을 경험하면서 자신감을 얻었습니다. 이 자리를 빌려 박근핵닷컴을 함께 만든 레베카님, 제인님 그리고 로빈님께 감사의 말씀을 드립니다. 그리고 무엇보다도 박근핵닷컴이 성공적으로 마무리될 수 있도록 많이 이용해주시고 응원과 격려를 해주셨던 모든 분들께 감사의 말씀을 전합니다.


끝으로 저희 팀은 박근핵닷컴이 목적을 달성했기에 이제 각자의 본업으로 돌아가지만, 저희가 무엇을 할 수 있는지에 대한 고민은 멈추지 않을 것입니다. 후에 저희의 재능으로 이 사회에 도움이 될 수 있는 기회가 또 온다면 그때 다시 찾아뵙겠습니다.

긴 글 읽어주셔서 감사합니다.


#박근핵닷컴이_이룬_기록들

  • 오픈 이틀만에 포털 3사 실시간 검색어 1위
  • 오픈 일주일간 총 청원 수 약 93만
  • 오픈 일주일간 총 방문자 수 약 319만
  • 오픈 일주일간 총 방문 수 약 535만
  • 박근핵닷컴 관련기사 총 432건
  • 구글트렌드 2016년 올해의 검색어 <뉴스/사회> 부분 3위
출처 : 구글트렌드 (https://www.google.co.kr/trends/yis/2016/KR)

#그리고_남은_이야기

  • 어느날 한 정당 의원들이 같은 시간, 같은 IP 주소를 통해 이메일을 단체로 확인했었는데, 알고보니 당시 해당 정당은 국회의사당에서 회의 중 이었다고.. (회의에서 박근핵닷컴 얘기가 나온건가..?)
  • 자신이 박근핵닷컴 개발자라 사칭한 사람도 등장..
  • 생활코딩에 박근핵닷컴 관련 포스트가 올라온적이 있었는데, 포스트와 답글에 개발자 분들이 모두 좋은말 많이 해주셔서 으쓱

박근핵닷컴 비하인드 스토리 더 보기: