2017부터 2018년에 대해서 회고를 남기려고 한다. 어느때보다 치열하고 열심히 달려온 한해였다. 다음은 한해동한 진행했던 일들의 대한 목록은 다음과 같다.

  • AWSKRUG
  • 회사
  • 강의 활동 

AWSKRUG

개발자 커리어에서 가장 크게 영향력을 준 모임이다. AWSKRUG는 Amazon Web Service Korea User Group의 약자로 AWS 한국 사용자 그룹이라고도 불린다. 이 모임에 처음으로 참여하게된 것은 2017년 4월 쯤이었다. 지난 2년여간 데이터 사이언스 그룹을 시작으로 거의 모든 모임에 참석하였다. AWSKRUG 통해 많은 것을 배울 수 있었다.

시작하게 된 계기

이전의 회사에서도 많은 개발을 맡아서 진행했는데 대표적으로 DevOps, Front-end 그리고 Back-end였다. 그냥 풀스택 개발자였다. 솔직히 풀스택은 말도 안된다고 생각을 했었는데 깊이에 대해서 어느정도 포기하면 풀스택 개발자로 될 수가 있었다.

AWS를 통해 서비스가 돌아가게 설정한다. Jenkins를 통해 자동으로 배포하는 스크립트를 짠다. React 튜토리얼을 기반으로 연습하고 이를 프로덕션에 적용한다. 백엔드는 Spring과 Node.js를 비교하여 개발 속도를 확인해보고 Node.js를 선택한다. 그리고 제품을 만든다. 이 모든과정을 2017년에 진행했었다. 튜토리얼에 의존하였다. 이런 상황에서 여태까지 사용했던 것들이 내부적으로 어떻게 동작하는지 이해가 부족하였다. AWS와 Docker에 대해서 어느정도 사용할 줄은 알았지만 DevOps의 대한 실전 테크닉이 부족하였다. 사내에서 성장을 하기 위해 문서와 블로그에 의존했다. 이 상황에서 같은 공부를 하는 누군가와 토론을 하고 싶었다. Use Case들을 공유하며 새로운 방법들을 찾고 싶었다. 그런 상태로 2017 AWS Summit에 참가하였고 새로운 세상이 열렸다.

커뮤니티는 새로운 세상이었다. 이전에 “나는 프로그래머다"를 가끔 들었는데, 이때 Summit의 현장에서 정도현님을 처음 만났다. 도현님이 AWSKRUG라는 모임에 대해서 설명해주었다. 누구나 참여할 수 있다고 하였다. 이때부터 모임을 시작하였다. 커뮤니티는 회사와 달리 기술에 대한 공부가 주목적이기 때문에 시간을 내어 저녁에 참여하기만 하면 되었다. 그렇게 데이터 사이언스 모임을 시작했다. 새로운 지식에 목말라 있었기 때문에, 퇴근 후 모든 모임에 참석하였다. 처음 접해보는 지식들을 흡수하기 위해 노력했다.

가장 빠르게 기술을 습득하는 방법을 실제로 서비스를 사용해보는 것이다. 업무에 적용할 수 있으면 바로 테스트해보았고, 만약 업무와 상관이 없다면 발표하겠다고 먼저 말했다. 그 다음 틈나는대로 공부하고 실제로 데모를 만들면서 모르는 것에 대해서 공부하는 재미를 들였다. 이 뿐만 아니라, 워크샵이 예정되어 있다면 도우미로 참여하여 워크샵 이전에 여러번 실습을 진행했다. 그리고 당일에 한번 더 데모 시에 발생하는 문제들을 해결하며 기술들에 대한 디테일에 대해서 공부하였다.

AWS re:Invent 2017

이런 공부들을 발판 삼아, 2017년 AWS re:Invent 행사에 참가했다. 이때 처음으로 해외 행사에 참여해보았는데 개발을 바라보는 시선이 바뀐 계기였다. 또한 스스로 크게 성장할 수 있었다. 그 당시까지 AWS에서 나온 서비스들에 대해 그 자체만으로도 엄청난 기술이라고 생각하고 있었다. 그런데 re:Invent에서는 현재를 뛰어넘는 서비스 및 기능들이 발표되었다. 또한, netflix와 같이 대규모 트래픽을 받는 회사의 개발자가 직접 경험을 공유하고, 실제로 AWS의 서비스를 만드는 개발자들이 직접 Q&A를 해주는 모습을 보았다. 이들은 개발할 때 고려한 점들, 그리고 앞으로의 진행 방향에 대해서 정확한 내용을 이해하고 구체적으로 설명해주었다. 굉장히 인상적이었다.

이뿐만아니라 같이 참석한 개발자 분들에게도 많이 배울 수 있었다. 매일 저녁마다 그날 들었던 세션에 대해서 공유하고, 현재 아키텍처의 문제점 및 나아갈 방향에 대해서 토론하였다. 눈을 떠있는 시간은 거의 모두 개발에 대해서 이야기를 나누었다. 작은 부분 하나하나 이해하기 위해 밤 늦게까지 토론했던 것은 잊지못할 추억이다.

서버리스 모임

리인벤트를 계기로 서버리스에 대한 관심이 급증하였다. 이전까지만 해도 컨테이너가 세상을 바꿀 것이라 생각했지만 서버리스는 컨테이너 이상으로 업무를 줄여주는 내용이었다. 한국에 오자마자 모든 서비스를 AWS Lambda로 적용하였다. 그리고 사용자의 갑작스런 증가에 대비하여 대규모 아키텍처를 적용하였다.

마침 2018년부터 AWSKRUG에서는 새로운 모임을 계획하고 있었다. 컨테이너 모임과 서버리스 모임이었다. 원래는 컨테이너 모임을 맡을지도 모르는 상태였다. 하지만 그 당시에 운영하는 모든 서비스가 이미 서버리스였기 서버리스 모임의 운영진이 되기로 결정하였다.

서버리스 모임을 운영하는 방법은 간단했다. 발표자 한두 명, 모임 공간, 그리고 간단한 간식 준비였다. 모임을 하기전에 참가비는 5000원으로 받고 행사 준비만 하면 되었다. 귀찮지만 어렵지 않은 일이었다. 운영진이어서 좋은 점은 발표주제를 들어보고 미리 주제에 대해서 고민할 수 있는 점이었다.

서버리스 모임에서는 주로 서버없이 Lambda, Glue 등의 서비스를 사용해서 운영의 리소스를 줄인 내용을 다뤘다. 각 발표자들마다 경험은 특별했고, 이에 대한 발표를 듣기위해 꾸준히 사람들이 참석했다. 한분 한분 소중한 경험을 공유해주었다.

모든 발표 내용은 여기에 정리해두었다.

2018년 9회의 핸즈온

AWSKRUG 모임에서 가장 많은 일을 맡아주시는 류한진님이 핸즈온을 계획했다. 처음에 얘기했을 때는 4회에서 6회 정도로 진행할 계획이었다. 하지만 점점 핸즈온을 진행하면서 괜찮은 주제와 진행자 분들이 생겨서 마지막까지 총 9회로 핸즈온을 마쳤다. 여름에 시작해서 초겨울까지 거의 매달 진행했다. 금, 토 일정을 모두 비워가며 진행했는데, 이 또한 성장하는데 많은 도움을 주었다. 컨테이너, 서버리스, 그리고 데이터 사이언스까지 거의 모든 장르를 아우렀다. 모두 좋은 내용이었다. 해당 내용은 여기를 참고 바란다.

그중 내가 맡았던 핸즈온은 서버리스 핸즈온이었다. Todo앱과 크롤러 핸즈온을 준비했다. 이때 준비했던 자료는 현재 E-Book으로 출판 대기중이다.

AWS re:Invent 2018

2017년에 이어 리인벤트에 참가했다. 이때 목표는 2017년과 달리 Workshop과 301/401 세션 위주로 들었다. 지난 1년간의 경험으로 어지간한 AWS 서비스를 써보았다. 하지만 각 서비스의 내용에 대해서 Deep Dive할 기회가 필요했다. 2017년과 반복된 세션은 이미 유튜브에 있기 때문에 새로운 관점에 대한 내용과 여태 다루지 않았던 내용을 위주로 세션을 들었다.

가장 기억에 남는 것이라고 하면 GitOps였는데 상세 내용은 여기를 참고하길 바란다. 간단하게 Pull-request에 의한 운영방식이다.

Microsoft

리인벤트 이전에 시애틀에 들려 Microsoft 캠퍼스와 AWS 캠퍼스를 견학했다. Microsoft에서 인상깊었던 점은 혼자서 코드를 작성하는 모습보다 여럿이서 모니터에 코드를 띄워놓고 토론하던 모습들이 많이 보였던 것이다. 그리고 Microsoft는 점심식사를 사먹어야했다. 사티아 나델리를 생각하며 카레를 먹고 싶었다. 하지만 인도음식은 없었기 때문에 몽골리안 음식을 먹고 무료로 먹을 수 있는 음료수를 열심히 마시며 다녔다.

AWS Spheres

AWS 캠퍼스는 내부를 돌아보지는 않고 Spheres를 둘러보고 식당에서 식사를 했다. AWS에서 근무하시는 안재우님이 가이드해주셨다. Spheres는 식물원같은 느낌이었다. 돈이 많은 회사면 건물앞에 식물원도 그냥 지을 수 있다고 생각했다. 식당의 밥은 쉬는날이라 그런지 맛이없었다. 그런데 비쌌다. 한국이 이런면에서는 일하기 좋을지도 모른다.

리인벤트 기간중에 재밌는 일이 있었다. CloudFront/API Gateway/Lambda를 아우르는 내용이었다. 리인벤트를 기준으로 한달 이전에는 신규서비스의 기반이되는 기능들이 추가되곤 한다. 이번에는 CloudFront의 웹소켓 지원이었다. 이걸보고 바로 API Gateway에 웹소켓이 붙을 수 있다는 생각이 들었고, 그렇다면 Lambda를 통해 웹소켓 어플리케이션을 운영할 수 있을 것이라 생각했다. 이에 대해 AWSKRUG Facebook에서 갑론을박이 있었지만 결과는 나와봐야 알 수 있었다. 리인벤트 마지막 날에 API Gateway 웹소켓 기능이 생긴 것을 확인할 수 있었고, Lambda에서 커넥션을 관리하는 데이터베이스를 통해 웹소켓을 구현한다고 문서도 공개됐다. 이것 때문에 리인벤트 첫날에 윤석찬님을 괴롭혔다. 일찍 라스베가스에 도착해서 둘이 얘기를 나누다가 Cloudfront만 웹소켓이 되면 람다도 분명히 웹소켓이 가능할거라 생각한다고 말했다. 그런데 해당 내용을 확인해보시겠다고 하면서 중간에 식사하러 가셨다. 이날 피곤했는지라 기다리다가 뻗었는데 이날 적잖이 당황했다고 말씀하셨다.

*1월 7일 추가 내용

API Gateway를 직접 만드시는 분에 의하면 Cloudfront의 웹소켓 지원과 API Gateway의 웹소켓 지원은 관련이 없다고 한다. 웹소켓을 Cloudfront는 전역적으로 지원하는 것과 달리, API Gateway는 Regional endpoint에서만 지원이 된다고 한다. 위의 잘못된 내용으로 오해하는 분들이 없길 바란다.

회사

개인적으로 회사일로 인해 크게 성장할 수 있었다. 현재 회사에서 주로 했던 일은 다음과 같다.

  • 서버리스 아키텍처의 적용
  • MongoDB 걷어내기
  • 인증서버 걷어내고 Firebase 적용
  • RDS MySQL에서 Aurora MySQL로 Migration
  • Typescript 도입
  • TIPS 준비

서버리스 아키텍처의 적용

서버리스 아키텍처를 적용하는 것은 솔직히 쉽지 않았다. 먼저 Lambda의 모든 옵션을 알아야만 했다. 그리고 Redis를 사용하기 위해 VPC에 대해서 더욱 자세히 알아야만 했다. 또한 VPC에서 외부 인터넷에 접근하기 위해 NAT를 두면서 네트워크 지식을 넓혀갈 수 있었다.

또한 기존 서버에서 운영하는 방식과 서버리스에서 운영하는 것의 차이점을 명확히 이해해야했다. API 응답을 한 후에 백그라운드에서 동작하는 로직을 수정했다.

콜드스타트를 줄이기 위한 방법들도 많이 생각했다.

이 부분에 대한 내용은 서버리스 그룹에서 주로 다룬다.

관련 발표내용은 여기을 참고 바란다.

MongoDB 걷어내기

몽고디비는 관리형 서비스를 올리고 싶으면 Atlas를 사용하는게 최선이다. 아니면 직접 운영하는 방법밖에 없다. 직접 운영하기 위해 Sharded Cluster를 올려보았는데 생각보다 고된 작업이었다. Config, Router, Replica set 등 서버를 한두대로 운영할 수 없었다. 처음부터 비용이 많이 나왔다. 설정하는 것도 몽고디비의 버전마다 차이가 있었기 때문에 Config 파일 관리하는 것도 귀찮았다. 저장하는 데이터들을 확인하고 걷어내기로 결심했다.

기존에 MongoDB를 Token 및 통계데이터 저장소로 사용했다. Token은 Firebase로 모두 이관했다. 또한, 통계 데이터는 RDB에 저장하고 몽고디비를 걷어내었다.

인증서버 걷어내고 Firebase 적용

Firebase를 적용하고 처음엔 좋았다. 굳이 Access Token들을 관리하지 않아도 되니 편했다. 그런데 서비스가 갑자기 성장함에 따라 구글 인증 API의 Limit에 걸려 서비스가 마비되었다. 이때 두번다시 Firebase를 사용하지 않겠다고 다짐했다. 내부적으로 Firebase와 구글 관련 기능은 인증 API를 호출하는데 이것 때문에 하루 할당량 한계를 넘었다. 토큰을 클라이언트 캐싱하고, 서버에서도 별도의 캐싱을 통해 인증 API로의 호출을 최소화하였지만 급작스런 사용자 증가로 인해 “Limit Quotas"를 초과하여 결국엔 장애가 발생했다.

여기서 더욱 문제였던 점은 구글의 지원을 받는데 많은 시간이 소요됐던 점이다. 두달전부터 예상하고 Limit increase를 몇번이나 요청했지만 묵묵부답. 그리고 Firebase에서 가장 많은 Support를 받는 Blaze요금제였음에도 불구하고 Support를 통해 답변은 한참뒤에 받을 수 있었다. 답변이 왔다고 할지라도 할당량은 증가해주지 않고 모든 모니터링 내역부터 증빙자료를 요청하는 핑퐁만 하루에 메일 한번씩하였고, 문제는 해결되지 않아 총 4일동안 장애에 대해서 속수무책이었다. 결국 구글의 서비스에 대해서 재검토해보겠다는 메일 발송 후에 이틀 후에 답변을 받았다. 결국 할당량을 5배로 늘려주었다.

구글의 서비스 정신을 엿볼 수 있는 경험이었다.

RDS MySQL에서 Aurora MySQL로 Migration

Aurora에서 MySQL 5.7 버전 지원하는 것을 보고 바로 이전 완료하였다. 일단 프로시저같은 것들을 사용하지 않기 때문에 백서를 기준으로 어렵지 않게 마이그레이션을 할 수 있었다.

Typescript 도입

이웅재님의 강의를 한 번 듣고 Node.js를 컴파일 언어처럼 사용해보고 싶어서 시험삼아 관리자 사이트를 모두 Typescript로 전환하였다.

Typescript 덕분에 Lambda의 환경이 Node 6.10이었음에도 불구하고 Async/Await를 적용할 수 있었다.

Webpack을 사용해서 기존 서버 코드를 1~3MB로 줄였는데, Lambda의 50MB의 코드 크기 제한에 많은 여유를 가져다주었다.

jQuery Good bye, welcome vue.js

기존 Legacy들은 jQuery로 되어 있었다. 여기서 데이터 바인딩이 복잡한 부분들은 모두 vue.js를 통해 재구현 하였다.

TIPS 준비

TIPS는 Tech Incubator Program for startup Korea의 약자로 스타트업을 위한 정부지원금 중 큰 금액의 프로그램이었다. 결국엔 떨어졌지만 과정속에서 많은 부분을 배울 수 있었다. 빅뱅엔젤스의 황병선 대표님과 최광선 이사님의 조언은 사업적, 기술적 관점에 대한 성장을 가져다주었다. 논문을 읽어보고 기술에 대해서 점점 깊이 빠져들때 묘한 기분이 들기도 했다. 거의 두달 간 기술의 진행방향에 대해서 몰입하며 지냈었다. 부족함을 알 수 있었고, 성장할 방향에 대해서 다시금 확인할 수 있는 경험이었다.

채용

채용은 개발자에게 가장 힘든 일 중에 하나다. 개발만 하는 것과 같이 함께할 동료를 선택하는 것은 완전히 다른 일이기 때문이다. 안드로이드 개발자를 채용하기 위해 최소한 가이드가 되어줄 수 있는 실력을 갖추어야만 했고, 채용할 사람이 나에게 함께 일하고 싶은 선택을 내릴 수 있도록 해야했다.

적절할 질문을 하고, 어떤 답변인지 고심을 해보고, 어떻게 성장할 수 있는 사람인지 상상해보고, 이 모든 것에 대한 이유를 명확히 내리는 과정을 여러번 반복했다. 4개월이 지나서야 좋은 분을 채용할 수 있었다. 함께 개발하는 즐거움을 다시금 느끼고 있다.

강의 활동

핸즈온 뿐만 아니라 개인적으로 별도의 강의도 진행했다. 양재동 코드랩의 조덕기님의 권유로 2017년 Docker강의를 시작으로 2018년에도 4회의 강의를 진행했다.

2017년에는 도커 2회, 2018년에는 서버리스 강의 2회, 도커 1회, 그리고 AWS 기초 1회를 진행했다. 개인적으로는 마지막 도커 강의에 아쉬움이 남는다. 이직한 후로 도커를 이전처럼 계속 사용할 일이 줄어들었기 때문에 수강자들에게 최신의 정보를 공유해주지 못했던 것으로 기억한다. 쿠버네티스를 강의자료에 넣었지만 설명을 정확하게 하지못하고 적절한 예제가 없어서 아쉬움이 남는다.

AWS 기초에 대한 강의는 12월에 진행했는데, 이전 3회의 강의에서 생각보다 초심자가 많았기 때문이었다. 예제 서비스를 실제로 배포하고 운영하는 것이 항상 마지막 단계였다. 이 과정에서 AWS를 사용했는데, 대부분의 수강자들은 AWS 계정조차 없는 경우가 많았다. 사전에 공지를 했음에도 불구하고 많은 수가 계정이 없었다. 또한 클라우드에 대한 개념을 버거워했기 때문에, A-Z라는 생각으로 계정생성부터 서버 운영 및 설정까지 강의를 진행했다.

강의는 개인적으로 공부했던 자료를 정리하는 좋은 계기가 되었다.

부산 밋업

주민규님의 제안으로 부산에서도 강의를 진행했다. 참석자는 많지 않았다. 30명 내외정도였다. 이때는 커뮤니티때 포털 검색어 순위에 대한 분석을 주제로 다루었다. 발표보다 개인적으로 여러 시니어 개발자 분들에게 많이 배웠다. 서울에서도 듣기 힘든 발표들을 먼 타지에서 열심히 들었다. 1박 2일동안 같이 다니면서 여태까지 개발했던 노하우, 그리고 개발자가 가져야할 덕목들, 업무를 진행할 때 가져야할 태도 등 강의 밖에서도 이야기를 나누면서 많은 도움을 받았다.

언젠가 나도 이런 시니어가 되고 싶다.

정리

회고는 개발자가 성장하기 위해서 필수적이라고 생각한다. 회고문을 남기는 것에 대한 강조가 아니다. 지난 생활에 대해서 반성을 해고 되짚어봐야한다는 얘기다. 지난 1년간 달려온 것들에 대해서 정리하는 것은 앞으로 나아갈 방향을 잡는데 많은 도움을 줄 것이라 생각한다.

나는 개발 경력이 그렇게 오래되지 않았다. 고작 몇년이다. 그런데 돌이켜보면 정말 하루도 빠짐없이 공부했고 빠르게 성장했다고 생각한다.

지하철에서는 개발 관련 블로그, 정식 문서, 그리고 유튜브에 있는 발표들을 본다. 관심있는 기술이 있으면 먼저 사용해보고 직접 올려본다. 그리고 지금까지 사용했던 기술과의 차이점에 대해서 생각해본다. AWSKRUG에서 다양한 개발자들과 관련주제에 대해서 질문을 던지고 여러 해답들을 듣는다. 잘 모르는 내용에 대한 컨퍼런스가 있으면 참가하고 지식의 폭을 넓힌다. 이런 생활의 반복이었다.

다짐

매번 성장하고 싶을 때마다 생각하는 것은 다음과 같다.

  • 자신한테 모든게 달렸다.
  • 하루도 빠짐없이 매일 반복하고 이해하기 위해 노력하면 어느새 성장해있다.
  • 안하는 건 있어도 못하는 건 없다. 방법은 결국 찾아낼 것이다.

이런 생각을 바탕으로, 2019년에는 Low-level 및 Core 단을 이해하는 개발자가 될 것이다. 그리고 AI 및 아키텍처도. 계속 달려보자.