브라우저에서 보기 ↗
김재경 프로필

문제를 끝까지 파고들어 구조로 개선하는 개발자

김재경

Frontend Engineer

Platform & DX

ReactTypeScriptNext.js

2020.12 ~ 현재

Frontend Engineer / FE Team Lead (2021~) @ Coconutsilo

About

라오스 O2O 플랫폼 KOKKOK의 React 기반 서비스 10개설계·운영해온 프론트엔드 엔지니어입니다.

6년차 프론트엔드 엔지니어로, 2020년 12월부터 코코넛사일로에서 근무하며 라오스 현지 O2O 플랫폼(이커머스·차량·물류·택시)의 어드민 웹 서비스를 처음부터 함께 만들고 운영했습니다. React 기반 서비스 10개, Next.js 랜딩 페이지 3개를 설계·개발하며 2~6인 규모의 프론트엔드 팀을 리드해왔습니다.

기능 구현에 머물지 않고, 팀이 더 빠르고 안정적으로 개발할 수 있는 환경을 직접 설계하고 정착시켜 왔습니다. 개별 레포 → 모노레포 전환 / 수동 배포 → CI/CD 자동화 / API 응답 불안정 → 런타임 검증 체계 구축처럼, 팀 전체가 체감하는 구조적 문제를 찾아 개선하는 일을 주도했습니다.

업무 외 시간에는 기획·설계·개발·배포까지 혼자 수행하는 풀스택 사이드 프로젝트를 진행하며 역량을 확장하고 있습니다.

Team Lead

2021년부터 2~6인 규모의 프론트엔드 팀을 리드하며 일정 관리, 기술 의사결정, 코드 표준화, 온보딩을 담당했습니다.

일일 스크럼 운영

매일 같은 시간에 30분 이내로 진행. 블로커 공유와 일정 조율 중심으로 운영

신규 팀원 온보딩

로컬 환경 셋업부터 코드 컨벤션·아키텍처·배포 프로세스까지 문서화 — 신규 입사자가 문서만으로 스스로 온보딩 가능하도록 구성해 커뮤니케이션 비용 절감

기술 의사결정 주도

TypeScript 도입, 모노레포 전환, Vite 마이그레이션 등 스택 전환 시점과 방향 결정

개발 표준 정립

타입 네이밍 규칙, 컴포넌트 패턴, 사전 PR 체크리스트 수립

Key Achievements

팀 생산성과 서비스 안정성을 높이기 위해 주도한 플랫폼·아키텍처 개선

타입 안전 API 검증

글 읽기 →

Problem

API 명세와 실제 API 반환 값이 불일치 시 흰 화면이 보여 서비스를 이용할 수 없었습니다. 또한, 원인 필드 특정에 시간이 오래 걸렸습니다.

Solution

  1. 01Typia로 API 응답 값과 명세를 비교해 런타임에 일치 여부 검증
  2. 02불일치 필드는 즉시 로그로 기록하고 불일치하는 모든 필드를 undefined 처리
  3. 03모든 API 응답 필드를 undefined 가능으로 가정하는 RecursiveUndefined(별칭 Pessimistic) 타입 설계로, 코드에서 undefined 예외 처리를 하도록 타입 레벨에서 강제
  4. 04이 과정을 팩토리 함수로 공용화 → 타입만 넘기면 10개 앱 전체에 동일한 검증 자동 적용
  5. 05Typia의 컴파일 타임 변환이 로컬 개발 서버까지 매번 실행되어 기동이 느려지자, 스크립트 이름으로 플러그인 적용 여부를 판단하는 needTypia 함수를 만들어 dev·dev-typia로 분리 — 평소엔 검증을 끄고 명세 불일치를 확인할 때만 켜되, build는 항상 검증을 유지

Result

  • API 응답 값과 명세가 불일치해도 서비스 중단 없이 정상 동작 유지
  • 불일치 발생 즉시 원인 필드 특정 가능 & 빠르게 이슈 대응 가능
  • 검증 모드 분리로 개발 서버 기동 최대 88% 단축 (A 서비스 53.8초 → 6.3초, FCP 기준)

모노레포 아키텍처

글 읽기 →

Problem

KOKKOK 플랫폼 내 서비스가 늘어날수록 관리해야 할 레포도 함께 늘어났고, 동일한 컴포넌트와 유틸이 레포마다 중복 복사됐습니다. 한 레포에서 컴포넌트 버그를 고쳐도 다른 레포에는 반영되지 않아 코드 불일치 문제가 반복됐습니다. 코드를 일치시키려면 레포 수만큼 같은 작업과 PR 확인을 반복해야 해서 업무 비효율이 컸습니다.

Solution

  1. 0110개로 흩어져 있던 멀티 레포를 Turborepo 기반 모노레포 1개로 전환
  2. 02공용 코드를 apis · components · hooks · utils · services · types · styles 7개 카테고리 패키지로 구조화 — 컴포넌트 164개, hooks 46개, utils 40개 등
  3. 03Vitest + Testing Library로 hooks·utils·components에 테스트 2,245개 구축 → 공용 코드 변경 시 오류 사전 감지

Result

  • 10개 앱에서 동일 공용 패키지 사용 — 수정 즉시 전 앱 반영, 관리할 레포 수 감소로 업무 효율 향상
  • hooks·utils·components에 테스트 2,245개 — push 전 자동 실행으로 공용 코드 회귀 버그 사전 차단

CI/CD 자동화

글 읽기 →

Problem

React(SPA)는 로컬 빌드 → S3 업로드 → CloudFront 초기화 과정을 배포할 때마다 사람이 수동으로 반복해야 했습니다. 배포 절차가 문서로 작성되어 있었지만, 관리해야 할 문서도 많았고, 수동 작업이 많아 휴먼 에러도 자주 발생했습니다. 롤백도 수동 복구라 오래 걸렸습니다.

Solution

  1. 01React(SPA) — 재빌드 없이 이미 올라간 버전으로 즉시 재배포·롤백할 수 있도록, 빌드·S3 업로드용과 배포·CloudFront 무효화용 GitHub Actions 2개로 단계를 분리
  2. 02공용 validation 워크플로우로 배포 전 버전 형식·환경별 실행 권한·AWS 리소스 존재 여부를 자동 검증
  3. 03모노레포 안에서도 10개 서비스를 한 번에 배포하지 않고, 원하는 서비스만 원하는 시점에 독립적으로 배포할 수 있도록 구성
  4. 04시맨틱 버저닝으로 S3에 버전별 결과물을 보관해 문제 발생 시 즉시 이전 버전으로 롤백

Result

  • 복잡한 배포 지식 없이 누구나 간단하게 배포 명령만 실행
  • validation 워크플로우가 버전 형식·환경 권한을 자동 검증해 잘못된 배포를 사전에 차단
  • 배포·롤백 모두 수 분 내 처리
  • 반복적인 수동 작업 제거로 휴먼 에러 방지

번들 최적화

Problem

초기 React 앱 빌드 결과물이 단일 index.js에 집중되어 초기 로딩이 느렸습니다.

Solution

  1. 01lazy import 코드 스플리팅 — 페이지 단위로 분리해 초기 로드 범위 축소
  2. 02Vite manualChunks 분리 규칙 설계 — 외부 라이브러리·공용 패키지·앱 코드를 종류별로 분리해, 변경 없는 라이브러리는 브라우저 캐시로 재사용
  3. 03배럴 파일 1,600개 제거 + assets·i18n 앱별 이관 — 사용하지 않는 SVG·PNG·언어 파일이 번들에 포함되는 것을 차단

Result

  • 초기 진입 번들 최대 92% 감소 (carAdmin 4,990kB → 375kB)
  • manualChunks 적용 후 index.js 최대 91% 감소 (carInspection 925kB → 86kB)

전역 상태 최적화

Problem

전역 상태를 ContextAPI로 관리하고 있었는데, 컴포넌트가 실제로 필요한 값보다 넓은 범위의 상태를 구독하는 구조였습니다. 그래서 상태 하나만 바뀌어도 관련 없는 하위 컴포넌트까지 전부 리렌더링됐고, 일부는 실제 버그로 이어졌습니다. useModal이 modals 배열 전체를 구독해 로그아웃 시 모달 상태 초기화 → 전체 리렌더링 → 만료된 토큰으로 API 재요청 → 401 오류 → 흰 화면이 뜨는 버그가 있었고, RoutePathProvider·AuthProvider 등도 ContextAPI 기반이라 NavigationBar를 클릭할 때마다 Header 내 모든 아이콘·버튼·드롭다운이 리렌더링되는 것을 React DevTools Profiler로 확인했습니다.

Solution

  1. 01ContextAPI 기반 전역 상태를 Zustand + selector로 전환 — 컴포넌트가 실제로 쓰는 값이 바뀔 때만 리렌더링되도록 구독 범위를 좁힘
  2. 02useModal 구독 범위를 필요한 함수 참조만으로 좁혀 로그아웃 버그 수정 — modals 배열 전체 구독 제거
  3. 03RoutePathProvider, AuthProvider(class 인스턴스 + ContextAPI), useGoogleMap, Toast, Navbar 등을 Zustand selector와 React.memo로 전환
  4. 04useLocation 의존성을 window.location.pathname과 router 싱글톤 패턴으로 대체해 react-router-dom 상태 변경에 의한 추가 리렌더링 제거
  5. 05개선된 공통 코드(Auth.tsx, authStore.ts 등)를 packages/로 이동해 10개 앱 전체에 일괄 적용

Result

  • 로그아웃 시 401 오류 + 흰 화면 버그 수정
  • NavigationBar 클릭 시 Header 전체 리렌더링 제거 (React DevTools Profiler 확인)
  • 10개 앱 전체 불필요 리렌더링 구조 개선

Other

기타 개선 사례

MSW 기반 개발 환경

API 서버가 준비되기 전에도 화면 개발이 막히지 않도록 MSW를 도입했습니다. 신규 이벤트 앱(kokkok-event)의 MSW·Typia 세팅과 친구 초대·출석체크·룰렛 3개 이벤트 mock 개발을 주도했고, 서버 enum이 바뀔 때마다 영향받는 mock을 일괄 갱신했습니다. 5개 앱에 mock 핸들러 70개가 적용돼 있고, 신규 앱 생성 스크립트에도 MSW가 기본 템플릿으로 포함돼 있습니다.

API 중복 호출 방지 (useSafeMutation)

버튼 연속 클릭 시 같은 API가 여러 번 실행되는 문제를 막기 위해 useMutation 기반 커스텀 훅을 만들었습니다. 진행 중인 요청에 고유 ID를 부여해 중복 요청을 차단하고, 훅을 쓸 때 에러 처리 방식(전역 / 화면별)을 반드시 선택하도록 강제해 팀 내 에러 처리 누락을 방지했습니다.

커밋 자동화 (Husky + lint-staged)

커밋 전 ESLint 자동 수정과 Prettier 포매팅을 강제 실행하고, 허용된 prefix가 없으면 커밋을 차단합니다. 스테이징된 파일을 분석해 서비스명을 커밋 메시지에 자동으로 추가해, 커밋 메시지 표준을 체계적으로 관리합니다.

정적 분석 자동화 (ESLint / Stylelint)

ESLint — import 순서 자동 정렬, import type 사용 강제. Stylelint — CSS 속성 순서 자동 정렬. 정적 분석을 자동화해 PR 리뷰에서 코드 스타일 지적이 사라지고, 핵심 로직 리뷰에만 집중할 수 있게 됐습니다.

VSCode 자동완성 속도 개선 (10초 → 2초)

모노레포에서 i18next 번역 타입 선언 규모가 커지면서 VSCode IntelliSense 자동완성 계산에 최대 10초가 걸렸습니다. TypeScript 5 업그레이드, 서비스별 JSON 분리, 타입 선언 단순화(typeof json → Record<key, string>), 배럴 파일 약 1,600개 제거를 단계적으로 적용해 2초로 단축했습니다(-80%).

Migrations

기술 전환 요약

FromToBackgroundResult
JavaScriptTypeScript런타임 오류가 배포 후에야 발견컴파일 타임 오류 검출, DX 개선
Redux + Redux-SagaTanStack Query서버 상태 코드 과다서버 상태 보일러플레이트 대폭 감소
CRAVite빌드·HMR 속도 저하빌드 시간 대폭 단축, HMR 즉각 반응
개별 구현React Hook Form + ZodForm마다 개별 구현으로 중복 발생Form 로직 표준화, 재사용 증가
YupZodTypeScript 친화성 부족, 코드 복잡스키마에서 타입 자동 추론, DX 개선
없음MSWBE 지연 시 FE 일정도 함께 밀림FE·BE 개발 일정 완전 분리
npmpnpmnode_modules 중복으로 디스크·설치 느림설치 속도·디스크 사용량 체감상 크게 개선
개별 레포Monorepo (Turborepo)공용 코드 중복·버전 불일치10개 앱 동일 패키지 사용, 수정 즉시 전 앱 반영

Work

KOKKOK Platform

라오스 현지 O2O 플랫폼. React 기반 서비스 10개, Next.js 랜딩 페이지 3개를 설계·개발·운영.

KOKKOK Admin WEB

B2B Internal서비스소개

초기 아키텍처 설계, 공용 컴포넌트 설계, API 연동, 권한 시스템 설계, 운영 전반

라오스 음식 배달·마트 배달·이커머스·eGift·드라이버·고객·지원 관리 등 KOKKOK 플랫폼 전체를 관리하는 메인 어드민. 4개의 비즈니스 도메인을 통합 관리하며 도메인별 접근 권한 제어·다국어·실시간 지도 연동·대량 데이터 테이블 처리가 복합적으로 얽혀 있습니다.

172

Pages

4

Domains

2~6인

Team Size

ReactTypeScriptTanStack QueryZustandEmotionGoogle Maps APIi18nextTypiaMSWViteTurborepo

KOKKOK Move Admin WEB

B2B Internal서비스소개 Android iOS

프로젝트 초기 세팅, 주요 화면 개발, API 연동, 지도 기반 차량 위치 기능 구현, 운영 및 유지보수

라오스 전기 툭툭 택시 서비스 어드민. 실시간 차량 위치 추적, 기사·차량·배터리·고객 관리, 배차 모니터링, 랭킹 등. GPS 기반 실시간 지도와 IoT 기기 상태를 함께 처리합니다.

27

Pages

실시간 GPS

Feature

ReactTypeScriptTanStack QueryZustandEmotionGoogle Maps APIi18nextTypiaMSWViteTurborepo

KOKKOK Car Admin WEB

B2B Internal서비스소개 Android iOS

프로젝트 초기 세팅, 차량 등록·관리 화면 개발, API 연동, 공용 컴포넌트 적용, 운영 및 유지보수

라오스 신차·중고차 판매 플랫폼 어드민. 차량 등록·판매 관리, 광고 배너, 딜러·고객 관리 등.

55

Pages

차량 등록·판매

Features

ReactTypeScriptTanStack QueryZustandEmotioni18nextTypiaMSWViteTurborepo

그 외 어드민

KOKKOK Logistics Admin

물류 배송·배차·인보이스 관리, 기사·차량 등록 (16개 페이지)

KOKKOK Delivery

배달 주문 관리 (9개 페이지)

KOKKOK Car Inspection

차량 검수 어드민

KOKKOK Move IoT

IoT 기기 관리 어드민

KOKKOK Event

출석체크·룰렛 등 이벤트 페이지

KOKKOK Store

스토어 관리 어드민

KOKKOK Move Ranking

택시 기사 랭킹 뷰 — 순위·평균 운행 지표 확인 (기사용, 1개 페이지)

랜딩 페이지 3종

KOKKOK 서비스 소개, 코코넛사일로 회사 소개, 데이터 바우처 신청. 웹·모바일 적응형 UI, 다국어.

Next.jsTypeScriptEmotioni18nextTanStack Query

Side

사이드 프로젝트

자산 관리 스튜디오

Live

2026.05 · Solo (기획·설계·개발·배포 전 과정)

주식·ETF·예금·부동산·코인 등 12개 자산 유형을 통합 관리하는 개인 자산 추적 웹앱. 날짜별 원금·평가액 기록, 수익률·IRR 자동 계산, Yahoo Finance / Finnhub 실시간 시세 연동, Recharts 포트폴리오 시각화, 회원가입 없이 체험 가능한 데모 모드, 다크모드, 한국어·영어 지원.

12

Asset Types

Playwright

E2E Tests

Vercel

Deploy

새로 적용한 기술

  • Next.js App Router + React 19
  • Supabase 풀스택 설계
  • 외부 시세 API 서버 측 호출 횟수 제한 (과다 요청 방지)
  • Vitest + Playwright E2E 테스트 환경 구축
Next.jsReact 19TypeScriptSupabaseZustandReact Hook FormZodRechartsVitestPlaywright

주보 뷰어 PWA (잠실중앙교회)

Live

2026.06 · Solo (기획·설계·개발·배포 전 과정)

모바일·태블릿·웹 전 기기에서 쓸 수 있는 반응형 PWA로 실사용자 대상 운영 중. R2 Cache-Control·next/image 최적화·cache tag revalidate 3중 캐싱으로 이미지 네트워크 요청을 최소화했고, 어드민에서 주보 업로드·순서 변경(드래그앤드롭)·관리자 계정 관리·로그인 기록 조회·R2 무료 티어 사용량 모니터링을 제공. 기존 주보 이미지를 크롤링해 미리보기 후 일괄 등록하는 기능도 구현. Flutter 기반 iOS/Android 앱도 함께 개발해 스토어 출시를 준비 중.

Web + iOS/Android

Platform

Vitest + Playwright

Tests

Vercel

Deploy

앱 스토어 출시 준비

Status

Next.js 16React 19TypeScriptTailwind CSS v4Drizzle ORMSupabaseCloudflare R2PlaywrightFlutterDart