2024 회고

작성 날짜

2024년은 나의 관심사, 기술, 경험, 그리고 인간관계가 확장된 뜻깊은 한 해였습니다.

무엇보다 성장하는 즐거움을 넘어, 내가 누군가에게 도움이 되는 존재임을 느낄 수 있었기에 더욱 특별했습니다.


작년 이맘때쯤, 스스로에게 던진 질문이 있었습니다.

‘나는 가치 있는 팀원일까?’

내가 맡은 역할은 누가 와도 비슷하게 해낼 수 있다고 생각했습니다. 그렇다면, 대체 불가능한 팀원이 되기 위해 나는 팀에 어떤 가치를 더할 수 있을까 고민했습니다.

그 고민 속에서, 팀이 더 효율적으로 일할 수 있는 환경을 만들기 위해 노력했습니다. 어려운 개발 용어 대신 모든 직군이 이해하기 쉬운 말로 소통하며, 반복적이고 번거로운 작업은 자동화 시스템을 만들어 간소화했습니다.

또한, 개발이 어렵다는 이유로 기획 단계에서 기능이 배제되는 일이 없도록 현실적으로 구현 가능한 방법을 제시하거나 사용자 경험을 유지할 수 있는 솔루션을 제안했습니다. 어떤 문제든 해결할 방법이 있다고 믿으며, 문제를 해결하고 팀의 목표를 함께 이루는 데 기여하고자 했습니다.


올 한 해는 우리 팀에서 일할 수 있음에 깊이 감사함을 느낀 시간이었습니다. 특히, 팀원 한 분 한 분이 만들어 내는 긍정적인 영향력이 얼마나 중요한지 깨달았고, 그 영향들이 모여 나 또한 더 나은 영향을 주기 위해 고민하는 나 자신을 발견할 수 있었습니다. 이런 깨달음을 모를 때에 팀에 합류했던 제가 얼마나 운이 좋은 사람인지 새삼 느낍니다.


매 순간 함께하며, 내가 조금이나마 기여할 수 있었다는 점에 큰 감사함을 느낍니다. 앞으로도 팀 목표에 보탬이 되는 개발자가 되고 싶습니다.

💬

내가 우리 팀에 작은 도움이 될 수 있음에, 내가 개발을 할 수 있음에 감사하다.


1월~3월 - 주간 회고 진행

3개월 동안 매주 금요일 주간 회고를 작성했습니다. 이는 사수님의 제안으로 시작되었는데, 회사에서 다양한 프로젝트와 많은 업무를 진행하며 주간 회고의 필요성을 느낀 덕분이었습니다.


주간 회고는 아래와 같은 형식에 맞춰 작성했습니다:

Facts: 어떤 일이 있었는가? Feeling: 느낀점. 어떤 느낌이 들었는가? Finding: 배운 점. 어떤 것을 기억하고 싶은가? Future Action: 앞으로 무엇을 할 것인가?


매주 회고를 작성하며 스스로를 돌아보고 성장할 수 있었고, 작성한 회고 중에서도 기억에 남는 몇 가지 이슈를 선정해 정리해 보았습니다.


Facts: Google 스프레드시트를 활용한 next-intl 번역 파일 관리

국제화 서비스 특성상 번역 기능이 필요했고, Next.js 환경에 최적화된 next-intl 라이브러리를 도입했습니다. next-intl은 언어별 JSON 파일로 번역 텍스트를 관리하며, 이를 messages 형태로 컴포넌트에 전달해 손쉽게 다국어 지원을 구현할 수 있도록 설계된 라이브러리입니다.

하지만 번역 작업 요청을 드릴 때 다소 번거로웠습니다. JSON 파일을 공유드리면, 번역된 텍스트를 노션이나 엑셀로 전달받아 다시 JSON 파일에 하나씩 등록하는 과정이 반복되었기 때문입니다.

번역량이 늘어나면서 더 직관적이고 효율적인 관리 방법이 필요해졌고, 이를 해결하기 위해 Google Sheets API를 활용한 자동화 시스템을 개발했습니다. 이 시스템은 번역 작업을 더 쉽게 만들고, 개발자의 반복 작업 부담도 크게 줄일 수 있었습니다.


프로세스를 간단히 정리하면 다음과 같습니다:

  1. GCP(Google Cloud Platform)에서 Google Sheets API 활성화 및 서비스 계정 생성
    • Google Sheets API를 활용하기 위해 GCP 프로젝트 설정
    • API에 접근할 수 있는 서비스 계정을 생성
  2. Google 스프레드시트에 서비스 계정 공유
    • 번역 관리용 스프레드시트에 서비스 계정을 편집 권한으로 추가해 데이터 연동
  3. 서비스 계정 Credential Key를 사용한 JSON 파일 변환 스크립트 실행
    • 서비스 계정의 Credential Key를 사용해 스프레드시트 데이터를 읽어 각 언어별 JSON 파일로 변환하는 스크립트를 작성 및 실행

(*시간이 될 때, 해당 방법에 대한 별도의 글로 정리하여 링크를 걸어두겠습니다.)


이 작업으로 모두가 쉽게 번역 파일을 관리하고, 번역 작업에 소요되는 시간도 크게 줄일 수 있었습니다.

이후 비슷한 요구 사항을 가진 다른 국제화 프로젝트에서도 이 방식을 재사용하며, 처음에 시간을 들여 체계적으로 구축해 두는 것이 얼마나 중요한지 깨닫게 되었습니다.



Facts: SearchParam 조작으로 인해 잘못된 데이터 접근 및 표시 가능성이 발생 Feeling: 잘못된 코드를 짜더라도 이를 지적해 주고 함께 개선해 줄 사수님이 있어서 다행이라고 느꼈다. Finding: B2C 서비스 설계 시, 사용자가 항상 기대한 대로 행동하지 않을 가능성을 염두에 두고, 다양한 접근 경로를 고려한 설계를 해야 한다는 점을 배웠다.

주간 회고에서 기억에 남는 두 번째 이슈는 리스트 페이지에서 사용하는 API 데이터를 상세 페이지에서 재활용하는 방법을 고민했던 사례입니다.


리스트 페이지 API 데이터를 재활용하기 위해 두 가지 방법을 고려했습니다.

  1. 전역 상태 사용..?
    • 상세 페이지 클릭 시 데이터를 전역 상태에 저장하려 했으나, 리스트 페이지를 거치지 않고 상세 페이지 URL로 직접 접근하는 경우 전역 상태가 초기화되어 데이터를 표시할 수 없는 문제 발생
  2. SearchParam에 저장하자!


데이터를 SearchParam에 저장한 PR에서 아래와 같은 리뷰를 받았습니다.

  1. SearchParam은 사용자가 직접 조작할 수 있어 신뢰할 수 없는 값이 될 수 있다.
  2. API 데이터가 변경되어도 이전 URL을 통해 이전 데이터를 보여줄 가능성이 있다.
  3. 잘못된 접근 시, 정확하지 않은 정보를 사용자에게 보여줄 위험이 있다.

사수님의 PR 리뷰를 통해 이러한 문제점을 깨닫고, 백엔드 개발자님께 상세 페이지 API에 필요한 데이터를 추가로 제공받을 수 있도록 요청드렸습니다. 최종적으로 리스트 페이지 데이터를 재사용하지 않고, 상세 페이지에서 독립적으로 데이터를 처리하도록 수정했습니다.

이 과정에서 데이터 신뢰성을 확보해야 하는 중요성과 유저 플로우 설계 시 예상치 못한 행동을 고려해야 한다는 점을 배우는 계기가 되었습니다.



Facts: Admin 서비스의 비용 절감을 위해 Next.js에서 Vite로 마이그레이션

사수님께서 관리자 페이지의 비용 최적화를 위해 Next.js에서 Vite로 전환을 제안하셨습니다. Vite는 서버 측 렌더링(SSR)이 필요하지 않은 관리자 페이지에 적합하며, 개발 속도와 비용 측면에서 여러 장점을 가지고 있었습니다. 이에 따라 Vite로의 마이그레이션을 진행하게 되었습니다.


Vite의 주요 장점

  • 개발 및 빌드 속도 향상 Vite는 esbuild 기반으로 개발 서버를 제공하며, 빠른 시작과 HMR(Hot Module Replacement)을 지원하며, 기존 Next.js 대비 더 가볍고 빠른 속도를 제공합니다.
  • 배포 과정 단순화 및 비용 절감 Vite는 Node.js 서버가 불필요해 배포 과정이 간소화되었고, 결과적으로 운영 비용을 크게 절감할 수 있었습니다.
  • 성능 최적화 기본적으로 제공되는 트리 쉐이킹, 지연 로딩, 모듈 사전 번들링과 같은 최적화 기술 덕분에 성능을 크게 향상시켰습니다. 또한, 로딩 시간이 단축되면서 사용자 경험도 개선되었습니다.

성과 지표

  • 빌드 속도

    • Vite(위): 약 29초
    • Next.js(아래): 약 1분 3초

  • JS 번들 크기

    • Vite(위): 164KB
    • Next.js(아래): 680.55KB

  • 첫 페이지 로드(JS)

    • Vite(위): 53.56kB (gzip 후)
    • Next.js(아래): 84.5kB

이 작업은 관리자 서비스의 성능과 비용 효율성을 모두 개선하는 데 의미 있는 성과를 가져왔습니다. 그리고 사수님께서 항상 새로운 도전 과제를 제시해 주시며 제 성장을 이끌어 주시는 점에 감사함을 느꼈습니다.

앞으로도 함께 배우고 성장하며 더 나은 결과를 만들어가는 개발자가 되겠습니다. 🙏



4월~8월 - 이벤트 프로덕트 외주 개발

올해 4월 첫 대면 미팅을 시작으로 많은 사람들과 함께 온전히 몰두했던 이 프로젝트는 12월 v1.0.0을 배포하기까지 시간이 순식간에 흘러갔습니다. 아직 추가 개발이 남아 있어 완전히 마무리되지는 않았지만, 기술적으로 한 단계 성장할 수 있었던 프로젝트였습니다. 외주 개발 프로젝트라 보안상 자세히 공유하기는 어렵지만, 간략히 기록으로 남겨보려 합니다.


이 프로젝트는 유저 참여형 서비스와 이를 관리하는 어드민 페이지를 함께 개발하는 작업이었습니다. 단순한 서비스로 예상했지만, 훨씬 복잡하고 섬세한 요구사항을 처리해야 했습니다. 노코드 툴과 보상 관리의 연동, 다양한 어드민 권한 레벨 처리, 에러 처리 등 여러 면에서 깊이 있는 고민과 정교한 작업이 필요했습니다.

그중 하나가 iframe을 통한 부모 웹과의 통신에서 발생한 문제였습니다.

유저 참여형 서비스를 iframe으로 구현했는데, 부모 웹 스토리지에 저장된 값을 가져와야 하는 문제가 있었습니다. iframe에서는 보안상의 이유로 부모 웹의 쿠키나 스토리지에 직접 접근할 수 없기 때문에, 이 문제를 해결할 방안을 찾아야 했습니다. 이 과정에서 PostMessage API를 사용해 부모 웹과 iframe 간에 안전하게 데이터를 주고받는 방법을 제안드렸고, 구체적인 코드 예시와 함께 의견을 공유했습니다. 결국 이 방법이 채택되었고, 제가 제안한 방식이 실제로 적용되는 것을 보며 작은 뿌듯함을 느꼈습니다.


프로젝트를 진행하며 점점 복잡해지는 비즈니스 로직들로 어려움이 많았지만, 그 과정에서 팀에 도움이 되는 개발자가 되기 위해 노력했던 제 모습이 떠오릅니다.



9월~11월 - 끝날 듯 끝나지 않는 QA

QA가 시작되면서 초반에는 QA 담당자분들이 정말 열심히 일을 해주시는 모습을 보며, 살짝 미운 감정이 들었던 적도 있습니다. ‘이런 분들이 있는 클라이언트사가 부럽다’고 말할 정도로, 매주 JIRA에는 수십 개의 버그 태스크가 쌓여갔습니다.


예를 들어, 글로벌 서비스다 보니 지역별 로컬 시간이 노출되어야 했는데 특정 표준시 약어가 정상적으로 표시되지 않는 문제가 발견되었습니다. ‘이 타임존도 QA를 한다고?’라는 생각이 잠깐 들기도 했지만 언젠가는 해결해야 할 문제이고, 누군가에게는 필요한 부분이라는 걸 깨달았습니다.

QA 담당자분들뿐만 아니라 우리 팀원분들 역시 자신의 업무 범위를 넘어 제가 놓칠 수 있는 부분들까지도 세심하게 확인해 주셨습니다. 작은 버그 하나도 귀찮게 여기지 않고 잡아내 주신 덕분에 프로덕트는 점점 더 견고해졌습니다. 그렇게 완성도가 높아질수록, QA를 진행해 주신 담당자님과 PM님께 감사한 마음도 함께 커졌습니다.

버그 수정하고 받는 따봉 이모지 하나가 열심히 하게 하는 원동력이었습니다 ㅋㅋ
버그 수정하고 받는 따봉 이모지 하나가 열심히 하게 하는 원동력이었습니다 ㅋㅋ


“버그를 추론하고 끈질기게 문제를 해결하기”

이것이 QA 기간 동안 제가 배운, 프로덕트를 만들 때 가져야 할 자세였습니다.


단순히 빠르게 만드는 것을 넘어, 디테일을 놓치지 않고 '더 나은 것을 만들기 위해' 고민하는 과정은 쉽지 않았습니다. 하지만 다양한 환경에서 안정성을 보장하고, 작은 버그 하나도 놓치지 않으려는 노력은 견고한 프로덕트를 만드는 즐거움을 느끼게 해주었습니다.

그 과정을 거치며 확신이 들었습니다.


나는 프로덕트 만드는 일을 정말 사랑하는구나.



12월 - 라이브 대응

Staging 환경에서 QA를 마친 후(물론 완벽한 프로덕트는 없기에 QA는 계속되었습니다…) 드디어 프로덕션 환경에 v1.0.0을 배포하게 되었습니다.


그리고 라이브 대응의 날이 찾아왔습니다. 당일 이미지 비율 관련 버그가 발생했지만, 다행히 치명적인 문제는 아니었고 금방 해결할 수 있었습니다. 이 외에도 예상치 못한 버그들이 있었지만, 팀과 함께 빠르게 원인을 파악하며 대응하는 과정을 통해 문제 해결 능력을 한 단계 끌어올릴 수 있었습니다.


신입 시절에는 그저 트래픽 많은 서비스를 만들어보고 싶다는 꿈이 있었습니다. 그런데 막상 트래픽 많은 서비스를 만들어보니, 모르고 있었던 책임감의 무게가 얼마나 무서운지 실감하게 되었습니다. 트래픽이 많은 서비스에서 오류가 발생하면 모두가 함께 만든 프로덕트이기에 누구 한 사람을 탓해서는 안 된다고 생각하지만, 그럼에도 큰 책임자는 존재합니다. 그 책임의 무게가 약간은 무섭게 느껴진다는 생각이 들었습니다.


결과적으로 이벤트 프로덕트를 통해 클라이언트사의 웹사이트 방문자 수가 400% 상승하고, 동시접속자 수가 1~2만 명에 달했다고 합니다. 실질적인 가치를 만들어내는 경험은 개발자로서의 시야를 넓히는 데 큰 도움이 되었습니다.


마무리하며 이 프로젝트는 단순히 기능을 만들던 개발자가 문제를 끝까지 해결하고, 다양한 환경을 고려하며 더 책임감 있게 프로덕트를 완성해 나가는 개발자로 성장시켰습니다.

함께한 모든분들께 감사드립니다.

Get lost! Cut loose! And lose your way!

하고 싶은 일이란, 어쩌면 길을 헤매는 과정에서 발견되는 것일지도 모릅니다.


얼마 전 개봉한 모아나 2에서 마탕이가 ‘길을 헤매도 괜찮다’는 장면이 가장 인상 깊었습니다. 때론 길을 헤매봐야 비로소 답을 찾을 수 있다는 말이 머릿속에 오래 남았습니다.

평생 누군가 정해준 길이 아닌, 제 마음이 이끄는 방향으로 살아왔기에 그 말이 더 크게 다가왔습니다. 나만의 길을 가며 망설인 적은 있었지만 결과적으로 후회한 적은 없었습니다. 그렇게 걸어온 길 위에서, 저는 하고 싶은 일을 발견하고 그것을 기록하며 나누는 삶을 살아가고 있습니다.


그리고 올해는 새로운 꿈이 생겼습니다. 우주인이 되어 직접 지구를 두 눈으로 보는 것입니다.

우주인 Jared Isaacman의 우주유영
우주인 Jared Isaacman의 우주유영

지난 9월, SpaceX의 Polaris Dawn 프로젝트에서 최초 민간인 우주유영 장면이 참 감동적이었습니다. 스타링크 덕분에 그 장면을 실시간으로, 고화질로 볼 수 있었다는 점 또한 대단했습니다.

우주여행이 더 이상 먼 미래의 이야기가 아니라는 생각이 들었습니다.

동시에 더 많은 사람들이 우주 과학에 관심을 갖고, 우주 관광 산업이 발전하는 데 기여해야겠다는 생각이 들었습니다. 이 블로그를 만든 목적이기도 합니다. 이 블로그에서 지속적으로 우주 관련 컨텐츠를 발행하고 프로젝트를 진행하고자 합니다.


제 블로그를 통해 우주를 사랑하는 사람들이 더 많아지기를 바랍니다. 언젠가 제 꿈이 현실로 이루어지는 그날을 상상하며, 오늘도 작은 기록을 남깁니다.

👎 Bad

  • 강의와 책을 구매만 했다.. → 학습 계획을 세우고 꾸준히 실천하는 것이 필요하다. 내년에는 백엔드 개발을 공부하며 간단한 우주 관련 앱 출시를 목표로 실질적인 성과를 내고자 한다.
  • 올해 대부분의 시간을 회사 업무와 휴식에만 집중했다. → 개인 성장과 미래를 위해 더 주체적으로 시간과 에너지를 분배할 필요가 있다.

👍 Good

  • 블로그 개발: 그동안 미뤄왔던 커스텀 블로그 프로젝트를 시작했다. 완성을 향해 꾸준히 진행 중이다. 2025년 상반기까지는 v1.0 배포를 목표로 두고 있다.
  • 팀 기여: 여러 프로덕트를 개발하며 팀에 기여했다. 내년에는 더 높은 가치를 제공할 수 있는 팀원이 되기 위해 스스로를 성장시키고 싶다.
  • 네트워킹: 많은 사람들과의 교류를 통해 다양한 인사이트를 얻었다.
  • 이제 2년 차 개발자로서, 더 주도적인 역할을 맡아 성장하기
    • 앱 출시 도전
    • 작은 프로젝트나 스터디 모임을 주도적으로 이끌어가기
  • 기술적 성장
    • 백엔드 학습
    • 시니어 개발자로 성장하기 위한 기술 스택 학습
  • 꾸준함
    • 영어 공부를 꾸준히 하여 예비 우주인의 자격을 다지기
    • 우주 관련 콘텐츠를 지속적으로 발행하기

광활한 우주에서 찰나의 순간을 함께 살아가며 나의 작은 역할을 할 수 있어서 감사했습니다.

올해 배운 것들을 바탕으로 내년에도 한 걸음 더 성장하고, 내가 만들고 싶은 것들을 실현하는 한 해로 만들겠습니다. 🚀