2026년 3분기 신규 프로젝트 2건 가능 · 서울 / 원격

웹과 앱을 만듭니다. 화면이 뜨는 데 걸리는 시간을 숫자로 재고, 그 숫자를 계약서에 적습니다. 못 지키면 그 부분은 청구하지 않습니다.

작업 보기

숫자로

23납품한 프로젝트
940평균 LCP(ms)
5유지보수 중

다루는 것

TypeScriptReact NativeNext.jsFlutterNode.jsPostgreSQL

만든 것들

iPhone Home Screen 중고 거래 앱 리뉴얼 React Native · 사용자 40만

FlatList를 걷어내고 이미지 디코딩을 워커로 옮겼습니다. 프레임 드랍 12% → 0.4%, 앱 평점 3.1 → 4.4.

↗ 링크 열기
Philadelphia Hospital Waiting Room 병원 예약 웹 Next.js · 서버 렌더링

서버 컴포넌트로 옮기고 폰트를 서브셋했습니다. LCP 4.8s → 0.9s, 예약 완료율 +23%.

↗ 링크 열기
20200813-FNS-LSC-1152 사내 물류 대시보드 React · WebSocket

가상 스크롤과 워커 필터링을 넣었습니다. 필터 반응 8s → 60ms, 새로고침 없이 실시간 반영.

↗ 링크 열기
Credit card payment, shopping 구독 결제 모듈 Node.js · PostgreSQL

멱등키와 재시도 큐를 넣고 실패 사유를 코드로 분류했습니다. 실패 300건 → 11건, 정산 오차 0.

↗ 링크 열기
Chicago Illinois - Hotel LaSalle Parking Garage - Neon Sign with Pointer - Now LOST 출퇴근 기록 앱 Flutter · 오프라인 우선

로컬 큐에 쌓고 연결이 돌아오면 자동 동기화. 미기록 문의 하루 20건 → 0건.

↗ 링크 열기
Mobile Wireframe 디자인 시스템 이전 TypeScript · 모노레포

토큰부터 정리하고 코드모드로 일괄 치환했습니다. 번들 340KB → 180KB, 빌드 시간 70% 단축.

↗ 링크 열기

일하는 방식

견적서에 성능 목표를 숫자로 씁니다. LCP 1.5초 이하, 상호작용 200ms 이하처럼요. 못 지키면 그 부분은 청구하지 않습니다.

납품할 때 측정 리포트를 같이 드립니다. 어떤 기기에서 몇 초가 걸리는지, 어디를 더 줄일 수 있는지 적어 둡니다.

Free Wired! 재는 것부터 시작합니다 추측으로 고치지 않습니다

일하는 순서

모든 프로젝트가 같은 다섯 단계를 지납니다. 단계마다 무엇을 넘기는지 미리 정해 둡니다.

  1. 1주차 · 측정지금 화면이 몇 초에 뜨는지부터 잽니다. 기기 다섯 대, 네트워크 세 종류.
  2. 2주차 · 목표 합의LCP·INP·CLS 목표치를 견적서에 숫자로 적습니다. 못 지키면 그 부분은 청구하지 않습니다.
  3. 3~6주차 · 구현매주 금요일에 배포하고 측정값을 같이 보냅니다.
  4. 7주차 · 회귀 테스트기기별로 다시 잽니다. 목표치를 못 넘기면 다음 주로 넘깁니다.
  5. 납품측정 리포트와 함께 넘깁니다. 3개월간 성능 회귀는 무상으로 잡습니다.

견적 기준

4최소 계약(주)
1주간 배포 횟수
3성능 무상 보증(개월)
지금 화면이 몇 초에 뜨는지 아세요 주소만 주시면 무료로 재서 리포트를 보내 드립니다. 계약과 무관합니다. 측정 요청

트러블슈팅 기록

납품물마다 겪은 문제를 문제 → 접근 → 결과 순으로 남깁니다. 같은 실수를 두 번 하지 않으려고 쓰기 시작했습니다.

  1. N+1 쿼리 — 목록 1건에 쿼리 41번문제: 주문 목록 20건을 부르는데 SELECT가 41번 나갔습니다.접근: 지연 로딩된 연관 엔티티를 JOIN FETCH로 한 번에 가져오도록 바꿨습니다.결과: 41 → 2 쿼리, 목록 응답 780ms → 120ms.
  2. 이미지 디코딩이 메인 스레드를 잡음문제: 목록을 빠르게 내리면 프레임이 12%까지 떨어졌습니다.접근: 디코딩을 워커로 옮기고 화면 밖 이미지는 미리 만들지 않게 했습니다.결과: 프레임 드랍 12% → 0.4%, 저가형 기기에서도 60fps 유지.
  3. 폰트 때문에 첫 화면이 1.9초 늦음문제: 웹폰트 4종을 모두 받고 나서야 글자가 보였습니다.접근: 실제 쓰는 글리프만 서브셋하고 fallback을 먼저 그리게 했습니다.결과: 폰트 720KB → 88KB, LCP 2.8s → 0.9s.
  4. 결제 중복 — 같은 주문이 두 번문제: 네트워크가 끊겼다 붙으면 결제가 두 번 잡혔습니다.접근: 요청마다 멱등키를 붙이고, 완료 표시를 성공 응답 이후로 옮겼습니다.결과: 월 300건 → 11건, 정산 오차 0.
  5. 배포하면 가끔 흰 화면문제: 배포 직후 접속한 사용자만 빈 화면을 봤습니다.접근: 원인은 캐시된 HTML이 사라진 청크를 부르는 것. 파일명 해시와 이전 버전 보존 기간을 두었습니다.결과: 배포 직후 오류 보고 0건.
  6. 3만 행 테이블에서 필터가 8초문제: 필터를 바꿀 때마다 화면이 멈췄습니다.접근: 가상 스크롤로 그리는 행을 줄이고 필터링을 워커로 옮겼습니다.결과: 8s → 60ms, 스크롤 중에도 입력이 먹힘.
  7. 타임존 때문에 하루가 밀림문제: 자정 근처 주문이 전날로 기록됐습니다.접근: 서버는 UTC로 통일하고 표시할 때만 지역 시간으로 바꿨습니다.결과: 날짜 관련 문의가 사라졌습니다.
  8. 새 항목

프론트엔드 — 주력

TypeScriptReactNext.jsReact NativeZustandTanStack QueryViteTailwind새 항목

백엔드 · 데이터

Node.jsNestJSPostgreSQLPrismaRedisBullMQGraphQL

인프라 · 측정

DockerGitHub ActionsVercelAWS ECSLighthouse CISentryPlaywright
LCP 0.9s · INP 120ms · CLS 0.01 · 오프라인 우선 · 접근성 AA·LCP 0.9s · INP 120ms · CLS 0.01 · 오프라인 우선 · 접근성 AA·LCP 0.9s · INP 120ms · CLS 0.01 · 오프라인 우선 · 접근성 AA·LCP 0.9s · INP 120ms · CLS 0.01 · 오프라인 우선 · 접근성 AA·

견적 문의

무엇을 만들지, 언제까지 필요한지, 어떤 기기를 주로 쓰는지 세 가지만 알려 주세요.
하루 안에 가능 여부와 대략의 범위를 회신합니다. 성능 목표는 견적서에 숫자로 적어 드립니다.

hello@millisecond.example 서울 · 원격 가능