업박스 클라우드

약 5년 간 업박스 클라우드의 프론트엔드 설계 및 운영을 맡았습니다.

더 나은 제품을 만들기 위해 기여한 핵심 경험을 소개합니다.

2021.01 ~ 진행중 (약 5년 8개월)
팀 : PO 2 | DE 2 | FE 2 | BE 4
담당 : 프론트엔드 개발. 안드로이드 웹뷰 개발. 주로 어드민 화면과 업무/규제 도메인 담당
사용 기술 : Vue3, Typescript, Kotlin, AWS

프론트엔드 초기 아키텍처 설계

업박스 클라우드 1.0 → 2.0 대규모 개편을 진행하면서 새로운 코드베이스에서 시작했습니다.

초기 설계하는 기능들은 앞으로 수년간 반복 사용할 공통 컴포넌트와 기능이기 때문에

쉽고 직관적이며 알아서 작동하는 구조에 초점을 두었습니다.

프론트엔드 초기 구조 설계

업박스 클라우드 2.0의 프론트엔드 구조를 처음부터 설계했습니다.

적은 공수 대비 효율을 최우선으로 고려하여 기술스택을 비교하고 선정하는 과정을 거쳤습니다.

새로운 프레임워크 의사결정

기존 Vue2 사용 중, 새로운 프레임워크 도입을 위해 React 를 직접 테스트하여 장단점 비교

  • 기존 개발자들의 지식 기반이 Vue2이기 때문에, 온보딩 공수를 최소화하기 위함
  • 일관된 구조와 템플릿 규칙이 협업에 더 적절하다고 판단
  • 릴리즈 주기가 안정적이고 마이그레이션 용이

Vue3

패턴/규칙화된 구조
쉽고 직관적인 사용법
HTML / CSS 방식 그대로 사용

Vue3

React

자유로운 JSX/TSX 구조
풍부한 생태계와 채용시장
빠른 업데이트로 신규 기술 제공

React

안드로이드 웹뷰

한정된 리소스에서 웹과 모바일 앱을 동시 배포하여 초기 개발 공수와 유지보수 비용을 최소화하기 위해 웹뷰 방식을 선택했습니다.

  • 모바일 개발자가 부재하였고, 안드로이드 개발 경험이 있었습니다.
  • 네이티브의 기능을 심도 있게 활용하는 케이스가 없었습니다.

안드로이드 웹뷰

모바일 개발자 부재
웹과 동시 제공 가능
적은 공수

Android WebView

Kotlin

구글의 강력한 지원
Java 보다 유연한 구조
null 안정성

Kotlin

코드 베이스 구조

업박스 클라우드는 어드민, 드라이버, 커스터머 3개 제품을 제공합니다.

  • 단일 코드 베이스에서 빌드 및 배포 파이프라인을 구축했습니다.
  • AWS 인프라 및 GitHub Actions 를 활용하여 자동화했습니다.
코드
베이스
어드민데이터 관리
스케줄 생성
청구서 관리
드라이버스케줄 시작 및 작업
차량 관리
커스터머배출량 확인
행정 문서 다운로드
올바로 인계서

개발 생산성을 높이는 아키텍처 구축

동료 개발자와 함께 효율적이고 쉽게 개발할 수 있도록 DX 관점에서 설계했습니다.

공통의 코딩 컨벤션을 수립하고 맞춰 나가면서 코드 일관성을 유지했습니다.

컴포넌트 설계

  • slot 을 적절히 사용하여 확장성과 유연성에 초점을 두어 설계
  • 자주 사용하는 컴포넌트를 직관적이고 사용하기 쉽도록 DX에 집중
컴포넌트

코딩 컨벤션

  • 코딩 컨벤션을 맞추고, lint 의 커스텀 룰을 생성하여 통일성 유지
  • 추후 AI 개발을 도입하면서도 일관된 코드 품질을 유지
코딩 컨벤션

역할/권한 체계

  • 부여된 역할에 따라 Route Guard, 화면, UI 표시, API 호출을 분기
  • 권한 로직을 한곳에 모아 단일 포인트로 설계
권한

CI/CD

  • CI/CD를 자동화, 단순화하여 개발에 집중하는 환경 마련
  • Git 브랜치 규칙과 CI/CD 프로세스를 통합하여 구축
CI/CD

TailwindCss 도입

  • 디자인 시스템 토큰을 연동하여 UI 개발 생산성 증대
Tailwind CSS

i18n 도입

  • 정적 문자열을 통일된 키(Key) 체계로 표준화하고 파편화된 용어 정리
  • 인도네시아 해외 진출 제품에 재사용하여 신규 개발 기간 단축
i18n

AI 기반 개발 워크플로우 설계

AI의 발전에 따라서 자동화, 분석 등 도움을 받을 수 있는 부분을 적극적으로 찾아 활용했습니다.

개발 프로세스 자체를 스킬로 구성하여 기획 내용의 누락을 찾고, 디자인 시안을 자동으로 생성하였습니다.

반복 작업의 자동화를 넘어, 기획부터 디자인과 개발까지 이어지는 엔드투엔드 AI 기반 개발 프로세스를 설계했습니다.

개발 워크플로우 AI 스킬 구축

개발 프로세스를 AI 스킬로 구성하였고, 모든 동료들이 사용할 수 있는 보편화된 프로세스로 발전시켰습니다.

개발 워크플로우 스킬 흐름도

  • 프론트엔드 작업 프로세스를 스킬로 구성하고 개발, PO 팀에 공유하여 함께 사용
  • 기획 요건 파악, 영향범위 분석, 작업, 회고 순서로 진행
Claude개발 시작
영향범위 분석

기획에 누락된 기능이나 영향범위를 나열하여 사용자에게 질문

영향범위 분석 문서
Markdown 문서Markdown 문서Markdown 문서
코드 작업

AI 생성 코드의 품질 검증 및 비즈니스 로직 적합성 판단을 개발자가 주도

회고

기획 - 디자인 - 개발 연결

  • 공통의 워크플로우 사용으로 산출물 관리포인트 일원화
  • 기계적 문서 최신화
  • 통일된 용어 사용
버전 업데이트 화면

RSI 방식의 개선

  • AI가 작업 결과를 스킬과 문서에 재귀적 갱신 및 개선
  • 관리 공수를 최소화하고 스킬 관리를 반자동화
no-cachemax-age=n

토큰 및 효율 개선

  • 필요한 문서만 동적 로드하여 토큰 및 컨텍스트 단축
  • 도메인 간 영향범위를 graph 방식으로 구조화하여 탐색 효율화
Google Play 업데이트 화면

디자인 시스템 반영 및 AI 자동화

  • UDS(Upbox Design System)를 제품에 반영하며 디자이너와 함께 개선했습니다.
  • 개발 워크플로우 과정에서 피그마 시안과 컴포넌트를 활용하여 UI 를 구현하도록 하였습니다.

컴포넌트 레포 분리

  • 디자인 시스템 개편에 맞춰 컴포넌트 개선
  • 업박스 제품들 모두 같은 컴포넌트 사용

피그마 to 프론트

  • 피그마 시안을 프론트 UI로 AI가 자동 생성
  • 디자인 컴포넌트에 맞는 프론트 컴포넌트 코드 매핑 지침을 정의

디자인 토큰 및 변수 통일

  • 피그마의 변수 체계와 프론트 컴포넌트의 변수 체계를 통일시켜 AI의 속성 오용 제거
  • 디자인 시스템 토큰을 적용하여 자체 변수가 값을 마음대로 사용하는 문제 해결
요구사항 문서PRD 등 요구사항
ScreenFigma
TextFieldFigma
컴포넌트 코드 매핑컴포넌트 to Code 매핑<TextField />
Screen

제품 개선 및 문제 해결 사례

제품을 개발하며 발생했던 문제들과 저의 생각과 의도, 해결 과정을 공유합니다.

비용과 공수, 퀄리티 등의 조건에서 가장 최적의 해결 방법을 찾으려고 했습니다.

프론트엔드 캐시 오동작 해결

프론트엔드가 SPA 방식으로 작동하여 이전 번들이 캐시가 남아 있는 문제가 발생했습니다.

업데이트 시 캐시 무효화를 유도하여 오동작을 제거했습니다.

프론트엔드 캐시 이슈 발생

  • 기사님들 업무 마비
  • CS 다수 인입
  • 모니터링 수단 부재

데이터독 도입

  • 세션 리플레이로 버그 발생 시점 확인
  • 캐시된 구버전 사용이 원인임을 확인
  • 약 일주일 간 구버전이 남아 있기도 함
Datadog

버전 업데이트 기능 추가

  • CI/CD 시 버전 파일 생성 및 업로드
  • 동적 비교 후 업데이트 안내
버전 업데이트 안내

파일별 캐시 전략 분리

  • 갱신 필요한 파일은 캐시 미사용
  • 변동 적은 파일은 기간을 길게 적용
no-cachemax-age=n

안드로이드 업데이트

  • Google Play 서비스를 활용
  • 업데이트를 강제하여 안드로이드 버전 이격 제거
Google Play 업데이트

데이터독 도입을 통한 제품 고도화

모니터링 도구 부재로 발생한 에러 상황에 대해 개발자가 원인을 분석하기 어렵고, 사용자로부터 받은 정보에 의존해야 했습니다.

Datadog 도입을 제안하고 주도적으로 사용하여 에러 추적과 성능 개선, 데이터에 기반한 UI/UX 의사소통을 했습니다.

“Datadog in Seoul 2024” 에서 공식 연사로 사용 사례를 공유하는 좋은 기회를 가졌습니다.

데이터 기반 의사소통 예시 - 검색 컴포넌트의 키워드 검색 사용률 측정

  1. 검색 결과 리스트 화면에서 필터 영역이 과도하게 많은 부분을 차지
  2. 제공하는 필터 개수가 많아서 공간 차지 증가
결과 조회 시 스크롤하는 케이스 약 60%
상단 헤더검색어 입력부필터, 날짜 선택부결과 테이블
화면 밖으로 가려짐
  1. 커스텀 이벤트를 수집하여 Funnel 로 연결하여 페이지별 필터사용률 확인
  2. 필터 항목의 사용 빈도수를 조사하여 장기간 사용하지 않는 필터를 교체하고 유효한 필터만 유지
결과 조회 시 스크롤하는 케이스 약 40% 도달 / 사용하지 않는 필터 종류 약 10% 감소
필터 검색/키워드 검색 → 상세 페이지 진입 비율 측정
페이지 A 필터 전환율페이지 B 필터 전환율
필터 항목별 사용 빈도수 측정
필터 사용 빈도

사용하지 않는 필터 항목을 확인하고 다른 필터 항목으로 교체

CI/CD 개선

릴리즈 배포 시 원하는 시점에 완료되지 않는 문제가 있었습니다. CI/CD 구조를 개선하여 정해진 시간에, 정해진 번들만 배포할 수 있는

안정적인 구조로 개선했습니다. 릴리즈 배포에 걸리는 시간은 5분 → 1분 이내로 감소하였습니다.

배포 시작 → 빌드 → 배포배포 시간이 길고 빌드 실패 가능성이 있어서 불안정
코드 프리즈 → 미리 빌드 → 릴리즈 생성 → 배포사전 빌드를 통해 실질적 배포 시간 단축 + 안정성 확보

빌드

  • 단일 레포 → 단일 번들
  • 어드민, 드라이버, 커스터머 공동

하나의 앱에 다른 타입의 앱 기능이 포함되어 있는 문제

배포

  • 모든 앱 타입에 번들 배포

단일 앱의 변동사항 때문에 모든 앱의 배포가 강제되는 문제

빌드

  • 단일 레포 → 진입점 분기
  • 3타입 앱 별도 빌드

앱별 기능 분리 및 보안 강화
용량 최적화 (약 10%)

릴리즈 생성 및 아티팩트 업로드

  • 코드 작업 내용 기록
  • 번들 업로드

원하는 버전을 선택해서 배포 가능

Release 2.0.1

배포

  • 배포 대상 앱 타입만 지정하여 배포 진행

배포 소요 시간 5분 → 1분

× ↓ ↓

모바일 앱 푸시 알림 개발

백엔드 리소스를 최소한으로 사용하여 안드로이드 모바일 앱에 푸시 알림 기능을 개발해야 했습니다.

푸시 알림 데이터를 관리하지 않고, 프론트엔드에서 푸시 알림 기록을 저장하고 관리하기로 결정하고 아래 구조를 설계했습니다.

Firebase Cloud Messaging FCM

안드로이드
네이티브 앱

Foreground웹뷰에 바로 전달해서 저장
BackgroundAndroid Room 안드로이드 Room 임시저장백그라운드에서는 웹뷰 구동이 안 된 상태이기 때문

앱 구동 시 Room 에서
데이터를 로드해 웹뷰로 전달

브라우저 로컬 데이터베이스브라우저 로컬 DB에 저장알림 목록을 웹에 표시하기 위함
업박스 앱 알림 화면

핵심 과제 :
폐기물 E2E 추적 파이프라인 연결

폐기물법에 의해 수거(배출) → 운반 → 처리 과정동안 지정된 회사를 통해서만 수행이 강제되며, 어떻게 처리되었는지 정부에 보고해야합니다.

배출장-처리장 매핑 데이터 연결을 통한 규제 대응 및 서비스 핵심 가치 실현하였습니다.

이를 위해 대규모로 데이터 구조와 화면을 개선하였습니다.

배출장-처리장 매핑 데이터 연결 1 - 개념

폐기물법에 따라 폐기물은 지정된 배출장에서 지정된 처리장으로만 이동해야 합니다.

이 데이터를 투명하게 관리하고 고객에게 제공하는 것이 업박스 클라우드의 핵심 가치입니다.

폐기물의 수거부터 처리까지 추적하기 위한 데이터 연결 작업을 진행했습니다.

AS-WAS : 수거와 처리가 연결되지 않음

  • 배출된 폐기물이 어떤 처리장에서 처리되는지 알 수 없음
  • 운반 허가가 적법한 차량인지 알 수 없음
  • 추정 기반으로 고객에게 데이터 제공
수거1수거2수거3수거4
×
처리1처리2

AS-IS : 수거와 처리가 연결됨

  • 수거와 처리가 연결되며 어디에서 얼만큼 처리되었는지 알 수 있게 됨
  • 정확한 처리량을 기반으로 법적 서류를 제공
수거1수거2수거3수거4수거5수거6





처리1처리2

배출장-처리장 매핑 데이터 연결 - 스케줄 편집 화면 개선

그룹의 개념을 도입하며 복잡한 스케줄 편집 화면을 개선했습니다.

공용 배출장 개념을 도입하여 정산 자동화 비율이 증가했습니다.

그룹의 개념을 도입하여 수거와 처리를 연결

• N:1 관계 데이터 구조화
• 수거-처리 정확한 데이터를 고객에게 제공하여 법적 규제 해소
작업 그룹
● · ● · ●배출장 · 배출장 · 처리장

공용 배출장 개념을 도입해 여러 업장의 수거를 한번에 기록

• 여러 배출장 정산을 묶어서 진행하는 고객 케이스까지 정산 자동화 제공
• 전체 중 5% · 정산팀 소요시간 2일/매달
공용배출장

● · ● · ●

단일 화면을 단계별로 나누어서 직관적으로 사용

자연스러운 데이터 입력 흐름을 제공해 입력 UX 개선 및 업무 효율 증대
1단계2단계3단계
스케줄 편집 화면

배출장-처리장 매핑 데이터 연결 3 - 활용한 패턴

코드 규모가 커지면서 생겨나는 복잡하고 반복된 코드를 줄이는 것에 집중했습니다. 대표적으로 Provide / Inject 방식을 적극 활용했습니다.

깊은 depth 의 컴포넌트 간 Props Drilling 을 방지하고 기능은 중앙집중적으로 관리했습니다.

편집 페이지 컴포넌트Provide (<ScheduleProvider>)
Step2 컴포넌트Props 전달 제거
검색 패널 컴포넌트Props 전달 제거
검색 결과 리스트 컴포넌트Props 전달 제거
리스트 단일 아이템 컴포넌트Inject (useScheduleContext)
스케줄 편집 컴포넌트 화면

배출장-처리장 매핑 데이터 연결 4 - 권한 분기

관리자 권한과, 파트너 권한으로 같은 페이지에서 다른 기능을 제공해야했습니다. 화면과 기능, 호출하는 API 를 분기처리했습니다.

관리자 권한모든 데이터를 생성하고 편집 가능함
파트너사 권한권한에 따라 항목의 순서만 변경 가능하거나, 선택할 수 있는 데이터가 다름
관리자 화면파트너 화면자신의 소속 법인으로 고정3단계 순서 편집 기능만 제공할당 가능 차량 제한항목의 추가 삭제 불가

배출장-처리장 매핑 데이터 연결 5 - 기사님 앱 개선

처리 작업을 입력할 때 수거를 선택하는 과정이 추가되었습니다. 현장 업무 특성과 기사님의 높은 평균 나이를 고려해 복잡한 입력 화면을 개선해야 했습니다.

PO, 디자이너와 함께 아이디어를 논의하였습니다. 기사님이 한 화면에서 자유롭게 입력을 하는 것보다 정해진 플로우로 차근차근 입력하여 난이도를 낮추는 방향으로 작업했습니다.

초기 아이디어

한 화면에서 모든 입력 데이터를 한꺼번에 편집

단일 페이지에서 진행하여 복잡도 증가 문제
• 처리 작업 입력
• 수거 작업 선택
• 수거량 분배

결정된 방안

단계를 분리하고, 입력하는 데이터를 제한

입력 대상이 명확하여 집중적으로 입력할 수 있도록 쉽게 설계Step1 - 처리 정보 입력Step2 - 연결할 수거 작업 선택Step3 - 수거량 분배
처리 정보 입력수거 작업 선택수거량 분배

Cawtine : 단식 타이머

직접 간헐적 단식을 하기 위해 제작한 Next.js 로 만든 단식 타이머 앱입니다.

1인 개발로 UI의 구성과 기능을 직접 기획하고 정의하였습니다.

AI 에이전트를 페어 프로그래밍 파트너로 활용해 구현 방법과 아이디어를 논의하며 작업했습니다.

안드로이드와 iOS앱이 공개되어 있습니다.

2026.05 ~ 진행중 (3개월)
사용 기술 : React, Next.js, Capacitor, Firebase

직관적인 단식 타이머

앱을 개발할 때 가장 염두에둔 것은 “쉽다” 입니다.
하루하루 지속해서 사용해야하는만큼
쉽고 편해야 리텐션이 유지된다고 생각했습니다.

단식 타이머식사 기록 방식 선택식사 기록 입력

가장 중요한 기능은 단식 진행 시간을 표시하는 것이기 때문에, 시간을 가장 눈에 잘 띄도록 구성했습니다.
도형적 요소는 모두 SVG와 canvas 를 이용해 부하를 줄이고 경량화했습니다.

애니메이션은 Gsap 을 활용하여 스크롤 애니메이션을 추가했습니다. SVG 로 구성된 이미지들의 레이어를 Parallax 로 움직여 역동감을 추가했습니다.

단식 패턴 가시화

단식 성공 여부와 식사 패턴을 확인할 수 있도록
캘린더 형식으로 데이터를 제공합니다.

주간 캘린더월간 캘린더

평소 자주 먹는 시간대를 선정하여 표시합니다.
이 시간대에 푸시 알림을 보내서 식사 기록을 유도합니다.
최근 일주일 내 3회 이상 비슷한 시간대 기록된 케이스를 탐지하도록 하였습니다.

주간 캘린더에서는 원하는 시간을 클릭하여 식사 기록이 가능하도록 편의 기능을 제공했습니다.

설정 및 알림 제공

단식과 알림 설정테마와 화면 모드 설정

공복 목표 시간을 설정하는 것이 주요 기능이기 때문에 가장 앞순서에 배치했습니다.

로컬 알림을 보내 리텐션을 유지하도록 했습니다.
사용자가 직접 ON/OFF가 가능합니다.

  • 목표 달성 시
  • 12시간 이상 단식
  • 자주 식사하는 시간대

사용자의 취향에 맞춰 사용할 수 있도록 귀여운 고양이/까마귀 테마, 다크모드를 제공합니다.