제품 하나를 끝까지 만들고,
현장에서 터진 문제를
원인까지 찾아 고치는
풀스택
개발자입니다.
프론트엔드 3년을 거쳐, 공장에 설치되는 검사 장비의 운영 대시보드를 맡았습니다.
웹 개발자가 없던 초기에는 신규 제품을 풀스택으로 단독 개발했고,
디스크가 차서
멈추던 700GB 테이블과 현장 장애를 직접 해결했습니다.
프론트엔드 3년을 거쳐, 지금은 화면부터 API·데이터·배포까지 한 제품의 전 구간을 맡고 있는 풀스택 개발자입니다. 현재는 고객사 현장(온프레미스)에 설치되어 24시간 돌아가는 산업용 검사 장비의 운영 대시보드를 개발하고 있습니다.
전 구간을 끝까지 책임집니다. 웹 개발자가 없는 팀에 합류해 신규 제품을 풀스택으로 단독 개발했습니다. 백엔드 API와 화면 전체를 설계·구현하고, 고객사로 나가는 배포 구성까지 직접 다룹니다.
반복 비용은 코드가 아니라 구조로 없앱니다.
하루 16만 건이 적재되며 디스크가 차면 장비가 멈추던 12개 테이블(약 700GB)을 DELETE 기반 정리에서 RANGE 파티셔닝 + DROP PARTITION 구조로 전환했습니다(기본 키 전면 재설계). RENAME swap + 최근 N일치만 이관으로 쪼개 라인이 쉬는 틈에 배포해 가동 중단 0분으로 끝냈고, 정리 작업은 수동 10~30분 → 스케줄러 자동이 됐습니다.
증상이 아니라 원인을 찾습니다.
재현되지 않는 장애는 조건을 하나씩 통제하며 범위를 좁힙니다. 부팅을 막던 3억 2,804만 행 COUNT(*)(87,371ms)를 제거했고, 하나의 증상 뒤에 있던 서로 무관한 원인 3건을 각각 규명했습니다 — 그중 공용 훅 한 곳을 고치자 같은 함정의 폴링 6개가 전부 보호됐습니다. 고칠 때는 재발 시 확인할 진단 수단을 함께 배포합니다.
프론트엔드 3년의 기준을 유지합니다. CI가 없던 프론트엔드에 목을 쓰지 않는 E2E를 붙여, 푸시마다 테스트 40개 · 고객사 5곳 · 9분 43초가 돌게 했습니다. 그 외 공통 컴포넌트 표준화, 서버/클라이언트 상태 분리, 렌더링 전략 구분, 하루 1.8만 건 화면의 가상 리스트 전환이 주로 다룬 주제입니다.
해결한 문제는 배경과 검토한 선택지, 그중 무엇을 왜 택했는지까지 정리해 글로 남깁니다.
운영 DB의 파티셔닝, 인덱스, 마이그레이션 이관 작업을 직접 수행했습니다.
제품이 고객사 현장의 Kubernetes 환경에 설치되는 구조라, Helm 차트가 곧 각 사이트의 구성입니다. 차트 작성, ArgoCD 등록, 서버 리소스 조정, 빌드·배포 파이프라인 구성을 직접 했습니다.
React 기반 화면을 3년간 담당했고, 공통 컴포넌트 표준화와 대용량 목록 가상화, 권한 기반 화면 제어를 직접 구현했습니다.
현장 PC용 데스크톱 앱을 Go(Wails)로 재작성했고, Claude Code 커맨드로 리뷰·PR 작업을 자동화했습니다.
Aivex에서 맡았던 작업 다섯 가지입니다. 각 항목의 배경과 검토한 선택지, 무엇을 왜 택했는지는 기술 블로그에 정리해 두었습니다.
700GB
RANGE 파티셔닝으로 전환한 운영 테이블 12개
상위 3개가 각 ~250GB · 무중단 전환
3.28억 행
부팅을 막던 COUNT(*)가 읽던 행 수
87,371ms 소요 → 제거 후 정상 기동
93%
데스크톱 앱 설치 파일 감소 150MB → 10.9MB
약 1/14 · 단일 exe 배포
40개
푸시마다 도는 E2E 테스트 고객사 5곳
9분 43초 · 목 없이 실제 백엔드
11편
재직 중 작성한 기술 블로그 글
위 성과 전부가 글로 공개됨
하루 16만 건이 쌓여 디스크가 차면 저장이 실패하고
장비가 멈췄습니다. 대량 DELETE는 VACUUM
부하로 오히려 write를 지연시켜 배제하고,
12개 테이블 약 700GB(상위 3개가 각 ~250GB)를
RANGE 파티셔닝으로 전환했습니다. 250GB를 전부 복사하는
대신 RENAME swap + 최근 N일치만 이관하고 테이블별로
트랜잭션을 쪼개, 라인이 쉬는 틈에 나눠 배포해
비가동 시간 없이 끝냈습니다. 정리 작업은
수동 10~30분 → DROP PARTITION 스케줄러 자동으로
바뀌었습니다.
장비를 재부팅해도 연결 끊김 표시가 사라지지 않고 브라우저
새로고침에만 복구됐습니다. 폴링 영구 정지 / heartbeat 미도달 /
재연결 취소 조건 — 서로 무관한 원인 3건을 각각
규명했습니다. 재귀 setTimeout을
finally로 옮겨 공용 훅 한 곳을
고치자 같은 함정에 걸려 있던 폴링 6개가 전부 보호됐고,
heartbeat 10초 · watchdog 30초(3회 미수신) 기준으로
half-open을 감지하도록 바꿨습니다. 재발 시 쓸 진단 로그 수집도
함께 배포했습니다.
웹 화면 하나를 띄우기만 하는 앱이 Chromium을 통째로 번들링해 150MB(157,664,256B)였습니다. Chromium 취약점이 나올 때마다 앱을 다시 빌드해야 하는, 엔진 수명주기를 앱이 떠안는 구조였습니다. OS에 이미 있는 웹뷰를 빌려 쓰는 Go/Wails로 재작성해 10.9MB(11,517,440B) 단일 exe가 됐습니다 — 93% 감소, 약 1/14. 빌드·설치 파일 생성·릴리스도 자동화해 버전 태그 push만으로 배포됩니다.
📝 웹 화면 하나 띄우자고 150MB를 깔고 있었다 — Electron 래퍼를 Go로 갈아엎기실장비도 데이터도 확정 기획서도 없이 시작한 신규 제품에서 백엔드 API와 화면 전체를 단독 개발했습니다. 백로그는 Epic 5 / Story 35 / Task 71 — 총 113건. 초반 스프린트에 담긴 건 만들 것이 아니라 알아낼 것이라 16 → 6 → 9 → 14 → 25건으로 뒤로 갈수록 무거워졌고, 격일 스크럼 23회와 6명 참석 리뷰 4회로 변경 주기를 따라갔습니다. 장비 동작을 모사하는 Mock 서버로 실장비 없이 인터페이스를 확정했습니다.
📝 센서도 기획서도 없이 킥오프했다 — 불확실한 프로젝트를 다섯 스프린트로 굴린 기록프론트엔드에는 CI 자체가 없어, 고객사별로 다른 화면 조합이 깨져도 배포 전에 알 방법이 없었습니다. 목을 쓰지 않고 실제 백엔드에 검사를 주입해 전역 집계까지 확인하는 E2E를 붙였습니다. 다만 모든 테스트가 하나의 백엔드를 공유해 병렬 실행 시 결과가 오염됐고 — 4회 중 2회 실패 — 병렬로 버는 시간은 10초 남짓이었습니다. 10초를 아끼자고 CI 게이트의 신뢰도를 바꿀 이유가 없어 워커를 1개로 고정했습니다. 지금은 푸시마다 테스트 40개 · 고객사 5곳(A 9 / B 6 / C 9 / D 8 / E 5) · 9분 43초가 돌고, 인증 → 잔여 페이지 정리 → 백엔드 설정 정합화 setup 3단계가 매 실행 앞단에서 스스로를 복구합니다. 남은 과제는 재시도로 덮인 플레이키 2건과, 직렬 10분이라 아직 머지 게이트로 걸지 못한 점입니다.
📝 끝까지 자동인 배포에 검증 한 칸 넣기 — 목을 쓰지 않는 E2EFullstack Engineer
공장에 설치되는 검사 장비의 운영 대시보드 개발 (기존 제품 + 신규 제품). 고객사 현장에 직접 설치되는 온프레미스 환경
프론트엔드(React) · 백엔드(NestJS/Prisma/PostgreSQL) · 현장 PC용 데스크톱 앱(Go) ·
배포(Helm/ArgoCD) 담당
웹 개발자가 없는 상태에서 합류해 기능 개발과 현장 장애 대응을 수행
🚀 Impact: 장비 연동을 제외한 화면·API·데이터·인터페이스 검증까지 완료
DELETE는 VACUUM 부하가 디스크를 붙잡아
신규 write를 지연시켜 배제. 삭제 시간대 분산도 "한가한 새벽"이 없는 24시간 공장이라 기각
PARTITION BY RANGE(created_at)로
전환 — 파티션 키를 포함하도록 기본 키 전면 재설계, 단일 행 보장이 깨지는 자리는 쓰기 로직을
updateMany → 0건이면 create로 교체.
부담이 상위 3개 테이블(각 ~250GB)에 몰려 있다는 점이 "최근 N일만 이관" 설계의 단서가 됨
TRUNCATE 후 재시도.
ALTER SEQUENCE ... OWNED BY 이관까지 챙겨 swap 후 id 연속성 보존
EXPLAIN ANALYZE로 partition pruning 작동을 확인한 뒤 트래픽 재개
DROP을 자동 수행하는
스케줄러를 애플리케이션 안에 직접 구현 (pg_partman 대신 — 운영 제약과 로그·모니터링 가시성 때문.
되돌릴 수 없는 작업이라 단위 테스트 동반)
prisma db push 운영을
prisma migrate 이력 체계로 이관.
기존 마이그레이션 4개를 통합본 1개로 정리하고, 이력 자체가 없는 DB는 전체 baseline 마킹으로 처리
🚀 Impact: 정리 작업이 10~30분 + 운영자 직접 실행에서 즉시 완료 + 스케줄러 자동 처리로 변경. 전환 전 구간 공장 가동 중단 0분
setTimeout 폴링이 콜백 reject 시 다음 실행을
예약하지 않아 영구 정지. 백엔드만 재시작되면 새로고침 전까지 상태 조회 0건 →
finally로 옮겨 해소.
공용 훅 한 곳을 고치자 같은 함정에 걸려 있던 폴링 6개가 전부 보호됨
(비전 모듈 5초·모션 컨트롤러 3초 폴링 포함 — 내가 확인한 건 2개였고 나머지 4개는 덤)
data가 빈 문자열이라 NestJS가
data: 라인을 생략했고, SSE 규격상 브라우저가 이벤트를
디스패치하지 않아 리스너가 한 번도 호출되지 않음. watchdog이 그동안 재고 있던 건 연결 상태가 아니라
"업무 이벤트 30초 부재" → 설비가 조용한 시간대마다 정상 연결을 30초마다 강제 재연결.
전송 형식 수정으로 오탐 제거 (heartbeat 10초 · watchdog 30초 = 3회 연속 미수신 기준)
🚀 Impact: 새로고침 없이 자동 복구되도록 수정, 재발 시 확인할 진단 경로 확보
DROP하기 전 행 수를 세던
COUNT(*) — rows: 328,040,507.
로그에 건수를 찍으려고 넣은 한 줄이 부팅 경로를 막고 있었고, 동작에 쓰이지 않아 제거
COUNT(*)가 눈 깜짝할 새 끝났고, 같은 코드가 운영에선 3억 2,804만 행을 읽음.
5자릿수 데이터량 차이는 5자릿수 지연으로 돌아온다는 것 — 이후 리뷰에서 전체 스캔·반복문 내 쿼리는
운영 데이터량을 대입해 읽는 기준을 세움
🚀 Impact: 장비 정상 기동. 개발 환경 데이터 양으로는 드러나지 않는 종류의 문제를 코드 리뷰 확인 항목에 추가
🚀 Impact: 설치 파일 150MB → 10.9MB, 단일 파일 배포로 전환. 브라우저 엔진 보안 업데이트는 OS가 처리
🚀 Impact: 고객사로 나가는 배포 구성을 직접 관리, 테스트용 서버를 자동 배포 대상에 편입, 반복되던 백엔드 서버 다운 해소
describe.serial은 파일 내부만 보장해 불충분)
🚀 Impact:
CI 부재(default 자체가 없음) → 푸시마다
E2E 40개 · 고객사 5곳(A 9 / B 6 / C 9 / D 8 / E 5) · 9분 43초가 도는 상태로 전환.
남은 과제는 재시도로 덮인 플레이키 2건과, 직렬 10분이라 아직 머지 게이트로 걸지 못한 점
@tanstack/react-virtual)로 전환 —
수만 행 → 실제로 보이는 수십 행만 렌더.
방법 5가지·라이브러리 3가지를 비교해 효과가 가장 큰 것이 아니라 기존 코드와 사용 감각을
가장 적게 흔드는 것을 선택 (컬럼 정렬을 지키려 table-layout: fixed +
spacer 행 방식 채택). "느리다"의 원인 절반은 렌더가 아니라 조회 방식이라, 하루 단위 + 시간대 필터로 조회도 함께 재설계
console.log 잔존,
이벤트 리스너 cleanup 누락(실시간 화면 메모리 누수), 중복 컴포넌트가 사전에 걸러짐.
삭제·민감 파일 수정을 막는 훅과 도메인 매뉴얼 자동 로딩 커맨드도 함께 구성
🚀 Impact: API 아키텍처 REST 이관 + RBAC 도입, 수만 행 렌더링으로 멈추던 운영 화면을 보이는 수십 행만 렌더하도록 복구, PR 작성 5분 → 30초 및 배포 전 AI 사전 리뷰 습관화
Frontend Developer
화장품 제조 뷰티 플랫폼 '브래닛' 프론트엔드 개발
React 기반 화면 전 범위 담당
1~2주 단위 스프린트로 배포하며 공통 컴포넌트 정비와 결제 연동을 수행
🚀 Impact: 공통 컴포넌트 재사용으로 신규 화면 작업 시간 단축, 상태 관리 책임 분리로 버그 원인 범위 축소
🚀 Impact: 로딩 중 화면이 밀려 잘못 클릭하는 문제 감소
🚀 Impact: 결제 중단·실패·재시도 케이스까지 처리한 구독 결제 플로우 운영
Frontend Developer
남성 미용의료 플랫폼 '미남이오' 앱/웹과 제모 탐색 서비스
'제모데이' 웹 개발
렌더링 전략 분리와 지도 UX 최적화를 중심으로 성능 개선
CodePush 기반 운영 대응 구조와 결제 연동을 함께 수행
🚀 Impact: 초기 로딩 시간 단축 및 동일 데이터 중복 호출 감소
🚀 Impact: 지도 이동 시 발생하던 깜빡임 제거 및 재조회 호출 감소
Frontend Developer
반려동물 플랫폼 '와요/펫플래닛'의 앱 및 내부 어드민 개발
🚀 Impact: 장소 탐색·숙소 예약·기록 작성 세 기능을 앱 기능 범위로 확장
응용프로그래머
전파 탐지 장비의 모니터링 프로그램 개발 (WPF/C#)
🚀 Impact: 실시간 모니터링 환경에서 운영자가 상태를 파악하는 속도를 개선
업무에서 실제로 겪은 문제를 배경 · 검토한 선택지 · 결정 근거 · 결과 순으로 정리해 공개하고 있습니다. · velog.io/@yg1110
멈추면 안 되는 DB의 구조를 바꾼 작업
느리거나 멈추던 것들을 고친 작업
프로젝트 진행 방식과 개발 프로세스
센서도 기획서도 없이 킥오프했다 — 불확실한 프로젝트를 다섯 스프린트로 굴린 기록
2026.08실제 장비와 기획서 없이 5개 스프린트를 진행하며 팀과 맞춰간 방식
Claude Code 커맨드로 개발 작업 효율 높이기 — 사전 코드 리뷰부터 컨텍스트 자동화까지
2026.06AI 코딩 도구에 팀 전용 명령을 만들어 리뷰·PR 작업을 자동화한 구성
물어보던 사람에서, 먼저 제안하는 사람으로 — 풀스택 수습 3개월
2026.06풀스택 수습 3개월 회고
프론트엔드 3년차, 풀스택으로 첫 걸음을 뗀 1.5개월
2026.06풀스택 전향 후 첫 1.5개월 회고
프로젝트 태그
2026.07
습관·루틴을 매일 체크하고 연속 기록(streak)을 쌓는 PWA. 습관 기록은 기기 로컬에 저장하고, 올린 인증만 공개 피드로 공유. Service Worker와 Web Push로 체크 알림을 발송
2026.03
초대코드와 닉네임만으로 참여할 수 있는 소규모 독서 모임용 소셜 기록 앱. 독후감 공유와 헬스·식단 등 일상 루틴 인증을 그룹 피드로 함께 확인
2026.03
복사한 텍스트를 자동으로 기록하고 전역 단축키(⌘+Shift+V)로 빠르게 접근할 수 있는 macOS용 클립보드 히스토리 매니저
2026.02
사람인·잡코리아 채용공고를 수집하고, 스코어링 엔진으로 추천/보류/제외를 판단한 뒤 이메일 알림을 발송하는 개인용 의사결정 지원 시스템
2026.02
실시간으로 유튜브 영상을 함께 보면서 채팅/목록 관리를 할 수 있는 실시간 워치파티 서비스
2026.01
인바디·1RM·운동목표를 바탕으로 사용자에게 최적화된 운동 루틴을 추천해주는 서비스
2024.11
북마크를 폴더로 분류하고 드래그 앤 드롭으로 정리할 수 있는 개인 북마크 관리 서비스