Long-run operation of a payment app
We took on a mobile payment app that sees frequent payments, built its features, and ran it for a long stretch. While moving code written in an older programming language onto a new structure without changing its existing behavior, we kept the flow from payment request through failure and retry running. In a payment app, a single small defect becomes a question of user trust. The work spans the code migration, payment flows, camera document submission, multiple languages, and collecting and fixing app errors.
A code migration done without stopping a live payment app
The mobile payment app ran on code written in an older programming language, and that code was moved to a structure centered on the current language. Real payments were flowing through the service, so existing behavior stayed as it was while code boundaries were reorganized to make new features and maintenance easier. Payments kept happening during the move, so releases were conservative and the area around each change was rechecked every time.

A payment flow that never loses track of state, from request to retry
A mobile payment runs as a flow of payment request, authentication, result handling, failure response, and retry. While building and maintaining this flow, the exceptions and state handling that can arise at each step were checked with care. In a payment app, even one small defect shakes user trust at once.

Camera document submission, and messages that mean the same in every language
The mobile payment app includes a feature for photographing documents with the camera and submitting them. It was built and maintained with the real-world flow in mind: camera permission, the quality of the captured image, upload status, and failure handling. The user base is broad, so screen text was organized in several languages, and messages that must be precise, such as payment, authentication, and error messages, were checked against the screen flow to make sure they did not drift between languages.

Operations that gathered app errors and fixed causes first, with crashes near zero
Errors in the live mobile payment app were gathered and watched with an error-collection tool, traced to their cause, and fixed quickly. Throughout the operating period, the rate of app crashes was kept close to zero. The app was run alongside another payment app built on the same foundation, with issues shared remotely and the scope of each fix agreed.

Highlights
Moving old code onto a new structure while keeping existing behavior
Maintaining the payment flow from request and authentication through failure and retry
Operations that collected and fixed app errors, keeping crashes close to zero
Insights
GA4 client_storage: 'none'은 정말 쿠키를 막을까?
두 달 전 이 블로그에 「GA4 쿠키 없이 쓰기」라는 글을 썼습니다. clientstorage: 'none' 으로 쿠키 저장을 끄고, 자체 분석이 쓰던 익명 ID 를 clientid 로 넘기면 쿠키 0개로 GA4 를 쓸 수 있다는 내…
GA4 Measurement Protocol: gtag.js 없이 서버에서 이벤트 보내기
랜딩 페이지의 전송량을 파일 단위로 쪼개 보다가, 가장 큰 파일이 우리 코드가 아니라는 것을 알았습니다. Google Analytics 의 gtag.js 였고, 방문 한 번에 176KB 를 받고 있었습니다. 페이지 전체가 1,094K…
중소 제조업 AI 도입 순서: DX를 먼저 끝내야 할까?
공장을 가진 중소·중견 제조기업 16만여 곳 가운데 스마트공장을 도입한 곳은 19.5%입니다. 회사가 작을수록 이 비율은 더 떨어집니다. 중소벤처기업부가 2025년 4월에 낸 제1차 스마트제조혁신 실태조사 결과입니다. 그림: 기업 규…
Next.js loading.tsx와 404: 버튼이 화면보다 먼저 살아나게 하기
관리 화면 왼쪽 위에 사이드바를 접고 펴는 ☰ 버튼이 있습니다. 폭 하나 바꾸는 버튼인데, 대시보드에서 누르면 2초 넘게 아무 반응이 없었습니다. 레이아웃만 바꾸는 일이 왜 이렇게 오래 걸리는지부터 들여다봤습니다. Next.js 16…



