Auth & Activation · Software Engineer
가입·인증 퍼널 개선
- 휴대폰 인증 실패를 문자 발송, 인증 방식, 발신 번호, Bot Detection 단계로 나눠 원인을 추적하고 문자 발송 Provider 다변화, MO 인증, 발신 번호 확대, Native CAPTCHA를 도입했습니다.
- 단일 Provider와 Web CAPTCHA에 집중돼 있던 실패 지점을 분산해 휴대폰 인증 실패율을 15%대에서 3%대로 낮췄습니다.
- 소셜 로그인 신규 가입자 중 광고 수신 미동의자에게 동의 화면을 한 번 더 노출하는 실험을 제안·주도해, 신규 가입자의 광고 수신 동의율을 8%p 개선했습니다.
브라우저 메인 스레드 병목 개선
- 공용 디자인 시스템 Vibrant의 런타임 스타일 연산을 빌드 타임 CSS로 옮기는 정적 컴파일러를 설계·구현하고, 안전성을 증명할 수 없는 경로는 기존 런타임으로 fallback하도록 구성했습니다.
- 컴파일 전후 결과를 전수 대조하는 differential test와 browser parity·시각 회귀 테스트를 CI gate로 구축해 기존 동작을 보존하면서, 동일 코드의 compiler OFF/ON 비교에서 홈 스크립트 실행 시간을 16% 단축하고 런타임에서 스타일을 계산하는 요소를 3,752개에서 175개로 약 95% 줄였습니다.
- 프로덕션 CPU 프로파일링으로 상품 카드에서 사용되지 않는 이미지 팔레트 추출이 메인 스레드를 점유하는 병목을 발견하고, 색상값을 사용하지 않는 경로에서는 연산 자체를 수행하지 않도록 변경해 홈 초기 로드의 팔레트 연산 18회와 추가 이미지 요청 18회를 제거했습니다.
Web·React Native·WebView를 연결하는 Client Journey 설계
- 재현이 어려운 클라이언트 문제를
Session → Navigation → Meaningful Action → Network / Error → backend trace로 연결해 추적하는 Structured Client Journey를 설계했습니다. - 모든 interaction을 수집하지 않고 Navigation, Meaningful Action, first-party Network, Error로 signal 범위를 제한하고, Web·React Native·WebView의 차이는 platform별 instrumentation으로 분리했습니다.
- 관측성 실패가 사용자 경로로 전파되지 않도록 fail-open을 원칙으로 두고, storage/cardinality budget을 초기 설계 제약으로 정의했습니다.
서비스마다 달랐던 인증 방식을 Session Cookie + 공통 SDK 기반으로 정리
- Cookie, Firebase Token,
x-user-id등 서비스마다 달랐던 인증 경로를 Session Cookie + 공통 Authentication SDK 기반으로 정리하고 서비스별 인증 처리를 공통화했습니다. - Gateway가 전달한 사용자 ID를 그대로 신뢰하던 경로를 줄이고, 각 서비스가 공통 SDK를 통해 auth-service가 관리하는 실제 세션 상태를 일관된 방식으로 검증하도록 점진적으로 전환했습니다.
- Firebase Auth와 custom claim에 중복돼 있던 사용자·동의 데이터를 실제 도메인으로 이전해 인증 데이터와 비즈니스 데이터의 책임을 분리했습니다.
user-service 공통 조회 경로 성능 개선
- user-service에 reader/writer datasource routing을 적용하고 Federation User 조회의 중복 SQL을 제거해, production 기준 GraphQL p99 47%, HTTP p99 42%를 단축했습니다.
GraphQL Hive를 CI/CD에 연결해 schema 변경을 배포 전에 검증
- GraphQL Hive Schema Registry를 Federation composition과 schema check/publish 과정에 연결해 backend subgraph의 계약 변경을 CI/CD에서 검증하도록 했습니다.
- Web과 Mobile의 독립적인 배포 주기 때문에 저장소 검색만으로 안전성을 판단하기 어려웠던 deprecated field는 production operation usage가 소진된 뒤 제거하도록 운영 방식을 정리했습니다.
- Federation 운영과 Schema Registry 활용 경험을 GraphQL on Production으로 정리해 Backend Chapter에 공유했습니다.
Distributed tracing 복구 및 Spring Batch tracing 확장
- 일부 span이 유실되거나 호출 관계가 올바르게 연결되지 않던 문제를 application instrumentation → container → OpenTelemetry Collector → Jaeger 경로까지 추적해 trace의 parent-child 관계와 수집 경로를 복구했습니다.
- OpenTelemetry auto-instrumentation이 충분히 커버하지 못하던 Spring Batch 5에 Job / Step span과 read, write, skip, commit, rollback 집계 metric을 제공하는 공통 tracing 모듈을 구현해 여러 backend 서비스에서 재사용할 수 있도록 했습니다.
CI/CD 플랫폼의 성능과 안정성 개선
- GitHub Actions의 build·test·typecheck·preview 실행 경로와 cache 전략을 개선해 Preview build 시간을 최대 58% 단축했습니다.
- CI workload를 AMD에서 ARM runner로 이전해 container image build 시간을 약 39% 단축하고 runner compute 단가를 약 15% 절감했습니다.
- 11개 repository에 분산돼 있던 EFS 기반 Gradle cache를 self-hosted Actions cache로 통합해 cache 경로를 단일화하고, 공유 archive 손상으로 여러 PR이 cold build로 전환되던 실패 경로를 제거했습니다.
- 반복되던 runner DiskPressure를 cache I/O와 Kubernetes node storage까지 추적해 m7gd local NVMe 기반으로 runner storage를 전환했습니다.