본문으로 건너뛰기
JAEWON CHANG시스템 작업 기록
언어
작업 목록으로 건너뛰기

장재원

소프트웨어 엔지니어 — 400만 DAU 서비스의 프론트엔드와 그 뒤의 전송 구간

스크롤

고지서가 같이 왔다

수백만 명이 매일 쓰는 서비스의 프론트엔드를 개발하다가, 트래픽 비용 고지서와 장애 알림도 같이 받게 됐다. 그때부터 화면 바깥의 구간 — CDN, 캐시, 서버, 배포, 데이터 — 을 함께 읽기 시작했다.

숫자는 전부 두 번째 측정값이다

문제는 감으로 좁히지 않는다. 로그와 이벤트로 구간을 나누고, 어디서 초와 바이트가 새는지 확인하고, 구조를 바꾼 뒤 같은 지표를 다시 잰다.

LLM도 검증이 필요한 외부 시스템이다

특별한 존재로 두지 않는다. 응답을 스키마로 검사하고, 실제 세션을 재현해 품질을 다시 측정한다.

넛지헬스케어 · 2024 · 캐시 최적화
일일 네트워크 전송량

235GB/day

CloudFront 캐시 키와 무효화 정책을 리소스 특성에 맞추고, Service Worker로 반복 요청을 네트워크에서 걷어냈다.

−43.6% · egress 비용 30% 이상 절감
넛지헬스케어 · 2024 · 광고 데이터 플랫폼

광고 요청부터 클릭까지 7개 이벤트를 직접 정의해 수집하고, BigQuery로 병목 구간을 특정했다. 그다음 번들과 광고 스크립트의 실행 순서를 바꿨다.

P90 광고 로딩4–5초 → 2–3초
광고 클릭률+30%
해당 지면 매출+20%

빨라진 만큼 더 보였고, 보인 만큼 더 눌렸고, 눌린 만큼 매출이 올랐다. 세 지표를 이어서 검증했다.

운영해 온 규모
월간 요청

253M

월간 전송량

4.27 TB

CloudFront와 Lambda@Edge 기반 이미지 전송 인프라. 위 캐시 최적화와는 다른 지표이며 합산하지 않는다.

관계사 커뮤니티 코드베이스

1 10+

10개 이상을 하나의 멀티테넌트 구조로 합치고, 서비스별 DNS 레코드를 하나씩 이관했다. 운영·유지보수 인력은 기존의 약 20% 수준이 됐다.

작업 목록

  1. 01관계사 커뮤니티 10개 이상을 하나의 멀티테넌트 구조로 통합2024 – 2025같은 기능이 열 곳 넘게 따로 개발되고 있었다. 하나의 코드베이스로 합치고, 서비스별 DNS를 순차 전환해 이관했다.10+ 코드베이스 → 1 · 유지보수 인력 20% 수준
  2. 02CloudFront와 브라우저 캐시 재설계로 일일 전송량 43.6% 감축2024솔루션을 더 붙이기 전에 요청 흐름부터 읽었다. 캐시 키와 무효화 정책을 리소스 특성에 맞추고, Service Worker로 반복 요청을 네트워크에서 걷어냈다.417 → 235 GB/day · egress 비용 30% 이상 절감
  3. 03광고 생명주기 7개 이벤트 계측, CMS 구축, 그리고 실행 순서 재배치2024광고 지표가 여러 곳에 흩어져 병목 구간을 특정할 수 없었다. 이벤트를 직접 정의해 수집하고, BigQuery로 구간을 나눈 뒤 번들과 광고 스크립트의 실행 순서를 바꿨다.P90 4–5s → 2–3s · CTR +30% · 지면 매출 +20%
  4. 04CloudFront와 Lambda@Edge 기반 이미지 전송 인프라 운영2023 – 2025엣지에서 이미지를 변환해 전달하는 경로를 운영했다. 월 2억 5,300만 건의 요청과 4.27 TB의 전송을 다루는 환경이다.4.27 TB/월 · 요청 2억 5,300만 건/월
  5. 05관리자 배치 작업과 사용자 서비스의 부하 격리2024관리자 시스템에서 대량 배치가 돌면 사용자 서비스가 느려졌다. 원인을 화면이 아니라 공유 서버 자원에서 찾았다.배치 부하가 사용자 트래픽으로 전파되지 않도록 분리
  6. 06모바일 Offerwall SDK — 기획 요구사항을 실행 위치로 분해2024앱·웹·SDK·서버·QA가 함께 붙은 프로젝트에서, 각 기능이 어느 영역에서 실행되고 어디에 저장되는지를 정의했다.5개 실행 영역 · 여러 직군 약 15명
  7. 07교내 실사용 서비스 약 15개의 Kubernetes · GitOps 전환2022 – 2026서비스마다 배포 방식이 달랐고 일부는 10년 넘은 레거시였다. 한 번에 옮기지 않고 의존성부터 확인해 순차 전환했다.온프레미스 15개 서비스 · 일부 10년 이상 레거시
  8. 08MySQL 통합 DB 운영과 이관2023 – 2025서비스마다 DB 서버, 계정, 네이밍이 제각각이라 운영과 테스트 DB가 섞일 수 있었다. 기준을 세우고 정리한 뒤 운영 DB를 옮겼다.dev / prod / test 분리 · deprecated DB 식별 · 운영 DB 이전
  9. 09RAG와 MCP 기반 Agent로 학사 업무를 실제로 수행시키기2025자연어 요청에 답만 하는 것이 아니라 실제 시스템 동작까지 이어지는 Agent를 만들었다. 실행형 Agent는 오답보다 잘못된 실행이 더 위험하다.Next.js · Spring Boot · FastAPI Agent 3계층 흐름 설계
  10. 10Zoom 실시간 발화를 읽는 AI Speaking Assistant2025 – 2026별도 창에 다시 질문하는 방식이 아니라, 진행 중인 영어회화의 맥락을 서버가 이미 알고 있는 상태에서 도움을 준다.Zoom RTMS 수신 · SSE 전달 · 스키마 검증된 LLM 응답
  11. 11실제 세션을 재현해 프롬프트 품질을 다시 재는 운영자용 Lab2025 – 2026프롬프트를 바꿀 때마다 Zoom 세션을 새로 진행하는 것은 비효율적이고, 임의로 만든 테스트 문장은 실제 대화와 다르다. 저장된 세션을 특정 시점까지 재현해 같은 조건에서 비교했다.30분 세션의 17분 시점을 재현해 프롬프트 A/B 재검증
  12. 12SafeLens — 이미지 속 개인정보 자동 탐지와 비식별화2025업로드한 이미지에서 개인정보와 얼굴을 탐지하고, 사용자가 확인한 항목만 선택적으로 비식별화한다. 해커톤 10개 팀 중 1위.10개 팀 중 1위
  13. 13HellsMate — 운동 목표를 지인과 함께 관리하는 서비스2023혼자 관리하는 운동 앱이 아니라, 자신을 잘 아는 지인을 초대해 미션을 함께 관리하도록 만들었다. UNITHON 9th, 12개 팀 중 2위 우수상.12개 팀 중 2위 · 우수상
  14. 14MeetMin — 여러 사람의 출발지에서 만남 장소 찾기2024각자의 출발 위치를 기준으로 전체 이동 비용이 낮은 장소를 추천한다. 한 사람만 오래 가는 결과를 피하는 것이 핵심이다.NestJS · Kotlin 클라이언트 · EC2 배포
프로젝트

직접 움직여 보기

캐시 적중률을 올리면 요청이 더 일찍 멈춘다. 오리진까지 내려간 요청만 전송량으로 청구된다.

브라우저Service WorkerCloudFront오리진
캐시 적중률44%
적용 전 (측정)적용 후 (측정)
일일 전송량

235GB/day

오리진 도달

56%

417 GB/day와 235 GB/day는 실제 측정값이다. 두 지점 사이는 설명을 위한 선형 모델이며 실제 청구서가 아니다.

운영해 온 시스템

전송 · 엣지

CloudFront
캐시 키와 무효화 정책 재설계, 전송량 감축
Lambda@Edge
엣지 이미지 변환 경로 운영
Service Worker
Web Cache API로 반복 요청을 네트워크에서 제거
Route 53
서비스별 레코드 순차 전환으로 이관

클라우드

EC2
서비스별 인스턴스 운영과 통합 서버 준비
Auto Scaling
통합 이후 증가한 트래픽 대응
S3
세션 녹음과 전사 저장, 이미지 오리진
RDS
CA 교체와 TLS 연결 문제 대응
ALB · Elastic Beanstalk
서비스 배포 환경 운영
SES
Production Access 신청과 발송 환경 운영

컨테이너 · 배포

Kubernetes
온프레미스 서비스의 단계적 이전
Docker
서비스 컨테이너화와 장애 시 재기동
ArgoCD
Git의 원하는 상태를 클러스터와 동기화
Helm
서비스별 차이를 값으로 분리
GitHub Actions
이미지 빌드와 EC2 배포 파이프라인

운영

Nginx
리버스 프록시 점검과 장애 진단
PM2
프로세스 운영과 로그 로테이션 적용
Grafana
모니터링 운영, Health Check와 실제 상태의 차이 확인
Vault
인증정보를 코드 밖으로 분리
Linux
온프레미스 서버 직접 운영

데이터

GA4
광고 생명주기 7개 이벤트 수집
BigQuery
구간별 병목 분석
MySQL · MariaDB
통합 DB 운영, 백업과 이관

웹 · 서버

React · TypeScript
약 400만 DAU 서비스의 프론트엔드
Next.js
Agent 서비스와 이 문서의 프론트엔드
Node.js · NestJS
API 서버 개발
Spring Boot
팀 프로젝트의 백엔드 연동

AI 시스템

LLM API
검증이 필요한 외부 시스템으로 취급
RAG · Vector DB
규정을 기억이 아니라 검색으로 처리
MCP
Agent가 실제 작업을 수행하는 Tool 경계
JSON Schema
LLM 응답 형식 검증
Zoom RTMS
실시간 발화 수신과 세션 상태 집계

앱 배포

Google Play
내부 테스트 트랙부터 프로덕션 액세스까지
App Store
iOS 심사 통과 및 배포

운영 기록

OPS-01

8080 포트에 프로세스가 올라오지 않은 서비스 중단

인지

Health Check 알림으로 서비스 이상을 확인하고 서버에 직접 접속했다.

조치

Portainer와 SSH로 상태를 확인하고 Nginx를 점검했다. 서비스가 쓰던 8080 포트에 정상 프로세스가 없었다. Docker Compose로 production 서비스를 다시 기동했다.

재발 방지

복구로 끝내지 않고 왜 프로세스가 사라졌는지 확인했다. 이어지는 로그 누적 문제(OPS-02)가 여기서 나왔다.

Docker ComposeNginxSSHPortainer
OPS-02

PM2 로그 21GB 누적

인지

서버 상태를 확인하다 PM2 로그가 약 21GB까지 쌓여 있는 것을 발견했다.

조치

디스크를 회수하려고 로그를 정리했다. 다만 정리는 조치가 아니라 유예다. 같은 일이 반복된다.

재발 방지

pm2-logrotate를 적용했다. max_size 10M, retain 7, compress, 날짜 기반 파일 관리와 rotation을 설정했다.

PM2Linux
OPS-03

ping이 통과하는데 서비스는 죽어 있는 문제

인지

ping 기반 모니터링은 ICMP가 차단되면 정상 서비스를 장애로 판단한다. 반대로 서버가 ping에 응답해도 HTTP 서비스는 죽어 있을 수 있다.

조치

ICMP 응답과 애플리케이션 상태를 구분했다. curl 등 HTTP 요청 기반 확인을 검토했다.

재발 방지

서버 장애, 서비스 장애, 네트워크 장애, 모니터링 시스템 자체 오류를 구분할 수 있어야 알림이 의미를 갖는다는 기준을 세웠다.

MonitoringGrafanaNginx
OPS-04

네트워크 정책 변경으로 끊긴 외부 연결

인지

네트워크 정책이 바뀌면서 운영 서버가 쓰던 포트의 외부 연결이 차단됐다. 서비스를 바로 수정하기 어려운 상태였다.

조치

외부 연결이 가능한 서버를 이용해 임시 TCP Relay 경로를 구성하고 서비스를 유지했다.

재발 방지

정상 네트워크 환경이 복구된 뒤 원래 구조로 전환했다. 임시 경로를 그대로 두지 않았다.

LinuxNetworking
OPS-05

RDS CA 교체와 Node.js 20 환경의 TLS 연결

인지

RDS CA 인증서 교체와 만료 과정에서 연결 문제가 발생했다. DataGrip에서는 연결되는데 CLI에서는 실패하는 등, 클라이언트마다 결과가 달랐다.

조치

클라이언트별 신뢰 저장소와 TLS 처리 차이를 확인해 어느 쪽이 인증서를 어떻게 검증하는지 구분했다.

재발 방지

운영환경에서는 인증서 자체보다 클라이언트 환경 차이가 연결 실패의 원인이 되는 경우가 있다는 것을 기록해 뒀다.

RDSTLSNode.js
OPS-06

운영 컨테이너의 ExitCode 1 종료

인지

운영 서버의 Docker 컨테이너가 ExitCode 1로 종료됐다.

조치

컨테이너 상태와 시간 정보, 로그를 대조해 종료 시점을 특정했다.

재발 방지

근본 원인은 확인되지 않았다. 확인되지 않은 원인을 만들어서 적지 않는다.

DockerLinux

기술 의사결정 기준을 바꾼 피드백

SCG 회장으로 기술 도입과 변경을 판단하면서, 초기에는 검증된 방식을 유지하려는 성향이 강했다. 팀원에게서 새로운 시도에는 지나치게 높은 증명을 요구하면서 기존 방식의 위험은 낮게 본다는 피드백을 받았다.

맞는 지적이었다. 그래서 '안정적인가'를 묻는 대신 두 가지를 묻기로 기준을 바꿨다. 이 변경의 영향 범위는 어디까지인가, 그리고 문제가 생겼을 때 어느 정도까지 되돌릴 수 있는가.

새로운 아이디어를 낸 사람에게 모든 위험 검증 책임을 맡기지 않는다. 검증 수준을 정하는 것은 팀의 일이다.

영향 범위가 좁을 때

좁은 범위에서 먼저 시험한다. 합의에 드는 비용이 변경 자체보다 크면 안 된다.

영향 범위가 넓을 때

검토 범위와 참여 인원을 넓힌다. 되돌릴 수 없는 변경일수록 더 그렇다.

되돌릴 수 있을 때

복구 경로를 먼저 확인하고 실행한다. DNS 순차 전환도 같은 이유로 그렇게 했다.

이력

경력

01
2023.02 – 2025.04

프론트엔드팀 · 파트장 → 부팀장

넛지헬스케어
  • 수백만 명이 사용하는 서비스의 웹 프론트엔드를 개발했다. 약 400만 DAU, 일일 500만 이상 페이지뷰 수준의 환경이다.
  • 산업기능요원으로 26개월간 전일 근무했다. 2023년 2월 입사, 2025년 4월 복무만료.
  • React · TypeScript · Node.js로 프론트엔드를 개발하다 전송 비용과 장애 알림까지 함께 맡게 됐다. CDN과 브라우저 캐시 정책을 다시 설계해 일일 전송량을 417에서 235 GB로 줄였고, 관계사 커뮤니티 10개 이상을 하나의 멀티테넌트 코드베이스로 합쳐 서비스별 DNS 레코드를 하나씩 이관했다.
  • 기획·PM·백엔드·Android·iOS·QA·데이터·운영 조직과 협업하며 기획서를 API와 데이터 흐름으로 옮기고, 일정과 의존성, 변경 영향을 정리했다.
  • 프론트엔드 조직에서 파트장을 거쳐 부팀장을 맡아 약 20명 규모의 개발 인력을 조율했다.

단체 활동

02
2022.03 – 2026.11

팀원 → 개발 팀장 → 회장

성균관대학교 시스템컨설턴트그룹 (SCG)
  • 단체 내 개발 관리 업무를 총괄하고 서버와 인프라 운영, 기술 의사결정, 업무 프로세스 정립, 대외 협력을 맡고 있다.
  • 교내에서 실제 사용되는 웹서비스 약 15개를 운영하며, 그중 일부는 10년 이상 된 레거시 프로젝트다.
2022.09 – 2023.02

웹 개발 팀 코어 멤버 · 리더

GDGoC 성균관대 (구 GDSC)
  • 팀원 8명의 교육과 실습 프로젝트 관리를 총괄했다.
  • 교육용 영상을 제작하고 실습 프로젝트를 기획했으며, 스터디 커리큘럼과 오피스 아워를 진행했다.

학력

01
2020.03 – 2027.02

전자전기공학부 학사 · 소프트웨어학과 복수전공

성균관대학교
  • 평점 4.21 / 4.5 · 총 이수 143학점 · 2027.02 졸업 예정.
  • 운영체제, 컴퓨터구조, 알고리즘, 데이터베이스, 소프트웨어공학, 인공지능, 웹·모바일 프로그래밍 실습, 캡스톤설계프로젝트를 이수했다.

자격 · 어학

03
2025.09.12정보처리산업기사한국산업인력공단
2021.07.16정보처리기능사 (현 프로그래밍기능사)한국산업인력공단
2026.08.15OPIc — ALACTFL

수상

02
2025SafeLens — 10개 팀 중 1위해커톤
2023HellsMate — 12개 팀 중 2위, 우수상UNITHON 9th

연락처

서울, 대한민국