파이콘 한국 2019 LINE 저장소 PR 기여 이벤트 운영 후기

행사 기획하기

처음 파이콘에서 LINE 부스 운영을 기획하면서 코딩 이벤트를 시작하기로 할 때, 파이썬 프로그래머가 재밌게 참여할 수 있으면서도 LINE다움을 유지할 수 있는 것이 어떤 것이 있을지 고민하였습니다. 사실상 코딩이 거의 없는 이벤트부터 상당히 어려운 단계의 경연까지 다양한 논의가 있었는데, 역시 LINE을 활용하는 쪽으로 코딩 이벤트를 설계하는게 좋겠다고 생각했고, 파이썬 기반의 파이콘 한국 도우미 챗봇을 만들어보자는 아이디어로 연결되었습니다.

그리고 LINE 메신저를 꼭 사용하지 않아도 챗봇을 활용할 수 있는 방법을 제공하고 기능을 쉽게 더 할 수 있는 잘 구성된 준비 틀이 주어져 있다면, LINE을 사용하지 않는 사용자더라도 쉽게 참여해볼 수 있겠다고 생각하게 되었습니다.

 

준비 틀 만들기

앞서 언급한대로 준비 틀을 잘 제공하는 것이 가장 중요했습니다. 다양한 논의 끝에 준비 틀의 요건을 아래와 같이 정했습니다

  1. 챗봇은 웹으로도 접근 가능하고, 로컬 개발 환경에서도 쉽게 띄울 수 있을 것
  2. 예시 구현 기능을 읽는 것만으로 직관적으로 개발할 수 있을 것
  3. 챗봇의 기능은 파일 단위로 나누어 Pull Request(PR) 시 충돌이 나지 않는 구조를 갖출 것
  4. CI/CD를 잘 준비하여 행사 중 리뷰와 병합 비용을 줄일 것

준비 팀으로서 가장 처음에 부담되었던 부분은 역시 웹 UI를 제공하는 것이었습니다. 추상화된 챗봇 인터페이스를 설비하는 것은 어려운 일이 아니었으나, 웹 UI를 만드는 일은 다른 모든 일을 합친 것보다 10배는 더 작업량이 많아 보였습니다.

무난하게라도 UI를 제공하려는 순간, 불현듯 Bootstrap 기반의 LINE 디자인 시스템인 koromo에 LINE 챗 UI를 모두 구현해두었던 것을 본 기억이 났습니다. 해당 디자인 시스템은 외부에 공개된 것은 아니었으나, 제작팀에 질의해보니 공개 UI에 사용하는 것은 문제가 없다는 답변을 듣고 koromo를 바로 이용하기 시작하였습니다. 무엇보다, LINE 데스크탑 챗 UI를 예시로 구현해둔 페이지를 사내에 제공하고 있어, 이를 이용해 하루만에 웹 UI를 구현할 수 있었습니다.

2번과 3번 요건을 충족시키기 위해서는 데코레이터를 활용한 스킬 추가 구조를 준비하였습니다. Flask와 같은 마이크로프레임워크를 통해 많이 학습된 만큼, 데코레이터를 활용한 간결한 확장구조는 여러 참여자가 익숙할 것이라 예상하였습니다. 

@add_skill(r'장소', help_text='파이콘 2019 행사가 열리는 장소를 알려드릴게요.')
def get_location(message):
return LocationSendMessage(
title='장소',
address='서울 강남구 영동대로 513 (삼성동) 코엑스 그랜드볼룸',
latitude=37.5130556,
longitude=127.0586111
)

마지막으로 CI는 flake8 등을 더해 문법 검사를 참여자가 스스로 수행할 수 있도록 하고, CD는 zappa를 이용하게 하여 행사 기간 중 챗봇 서버 운영에 대한 부담을 최소화하면서도 손쉽게 자동화할 수 있었습니다. 다행히도 해당 구조에서 행사 기간 중 운영 사고는 0건을 유지할 수 있었습니다.

 

오픈소스 프로젝트화 준비하기

챗봇 코딩 이벤트인만큼 해당 저장소는 오픈소스 프로젝트화하였습니다. LINE은 Github에 Armeria와 같은 유수의 오픈소스 프로젝트를 운영하고 있기 때문에, 오픈소스 프로젝트로서 준수해야 할 다양한 여건들을 함께 지원받을 수 있었습니다.

  1. 라이선스는 가장 우려 사항이 적고 서로 부담이 적은 Apache 2 라이선스를 채택하였습니다.
  2. README에 LINE의 Code of Conduct와 파이콘 한국의 Code of Conduct를 모두 준수하도록 명시했습니다.
  3. ICLA(Individual Contributor License Agreement)를 준비하여 기여한 코드가 LINE Github 저장소에 포함되어도 추후 문제가 없도록 했습니다.
    PR이 오면 ICLA에 동의를 했는지 확인하고, 동의가 안되었으면 동의를 요청하여 동의 후 병합 했습니다.

해당 사항들은 놓치기 쉬운 부분이었는데, LINE 오픈소스 담당자인 이서연 님께서 짧은 준비 기간임에도 불구하고 꼼꼼하게 챙겨주셔서 부족함 없이 준비를 마칠 수 있었습니다.

 

행사 운영하기

이런 PR 행사는 처음이어서 걱정이 많았습니다. 그래서 행사 며칠전에는 ‘문제가 생길수도 있으니 그냥 하지말까’라는 생각이 들어서 의견을 구하기도 했습니다.

  • 사람들이 너무 PR을 날리지 않아서 너무 썰렁한 행사가 되면 어떻게하지?
  • 사람들이 너무 PR을 많이 보내서 우리가 감당하지 못하면 어떻게 하지?
  • 혹시나 관리의 허점이나 보안이슈가 있어서 해킹, 어뷰징 등으로 봇이 악용되면 어떻게 하지?
  • 행사가 주말이라서 진행을 도와줄 인원도 한정적이고, 무엇보다 이 봇의 틀을 만들어주신 재석 님이 출장인데, 괜찮을까?

최종 README는 지금도 Github에서 확인하실 수 있는데요, history에 고민하면서 수정했던 흔적들이 남아있습니다.

LINE 개발자들의 의견을 구해서 아래와 같은 보안 제약사항을 추가 했습니다.

> “os, sys, eval 등 보안에 문제될 수 있는 코드는 거부될 수 있습니다.”

LINE 서버가 아닌 AWS 람다를 쓰고있었기 때문에 큰 걱정은 없었지만 다양한 방법으로 key값에 접근하는 시도를 막기 위해서 추가하였는데, 실제로 문제가 될만한 코드가 올라온 적은 없었습니다. 그리고 같은 이유에서 봇이 이상한 답변을 할 수 있는 가능성을 차단하기 위해서 외부 API 호출도 제한했습니다. 외부 API를 호출할 수 있었다면 훨씬 재미있을 수 있었겠지만, 뭔가 Code of Conduct를 위반할 만한 위험이 있다고 생각해서 막았는데 아쉬웠습니다.

PR이 올라오면 가능하면 빠르게 응대하고자 노력했지만, 부스도 운영해야 했기 때문에 그렇게 빠르게 응대하지는 못했습니다. 

PEP8, 어디까지 지켜야 하나?

많은 PR이 파이썬 코딩 스타일 가이드라인인 PEP8 준수하기에 실패해서 CI를 통과하지 못했습니다. PEP8 중에 한 줄에 79문자까지만 허용한다거나, 코드의 맨 마지막에 개행 문자가 있어야 한다든지 등으로 실패하였는데요.

Github에 자동으로 CI(travis)를 연동해 두었지만, 어디에서 실패했는지 에러 메시지를 보기까지는 몇 번의 클릭이 필요한데 찾기가 쉽지는 않아서 직접 코멘트로 수정을 요청하곤 했습니다(가위바위보게임 PR). 실제 파이썬 코딩을 할 때 이렇게 모든 PEP8을 준수하지는 않기 때문에 많은 분들이 혼란스러우셨던것 같습니다. 맨 마지막에 개행 문자가 빠져서 통과 못하는 경우는 그냥 직접 수정해서 테스트 통과시키기도 했습니다(안녕하세요 PR). 

실제 환경에서는 PEP8 중 여러가지 항목을 예외 처리하기도 하는데 이번 행사에서는 모든 PEP8을 패스하도록 하였습니다.

테스트는 역시 유용했다! 오픈 소스에서는 더욱…

재석 님이 정말 간단한 테스트를 몇 개 작성해 두었는데요, 운영하다 보니 생각보다 매우 유용했습니다. 비교적 간단한 수준으로 테스트 커버리지가 높진 않았지만, CI가 코딩 컨벤션을 점검해 주고 기초적인 요청/응답 과정에서 정상 동작인지 확인해주어 사람이 구동 사항을 직접 세세하게 확인해야 하는 부담을 덜었습니다. 테스트 보조로 행사장에서 PR을 리뷰해야 하는 팀원분들은 부스 응대, 세션 참여 등 다양한 일을 동시에 하면서도 여러 참여자의 PR을 늦지 않게 리뷰하여 병합할 수 있었습니다.

파이콘 LINE 부스 안에서 열심히 PR을 병합하고 있는 박민우(왼쪽) 이상엽(오른쪽)
PR 보내주신 분들께 이메일로 연락해서 둘째 날 열린점심 이벤트에 초대해서 도시락을 같이 먹었습니다.

작은 에피소드들

운영하면서 기능을 추가할 때 명령어 리스트를 수정할 필요가 없게 고치기는 했지만, 초반에는 명령어를 추가하기 위해 파이썬 리스트를 수정해야 했습니다. 이때 리스트에서 trailing comma를 꼭 넣어달라고 하지 않아서 PR끼리 충돌이 많았는데, 충분히 예상할 수 있었던 문제임에도 불구하고 미리 가이드하지 못했습니다.
그리고 Github에는 PR을 생성할 때 본문의 틀을 만들어주는 기능이 있는데요. 행사 운영 중에 PR 본문 내용 템플릿을 추가하면서 root 폴더에 그냥 pull_request_template.md를 만들었더니 코드 작성 없이 이 파일을 수정해서 PR을 보내는 경우도 꽤 들어왔습니다. 이런 오해를 방지하기 위해 pull_request_template.md 파일을 바로 .github 디렉토리 안으로 옮겨두었습니다.

 

행사 후기

이번 행사를 통해서 처음으로 PR 보내보신 분들이 많았습니다.

각양각색인 여러 사람의 코드를 읽어보면서 제가 생각하지 못했던 기능들과 스타일을 볼 수 있어서 새롭고 재미있는 경험이었고, 오픈 소스의 매력을 다시 한 번 느낄 수 있었습니다. 가위바위보 게임, 인사 봇, 랜덤 동전 던지기, 다양한 방법의 파이콘 행사 조회 및 검색, 그리고 세션 추천 등 재미있는 기능들을 많이 기여해 주셨습니다. 

이번 PR 행사는 매우 성공적이라고 생각합니다.

  • 너무 많지도 너무 적지도 않은 분들이 참가했고
  • 많은 분들이 처음으로 PR을 날려보거나 간단한 코딩으로 즐거움을 느끼셨고
  • LINE 기반으로 간단한 오픈소스를 만드는 경험도 많은 분들이 즐거워하셨습니다.

PR을 보내주신 분들께는 LINE Developers 물병이나 볼펜 등의 상품을 드렸는데요, 보내주신 코드를 보면 상품을 위해서 라기보다는 코딩 이벤트 자체를 즐기신 분들이 많았던 것 같습니다.

파이콘 라이트닝 토크에 등장한 참가자의 후기

파이콘의 마지막은 언제나 짧은 발표로 이루어진 라이트닝 토크가 장식하는데요. 2일차 중에서도 맨 마지막 발표였던 유희열 님의 슬라이드에도 PR 이벤트 참가 이야기가 담겨있어서 공유합니다.

유희열 님은 다른 봇을 간단하게 수정한 Hello 봇을 만들어서 PR을 보내셨는데요.

‘Newline 없음’ PEP8에 걸렸으나.. 너무 사소한 것이라서 제가 직접 수정해드렸답니다.

다음에도 재미있는 행사로 여러 개발자분들을 만났으면 합니다.