Virtual-space social service
We developed the regular app screens of a virtual-space social service where people dress up avatars, gather in themed spaces such as a conference hall or an outdoor stage, and hold talks, meetups, and performances there. The 3D space is handled by a 3D engine and the service screens, such as account, home, and room entry, by the app, so both sides touch screen transitions and app state. When that boundary slips, what the user sees and what the app believes its state to be drift apart. The work spans the service screens, the boundary between the 3D space and the app screens, and collaboration with a team of more than 100 people.
The 3D space to the engine, the service screens to the app
The virtual-space social app holds, in a single app, a 3D space where avatars move and regular app screens such as account, home, room entry, events, and settings. Users pick their avatar's outfit and build, then open a room with a chosen theme or join one someone else opened, where they share materials and talk. The roles were split so the 3D engine draws the 3D space and the app draws the service screens itself. Picking a room from home, entering it, leaving, and returning home were arranged to flow naturally even as they cross between the two areas.

The seam where the 3D space and the app screens meet as you enter a room
In the virtual-space app, entering the 3D space, switching app screens, the connection session state, and the app going to the background and back all happen on different sides. When the four coincide they can collide, so the boundary where the 3D engine and the app meet was adjusted. Alongside the app-side feature work, this segment was handled so the roles of the 3D space and the app screens never blur.

Screen state that can be followed whatever order the signals arrive in
In the virtual-space app, login state, room entry state, network responses, and the moment the 3D engine finishes starting up all arrive at different times. Every screen was built on the same frame, separating user input, server responses, and screen state changes into inputs and outputs, so whichever signal arrives first, you can trace where the screen state changed. That frame later became the standard for designing screen structure in other projects.

Areas of ownership and interfaces settled first in a team of over 100
The virtual-space social service was built by a team of more than 100: app developers plus 3D, server, planning, and QA. On a single platform alone there were seven or eight app developers. For features whose changes spanned several platforms, ownership areas and the interfaces between them were divided first and development followed, with differences in behavior across platforms reconciled along the way.

Highlights
Service screens for the virtual space: account, home, room entry, events, and settings
A boundary tuned so entering the 3D space and switching app screens never collide
Screen state that stays traceable when login, room entry, and 3D start-up arrive out of order
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…



