들어가며
지구에서 별까지 가는 편안한 길은 없다. (Non est ad astra mollis e terris via).
- 루키우스 안나이우스 세네카
올 한 해는 유난히 많은 도전에 직면했었다. 우선 새로 옮긴 팀에서 나를 증명해야 하는 시간을 보내야 했고, 큰 프로젝트를 올해 안에 성공시켜야 했다. 뛰어난 동료들과 회사의 이름이 주는 압박감에 스트레스를 받기도 했지만, 반대로 큰 자극을 받고 앞으로 나아갈 수 있는 원동력이 되기도 했다.
1. 당근에서의 1년
매니저와의 첫 원온원에서 웹사이트 파트의 일을 3개월 정도 도와준 다음 웹뷰 파트로 합류하면 어떻겠냐는 제안을 받았다. 웹이 아닌 환경을 경험하고 싶다는 마음이 있었기 때문에 고민이 되었지만 결국 수락했다 사실 거절할 수 없었다. 처음에는 이런 상황이 조금 실망스럽기도 했지만, 회고하는 시점에서 생각해 보면 좋은 결정이었다고 생각한다.
올해 맡았던 업무는 크게 두 가지인데, daangn.com을 새로운 코드 베이스로 마이그레이션 하는 것과 해외의 SEO 지표를 우상향하게 만드는 일이었다.
1. daangn.com 마이그레이션
확실히 경력이 쌓일수록 날아가는 비행기의 엔진을 갈아 끼우는 일을 많이 하게 되는 것 같다. “daangn.com 마이그레이션”이라는 한 문장으로 요약할 수 있는 작업이지만 작업의 크기는 절대 작지 않았다. 진행했던 모든 작업을 상세하게 이야기 하자면 글이 한없이 길어질것 같아 상세한 내용은 다른 글에서 정리해 보려고 한다.
-
Next.js에 있는 국내 서비스 페이지를 remix 코드로 마이그레이션
- BFF에 맞는 형태로 API 개발 요청
- daangn.com 도메인에 연결되어 있는 모든 경로를 조사해서 새로운 경로로 리디렉션
- 콘텐츠 ID 통합
- 콘텐츠 객체를 저장하는 S3 KV store 구현
- 각 팀에서 필요한 API 구현
- remix 웹 서버 성능 개선
- 딥링크 및 appsflyer 통합
- 지표 통합
Ruby on Rails 서버와 Next.js같은 기존 코드베이스부터 nginx config, Cloudfront 등 인프라 설정까지 폭넓게 살펴보는 경험을 할 수 있던 프로젝트 였다. 나는 주로 서버와 인프라에 대한 작업을 진행했는데, 다른 부분은 같이 일하는 두 분이 잘 챙겨주고 계셨기 때문이다. 이 과정에서 사내 통합 API 인터페이스에 기여하기도 했고, 인프라에 대한 설정을 논의하면서 아이디어를 내기도 했다. 다행히 SRE팀에 아는 분들이 많았기 때문에 많은 도움을 쉽게 받을 수 있었다. 마이그레이션이 끝나고 난 뒤 kafka를 이용한 기능을 구현하기도 했는데, 이때도 중고거래팀과 공통 서비스 개발팀의 도움을 받아 쉽게 작업할 수 있었다.
기존 daangn.com 도메인에 연결되어 있는 모든 경로의 패턴은 bing webmaster와 작성한 크롤러를 이용해 전수 조사에 성공했다. 필요한 페이지들은 유지하면서 필요 없는 페이지들은 미팅을 통해 덜어내거나 각 팀에 오너쉽을 넘기는 일을 했다. 최상의 선택이 아닌 최선의 선택을 해야하는 일이 많았는데, 각 팀의 상황에 맞추어 솔루션을 제공하면서도 우리 파트의 일정이 늦지 않게 아이디어를 내는 일이 많았기 때문이다. 이 과정에서 거의 모든 기술팀과 소통하면서 당근의 서비스를 보는 시야가 넓어졌다.
원래 웹에 공개되어 있는 URL을 현재 URL 구조로 리디렉션 하기 위한 작업도 진행했다. 각 팀에서 관리하던 콘텐츠의 ID를 우리 파트가 관리하는 ID 체계로 통합하고, permalink 구조를 통일하는 일이었다. 이를 위해 리디렉션 프레임워크를 만들고 콘텐츠 ID 조회를 위해 sqlite를 사용했다. 그리고 규칙이 추가되거나 변경될 때마다 쉽게 테스트하기 위한 목적으로 puppeteer-cluster를 이용해 e2e 테스트를 작성했다.
remix 서버의 성능 개선을 위해 큰 규모의 리팩터링도 진행했고, BFF에 S3를 이용한 새로운 캐시 레이어를 추가하는 일도 했다. 사이트맵을 빠르게 제공하기 위해 HTML streaming 방식에서 정적 빌드 후 CDN에 배포하는 방식으로 바꾸었고, karrotmarket.com과 항상 함께 배포되던 sanity admin의 배포도 분리했다. 서비스 가시성 확보를 위해 로거를 도입하기도 했다.
이렇듯 다양한 부분에서 작업을 했고, 폭넓은 경험을 할 수 있었다. 작업을 통해 배운 것을 추려보자면 다음과 같다.
- HTTP에 대한 이해도가 크게 높아졌다. 캐시, 헤더 등 HTTP의 기본 스펙을 직접 다루면서 이론으로만 알고 있던 것을 직접 체험할 수 있었다.
- HTTP 상태코드가 중요하다는 것을 알게 되었다.
-
대규모 리팩터링
- 구현의 중복과 선언의 중복을 구분해야 한다.
- 제품의 라이프 사이클을 염두에 두고 변수를 선언해야 한다.
- 원래 잘 동작하고 있는 코드를 리팩터링하기 위해 어떤 형태의 테스트를 작성해야 하는지 알게 되었다.
-
모니터링 스킬이 향상되었다.
- 특히 몇 번의 장애를 통해 많이 늘었다. 이제는 datadog, grafana를 보는 것이 어색하지 않다.
- 로거를 잘 설정해야 장애에 빠르게 대응할 수 있다는 것을 체득했다.
-
모바일과 연결되는 생태계를 경험했다.
- 딥링크, 앱스킴, 앱링크, 유니버셜 링크, 지연된 딥링크 등 모호하게 알고 있던 개념을 알게 되었다.
-
다양한 관점에서 기술을 생각해 볼 수 있게 되었다.
- S3 캐싱, HTTP 상태코드, gRPC, 리디렉션 프레임워크, fastify plugin, decorate 함수 등 앞으로 개발 일을 하면서 많은 레퍼런스가 될 경험을 했다.
- 선언적인 무언가(json, yml)를 통해 복잡한 구현부를 자동으로 생성하게 만드는 것(메타 프로그래밍)은 유용하다는 것을 다시 한번 알게 되었다.
-
코드의 복잡도 때문에 제품의 퀄리티를 포기하면 안 된다는 것을 깨닫게 되었다.
- 코드의 복잡도가 걱정된다면 복잡하지 않은 코드를 작성하면서도 요구사항을 달성할 수 있는 방법을 찾아야 한다는 것을 배웠다.
무엇보다 마이그레이션을 주도적으로 계획하고 실행하면서 스스로 고민하고, 결정하고, 책임지는 연습을 할 수 있었던 것이 큰 수확이었다. 이 역할을 매니저인 토니가 기꺼이 나에게 양보해 주어서 굉장히 고마웠다. 더불어, 든든한 팀원들이 있었기에 혼자 엔진을 갈아 끼우지 않고 같이 갈아 끼울 수 있어 너무나 행복한 경험이었다.
2. SEO
결론부터 이야기 하자면, SEO를 다시 배웠고 아직도 학습하고 있다. 그동안은 단순히 SEO는 SSR을 하고, meta tag만 잘 설정하면 된다고만 생각했다. 하지만 1년간의 경험을 통해 생각보다 더 넓고 깊고 오묘한 세계라는 걸 깨달았다. 캐나다와 일본에서의 사업 확장을 위해 웹사이트의 SEO가 상당히 중요했고, kijiji, メルカリ같은 쟁쟁한 경쟁자들의 틈을 비집고 들어가야 하는 일이 주어졌다. 이를 위해 URL에 지역성을 표현하기 위한 큰 규모의 리디렉션 처리를 두 번 진행했고, 자연스럽게 키워드와 백링크를 노출하기 위한 작업을 진행했다. meta tag와 각 페이지의 H1 tag를 다듬고 LD json을 설계해 페이지에 추가했다. 운영의 편의성과 검색엔진에 대응하기 위해 콘텐츠의 변경을 kafka 메시지로 수신해 캐시를 무효화하고 indexnow API를 요청하는 작업도 진행했다.
사실 나는 이 분야에 대해 잘 알지 못했기 때문에 주로 팀의 결정을 따라갔음에도 많은 사실을 알 수 있었다.
- 키워드를 잘 선정해야 한다.
- URL이든 콘텐츠의 내용이든 웹에 공개하려고 하는 콘텐츠는 지역성이 중요하다.
- 구글의 크롤링봇은 콘텐츠 간의 연결을 중시한다. 크롤링봇의 동작을 조금이나마 이해하려면 스스로 크롤러를 만들어보면 좋다.
- 각 웹마스터 도구에 있는 index 제외 기능은 본질적으로 문제를 해결하지 않는다. HTTP status code를 통해 콘텐츠의 상태를 주장하는 것만이 해결 방법이다.
- 결국 양질의 콘텐츠를 얼마나 잘 보여주느냐가 문제이다.
내년에는 조금 더 주도적으로 SEO 관련 업무를 진행해서 더 많은 이야기를 하고 싶다.
3. Soft skill
우리 회사의 대표적인 문화는 자율과 책임, 신뢰와 충돌이다. 돌이켜보면 1년간 저 문화에 녹아들기 위해 부단히 노력했고, 나에게는 실제 업무보다 더 힘든 도전이었다. 하지만, 이 도전 덕분에 ‘개발하는 것’을 넘어 ‘제품’의 영역에 관심을 두게 되어서 굉장히 긍정적이라고 생각한다.
굳이 내가 무엇을 할지 생각할 필요가 없는 조직에서 일하다가 팀에 합류하니 거의 무한에 가까운 자유가 주어졌고, 그 누구도 나에게 세세한 업무를 주지 않았다. 더군다나 팀의 특성상 PM과 디자이너가 없었기 때문에 팀원들이 아이디어를 내고 실행에 옮기는 것까지 모두 담당해야 했다. 처음에는 개발자끼리 제품을 만들어가는 것이 굉장히 생소했고, 아이디어 회의에서 몇 마디 하지도 못했다. 하지만 아이디어가 거절당할까 봐 무서워하지 않는 연습과 기꺼이 다른 사람의 아이디어에 동의하지 않을 연습을 꾸준히 하면서 지금은 많이 나아졌다고 생각한다. 더불어 예전에는 크게 관심을 가지지 않았던 지표를 설계하고 분석하는 연습까지 하고 있다.
한편으로는 다른 팀과 협업을 많이 하면서, 처음 보는 상대와 신뢰를 쌓는 방법과 우리의 요구를 세일즈하는 방법을 배우기도 했다. 의견 충돌이 심할 때는 어떻게든 해결책을 찾아내어 결국은 일이 진행되는 방향으로 수렴하기 위해 부단히 노력했다. 재미있는 사실은 해결책을 찾아내는 과정에서 기술적인 성장도 있었다는 것이다.
4. 후회되는 것
적극적으로 제품에 대한 아이디어를 내지 못한 것이 가장 후회된다. 매니저가 챕터에 기여할 수 있는 좋은 기회를 주었는데도 거절해 버린 것 역시 후회된다.
2. 개인적인 일
1. 와이프 이직
아내가 올해 4월 재취업에 성공했다. 이전 직장을 퇴사하는 과정도 순탄치 않았고 6개월 정도 마음고생이 심했을 텐데 포기하지 않아 너무나 감사했다. 지금은 재취업한 회사도 재미있게 다니고 있고 스스로 할 일을 찾아서 하는 등 굉장히 만족하고 있는 것 같아서 다행이다.
2. 당근 수습 통과
솔직히 안될 줄 알았는데 3개월 간의 수습 기간을 무사히 마치고 정직원이 되었다. 수습 통과를 위해 많은 도움을 준 팀원들에게 정말 감사하다고 말하고 싶다.
3. 루이 입양
올해 1월에 루이를 입양했다. 발치 수술도 하고 왼쪽 앞다리가 골절되기도 하는 등 우여곡절도 많았지만, 이제는 빼놓을 수 없는 우리 가족이 되었다. 애교도 많고, 겁도 많고, 엄살도 심하고, 장난도 심한 친구이지만 우리 부부에게 주는 것이 많아 참 고마운 존재이다. 여담으로, 루이를 키우면서 보여준 나의 새로운 모습에 아내가 정말 놀라게 되었다고 한다 그동안 어떻게 생각한 거지. 야근도 하지 않고, 꼬박꼬박 하루에 두번 산책시키고, 씻기고, 놀아주기도 하는 등 루이를 엄청나게 아끼는 모습에 놀랐다고 한다 사실 나도 스스로 놀라긴 했다.
4. 자동차 계약
이것도 힘들 줄 알았는데 40살이 되기 전에 자동차를 구입했다. 새 차를 일시금으로 구매했는데 그동안 쏘카를 어떻게 이용했나 싶을 정도로 삶의 질이 크게 개선되었다. 지금은 주로 아내가 출퇴근용으로 사용하고 있는데, 나는 슬쩍 차를 얻어 타고 역까지 편하게 가고 있다.
4. 그 밖의 일들
1. 멘토링
작년 인프콘에서 처음 뵙고 멘토링을 해드린 분이 올해 취업에 성공하셨다. 나도 처음 이 일을 시작했을 때 많은 분들에게 과분한 도움을 받았었는데 조금이나마 돌려드린 거 같아 큰 기쁨을 느꼈다. 앞으로도 개인 멘토링은 요청이 있다면 지속적으로 해볼 생각이다.
2. 읽었던 책들
올해는 많이 못 읽어서 반성에 반성을 거듭했다.
- 레거시 코드 활용 전략
- 내 코드가 그렇게 이상한가요?
- Node.js 디자인 패턴 바이블
세 권밖에 읽지 못했지만, 얻은 지식은 daangn.com 마이그레이션 프로젝트에서 아주 요긴하게 사용했다.
3. 혼란스러운 대한민국
뜬금없이 12월 3일에 비상계엄령이 내려졌고 또 한 명의 대통령이 탄핵 소추되는 현장을 목격했다. 환율은 계속 오르고, 번화가에 나가면 경기 불황이 체감되어 걱정스러운 마음이 크다.
5. Conclusion
올해는 스스로 일을 만들어 가는 과정을 경험했다. 제품과 코드를 대하는 방식을 다시 생각해 보게 되었고, 뛰어난 동료들을 통해 많은 인사이트를 얻었다. 반대로 제품과 챕터를 위해 적극적으로 행동하지 못한 것이 후회된다.
내년에는 제품과 챕터에 더 적극적으로 기여해서 성과를 만들어 내고 싶다. 프론트엔드 엔지니어가 아닌 프로덕트 엔지니어로, 다른 동료에게 영향을 줄 수 있는 시니어 엔지니어로 한 단계 더 성장하고 싶다.
마지막으로 1년 동안 좋은 경험을 할 수 있게 도와준 동료들에게 감사의 뜻을 표하고 싶다.