Introduction
화면 앞의 경험도, 화면 뒤의 구조도 타협하지 않는 개발자
사용자가 매일 마주하는 화면이기에, '이 정도면 됐다'에서 멈추지 않습니다. 눈에 보이는 UX의 디테일과 눈에 보이지 않는 견고한 아키텍처를 같은 무게로 다룹니다. 웹과 모바일 WebView, 폐쇄망까지 어떤 제약 환경 속에서도 타협 없이 '기어코 되는 방법'을 찾아내는 것이 저의 개발 방식입니다.
전 계층을 관통하는 설계와 압도적인 팀 생산성 향상
복잡한 비즈니스 도메인에서 500개 이상의 화면을 아우르는 프론트엔드 아키텍처를 단독 설계하며, 주니어 개발자들도 일관된 품질을 낼 수 있는 탄탄한 기반을 마련했습니다. 화면 개발에만 머물지 않고 사용자 흐름, 필요하다면 백엔드 API와 DB 설계까지 전 계층을 관통하는 최적의 구조를 지향하고, 성능 병목 분석과 로딩 전략 설계를 통해 사용자 체감 성능까지 책임집니다. 또한, 반복되는 CRUD 패턴을 단일 공통 컴포넌트로 추상화하여 팀의 개발 공수를 대폭 단축하는 등, 구조적 개선을 통한 생산성 향상에 항상 집착합니다.
기획 너머의 불편함을 찾는 UX 디테일
고객이 요구하기 전에 숨겨진 불편함을 먼저 찾아 더 나은 UX를 제안합니다. 정보가 밀집된 화면에서 꼭 필요한 정보만을 직관적으로 보여주되 과하지 않도록, 그 미묘한 균형을 찾을 때까지 치열하게 다듬습니다.
'AI 네이티브(AI-Native)' 중심의 개발 인프라 구축
단순히 AI가 생성한 코드에 의존하는 것을 경계하고, 탄탄한 기술적 이해를 바탕으로 AI를 통제하는 개발을 지향합니다. AI를 개인용 코드 생성기를 넘어 30여 개의 컨텍스트 문서를 기반으로 팀 전원이 동일한 맥락에서 활용하는 'Agentic AI' 협업 인프라로 구축해 냈습니다. 제약이 많은 실무 환경에서 독자적인 아키텍처로 한계를 극복하고, 사이드 프로젝트(ChartSage)를 통해 모던 스택을 끊임없이 탐구하며 그 결과를 팀과 프로덕트의 성장에 녹여내는 데 집중합니다.
Skills
Frontend Engineering
Frontend Architecture
State Management
UI Engineering
Canvas & Graphics
Mobile & WebView
Backend Integration
Database & Search
DevOps & Deployment
Development Workflow
Development Tools
AI · Dev Tools
AI · Knowledge Management
Documentation
Side Projects
차트의 현자, 'ChartSage'
"그려서 물어보고, 시나리오로 답한다." 금융 차트 도메인에서 바이비트 수준의 차트 드로잉·기술 지표 모듈과 Claude Code/ChatGPT 스타일의 세션별 대화 관리를 결합한 AI 암호화폐 분석 플랫폼. 캔들스틱·RSI·MACD 등 차트 도메인을 직접 학습하며 개발하고, WebSocket 경쟁 상태·Canvas 곡선 보간·다중 타임프레임 전환 등 실전 엣지케이스를 해결하며 재사용 가능한 모듈로 체계화. OpenAI GPT-4o API를 활용해 사용자 드로잉과 시장 데이터를 결합한 AI 분석 파이프라인을 구축하고, Freemium 구독 기반 수익모델(Free/Pro)까지 설계하여 실제 비즈니스 가치를 갖춘 프로덕트로 발전시키는 중. 향후 대시보드·속보·리포트 다운로드 등으로 확장 예정. 기획·설계·프론트엔드·서버리스 백엔드·배포까지 1인 풀사이클 개발.
현재 드로잉 도구 모듈(feature/drawing-tools), 기술 지표 모듈(feature/indicators) 각 기능 브랜치에서 병렬 개발 중
- 조코딩 x OpenAI x Primer AI 해커톤 참여 및 MVP 제출 (2026.02)
- Feature-based Zustand 설계 — chart·drawing·session·analysis·onboarding 5개 독립 스토어로 관심사 분리, devtools 미들웨어로 상태 추적
- TradingView Lightweight Charts v5 커스텀 Primitive 구현 — Canvas 직접 렌더링 + hitTest 기반 드로잉 선택·호버 인터랙션
- Factory Pattern 드로잉 도구 시스템 — ToolConfig 인터페이스로 도구별 포인트 요구사항 추상화, 설정 추가만으로 새 도구 확장 가능
- 기술 지표 모듈 설계 — RSI·MACD·볼린저 밴드 등 기술 지표를 독립 모듈로 구현, 차트 Primitive와 분리된 레이어에서 렌더링
- Vercel API Routes + OpenAI GPT-4o 서버리스 백엔드 — 차트 OHLC + 사용자 드로잉 컨텍스트를 프롬프트에 자동 주입하여 AI 분석 정확도 향상
- Multi-session 아키텍처 — 세션별 드로잉·대화·예측 상태 격리, 세션 전환 시 스토어 간 단방향 동기화
- driver.js 27단계 인터랙티브 온보딩 — 데모 액션 시스템(드로잉 자동 주입·패널 열기·예측 애니메이션) + 스텝 간 상태 복원
기술 목표
- 커스텀 Canvas 드로잉 시스템 — 바이비트 수준의 20+ 도구 구현
- AI + 통계 하이브리드 예측 — LLM 환각 방지 아키텍처
- 실시간 WebSocket + 다중 레이어 Canvas 렌더링 최적화
- 5개 Zustand 스토어 간 세션 동기화
- 예측 시나리오 시각화 — 미래 가격 경로 애니메이션
갤러리 보기 (3장)
MVP 실제 구현 화면
BTC/USDT 차트 + AI 분석 패널
조코딩 x OpenAI x Primer AI 해커톤 지원 페이지
상세설명 · 비즈니스 모델 캔버스
Experience
유클리드소프트
2020.09 ~ 재직 중
공공·기업 시스템 개발 SI 기업 · 프론트엔드 개발
Infinite Canvas PDF 마크업 뷰어 — 자사 솔루션
- 발주처
- 자사 솔루션 (스마트온 2.0 첫 적용)
- 기간
- 2026.04 ~ 진행 중
- 역할
- 1인 솔로 개발 (기획·설계·UI/UX·구현 전반)
유클리드소프트 자사 솔루션으로 개발 중인 PDF 마크업 뷰어 모듈. Spring Boot iframe 과 Android WebView 두 호스트 환경에 단일 코드베이스로 임베드되도록 설계되었으며, 현재 스마트온 2.0 웹·앱에 첫 적용 사례로 도입되어 솔루션과 적용이 병행 진행 중. PDF.js 로 페이지를 렌더링하고 Paper.js 가 마크업 객체를 직렬화하며, PathKit-WASM 으로 기존 paper.js 의 fragile 한 boolean 연산을 대체. 1000+ 페이지 PDF 도 페이지 가상화 + LRU 압축 캐시로 메모리 폭주 없이 처리하는 Infinite Canvas 뷰어.
단일 viewStore 기반 Infinite Canvas 좌표계 설계
- 옛 모드의 분산 상태(zoomControl.scale + pinchZoom.currentScale + viewport scroll left/top)를 단일 viewStore (translate(x,y) + scale + rotation)로 통합, 페이지 wrapper 에 CSS transform 한 번으로 적용
- Paper.js 캔버스의 view.viewSize 를 PDF pt 단위 native 로 고정하여, 마크업 좌표가 줌·회전과 무관하게 항상 PDF pt 로 저장 → 줌 인/아웃, 회전 후에도 마크업 정렬 어긋남 0
- isAnimating 토글로 transition 적용 여부 제어 — 페이지 전환 등 *수동 변경* 시에만 240ms 보간, 핀치·드래그 등 *능동 변환* 중에는 즉시 반응
- Boundary 클램프 (MIN_VISIBLE_PX 80px) 로 페이지가 viewport 밖으로 완전히 사라지지 않도록 pan/zoom 결과 자동 보정
페이지 가상화 + 압축 캐시 — 1000+ 페이지 PDF 대응
- PdfPageViewer 가 visibility window 를 계산하여 현재 보이는 페이지 ± buffer 만 렌더링, 페이지 전환 시 PageCanvasManager 가 마운트/언마운트되어 Paper.js scope 도 함께 정리
- CompressedMap(hot LRU 100 슬롯 + cold lz-string compressToUTF16) 으로 페이지별 paper.js JSON 보관 — 압축 비율 8~12배 (1000 페이지 × 50KB = 50MB → 5MB cold + 5MB hot)
- Adaptive DPI 렌더링(adaptiveDpi.ts) 으로 화면 폭에 따라 페이지 해상도 자동 조절, DPR-aware 렌더로 레티나·고배율 디스플레이 선명도 확보
PathKit (Skia WASM) 기반 robust 지우개 재설계
- paper.js 내장 boolean 연산의 fragile 함(centerline split·legacySubtract 등) 으로 인한 잔여 path / 깨진 도형 문제를 Skia 의 PathOps subtract 로 교체
- 드래그 중에는 시각 path(blendMode: destination-out) 로 GPU 합성 즉시 시각 erase, pointerup 시 PathKit subtract 로 실제 데이터 갱신하는 2단계 모델
- 공간 인덱스(grid hash) 도입(CELL_SIZE 64px, GRID_THRESHOLD 50) — O(N) layer scan 을 eraser bounds 가 겹치는 cell 의 item 만 검사하는 O(local) 로 단축, 100+ stroke 페이지 에서도 지우개 stutter 0
시그니처 UI — 액체 모핑 도구 탭 인디케이터
상단 도구 버튼 *바로 아래* 로 슬라이드 다운하는 colored 탭(현재 색·두께/fontSize 숫자 표시) → 탭을 누르면 동일 DOM 박스가 풀 도구설정 팝오버로 *액체처럼* 부풀어 변형. 6개 속성(width / height / left / top / 4개 border-radius) 을 동시에 transition 하여 탭 ↔ 팝오버를 단일 컨테이너 모핑으로 표현.
- cubic-bezier(.3, 1.4, .5, 1) 380ms 탄성 over-shoot easing 으로 시그니처 모션 구현
- ::before(solid tab 색 base) + ::after(글래스 overlay) cross-fade 로 배경 색이 회색 깜빡임 없이 자연스럽게 전환
- WCAG relative luminance 계산으로 탭 배경색 명도 기준 흑/백 텍스트 자동 분기 — 사용자가 어떤 색을 골라도 두께 숫자 가독성 보장
- {#key currentTool} 로 도구 전환 시 컴포넌트 재마운트 → Svelte transition:fly 가 *옛 탭 슬라이드 업* + *새 탭 슬라이드 다운* 동시 처리
도구별 메모리 + 도구별 맞춤 팔레트
- brushSettings 가 도구별 마지막 색·두께·fontSize 를 colorByTool / widthByTool / fontSizeByTool Map 으로 보존, 도구 전환 시 applyToolDefault() 로 마지막 값 자동 복원
- 도구 성격에 맞는 차등 팔레트 설계 — pen=풀 팔레트(rainbow 7×6 + grayscale 1열 = 49색), highlighter/사각형/원/선=simplifiedPalette 5색(Tailwind 400~500 채도), text=textPalette 6색(검정+5색), eraser=색 섹션 없음
- 정합 정책 — 각 도구의 기본색은 *그 도구의 팝오버 팔레트* 안에 반드시 존재해야 함 (초기 active 표시 보장)
페이지별 Undo/Redo 히스토리 매니저
- 페이지별 snapshot 스택(페이지당 200, 전체 1000 cap) 으로 형광펜·펜 100+ stroke 도 끝까지 undo 가능
- 300ms debounce 로 연속 입력을 단일 스냅샷으로 압축, 마지막 스냅샷 중복 방지 Map 으로 동일 상태 push 차단
- 활성 페이지가 바뀌면 canUndo/canRedo 가 해당 페이지 스택을 derived 로 자동 반영
이중 호스트 브리지 — Android WebView / iframe postMessage
- window.pdfv.* (호스트 → 뷰어 API) — loadPdf / loadPdfStreamUrl / loadPdfBase64, setVisibility(patch), setSaveIntent, setCustomButtons, setSideToolbarPosition, restoreEditCanvas, showFatalError, registerConfirmHandler / registerToastHandler
- window.conn.* (뷰어 → Android JsInterface) — onSaveComplete(json, deletedIds), closeViewer, retryPdfLoad, requestPageImage(pageNum, dpi, reqId)
- iframe `postMessage` 채널로 Spring Boot 임베드 환경에서도 동일 API 사용 가능 — 호스트별 분기 코드 제거
- Visibility 패치는 키 기반 다단계 patch (`overlay.popover.history` / `toolbar.side.rotate` 등) 로 UI 요소 단위 표시/숨김 호스트 위임
Svelte 5 runes + Factory Function 패턴 일관 적용
- 옛 `$:` reactive 구문 / writable store 폐기, $state / $derived / $effect 일관 사용으로 반응성 추적이 컴포넌트와 lib 모듈을 동일 모델로 관통
- 모든 lib 모듈을 class 대신 `createXxx()` factory function 으로 노출 — `$state` 를 함수 내부에 자연스럽게 캡슐화, 인스턴스화 비용 낮음, 의존성을 명시적 인자(DI)로 받음
- 20+ factory (pdfLoader / pdfRenderer / imageLoader / pageNavigation / viewStore / viewPinchZoom / viewWheelZoom / paperCanvas / pageCanvasManager / canvasState / brushSettings / drawingMode / highlighterMode / eraserMode / shapeTools / textMode / selectionMode / lassoMode / historyManager / lowResPreview / userOverlay …) 를 PdfViewer.svelte 가 단일 오케스트레이터로 조립
- tsc --noEmit + svelte-check 통과 필수 컨벤션, 주석은 *왜(Why)* 중심 — *무엇(What)* 은 코드로 자명하면 생략
글래스모픽 chrome 통일 디자인 시스템
- 상단 PdfToolbar / 사이드 toolbar / Popover / ConfirmDialog / SaveFab / ToolTabIndicator 모두 동일 글래스 패턴 — linear-gradient(135deg) 3-stop white α + backdrop-filter blur(10px) saturate(140%) + slate-tone shadow
- `@supports not (backdrop-filter: blur())` 폴백 분기로 미지원 브라우저에서도 시각 일관성 확보
- tab(solid 도구 색) ↔ popover(글래스) 전환을 ::before / ::after 두 layer 의 opacity cross-fade 로 처리, 단일 컨테이너에서 두 상태 시각이 자연스럽게 morph
마크업 도구 8종 + 텍스트 inline 편집
- 선택 / 영역선택(lasso) / 펜 / 하이라이터 / 지우개 / 사각형 / 원 / 직선 / 텍스트 9개 도구, 각각 createXxx 모드 모듈로 분리
- 펜 — Paper.js Path 에 Galaxy S Pen 압력 반영 (pressure 0~1 → strokeWidth × (0.3 + p × 1.4))
- 하이라이터 — 반투명 stroke + butt linecap 으로 형광펜 메타포 재현
- 텍스트 — Paper.js PointText + inline 편집기 + TextEditMiniToolbar (색·폰트 크기 mini 툴바) 로 캔버스 위에서 바로 편집
- 선택 — selectionBox + 8-방향 selectionResize 핸들로 객체 이동·리사이즈, lasso 는 marquee 영역 선택
저장 파이프라인 — chunked save + lz-string 압축
- FAB Speed Dial 클릭 → 페이지별 canvasState.exportJSON() → lz-string 압축 → window.conn.notifySaveChunk(pageNum, chunk) chunked 전송 → 전체 페이지 완료 시 notifySaveCommit()
- SaveProgressDialog 로 진행률을 실시간 시각화하고, 미저장 상태에서 닫기 시도 시 ConfirmDialog 로 사용자 의도 확인
- 호스트가 등록한 registerConfirmHandler / registerToastHandler 로 확인 UI 를 호스트 네이티브 UI 로 가로채기 가능 — Android 다이얼로그 / iframe parent toast 와 시각 통일
양손 핀치 줌 + 휠 줌 + 회전
- viewPinchZoom — 두 손가락 핀치 시 viewStore.zoomAtPoint(scale, focal) 직접 호출하는 DOM 직접 조작 없는 새 모드, 검지+중지 *완전히 붙인* 채로 핀치인 시작 케이스도 정상 인식하도록 MIN_PINCH_DISTANCE_PX=0 + 거리 임계 100px 팜리젝션
- viewWheelZoom — Ctrl + 휠 줌, 휠만 사용 시는 네이티브 스크롤로 위임
- 페이지별 회전(0/90/180/270°) — rotations Record<pageNum, deg> 로 *현재 보고 있는 페이지만* 적용, 회전된 4 모서리의 외접 사각형 계산으로 viewport bounding box 정확히 추적
호스트 UI 위임 + Visibility 패치
- 사이드 툴바 위치를 호스트가 `right' | 'bottom'` 으로 선택 가능 — 같은 뷰어가 데스크탑(오른쪽)·태블릿 가로(아래) 두 레이아웃으로 적응
- registerConfirmHandler / registerToastHandler 로 호스트가 자체 UI 로 가로채기 — Android 네이티브 다이얼로그, Spring 모달 등과 시각 통일
- setSaveIntent('save' | 'mail' | 'approval' | 'custom') 로 FAB 라벨·아이콘을 호스트 워크플로우에 맞춰 동적 변경
- setCustomButtons(json) 로 Save FAB Speed Dial 에 호스트별 sub-action 주입
러닝 포인트
- Svelte 5 runes — 컴포넌트와 비즈니스 로직을 동일 반응성 모델로 통일
- Infinite Canvas — 좌표계를 통합하면 기능이 자동으로 따라온다
- 라이브러리의 fragile 한 영역을 다른 도구로 대체하는 결정 — paper.js boolean → PathKit
- 1인 솔로 개발에서 UI/UX 디테일에 시간을 쓰는 이유
- 호스트 위임형 API — "호스트가 무엇을 결정하게 할 것인가"
기여 포인트
기획·설계·UI/UX·구현 전체를 1인 솔로 개발. 첫 Svelte 5 runes 도입과 factory function 패턴 일관 적용으로 컴포넌트와 비즈니스 로직을 동일 반응성 모델로 통일. PathKit-WASM 으로 paper.js boolean 의 fragile 한 영역을 대체하여 robust 한 지우개 재구축. 단일 viewStore + Paper.js PDF pt native 좌표계로 줌·회전·팬과 마크업 좌표의 의존성 제거. 호스트 위임형 API(setVisibility / registerConfirmHandler / setSideToolbarPosition 등) 로 Android WebView 와 Spring Boot iframe 두 환경을 분기 코드 없이 동시 지원. 도구 탭 ↔ 팝오버 액체 모핑·글래스모픽 chrome 통일 등 시그니처 UI 디테일을 자발적으로 설계.
갤러리 보기 (3장)
메인 뷰어
상단 도구 탭 인디케이터(highlighter 5색 팔레트) + 좌측 썸네일 + 우측 사이드 툴바
펜 팔레트 · 작업 이력
rainbow 7×6 + grayscale 1열 풀 팔레트 + 다른 사용자 마크업 토글 popover
가로 페이지 · 하이라이터
페이지별 회전(Landscape) + 반투명 butt linecap 하이라이터 stroke
스마트온 2.0 APP — 가스 현장검사 오프라인 태블릿 앱
- 발주처
- 한국가스안전공사(KGS)
- 기간
- 2026.02 ~ 진행 중
- 역할
- 앱 개발 리드 (3명 리딩)
스마트온 2.0 웹 시스템을 기반으로 VPN/인터넷 없이 현장에서 독립 운용 가능한 Android 태블릿 앱을 구축하는 프로젝트. 내장형 LocalWebServer(NanoHTTPD) + SQLite 오프라인 DB로 128개 테이블을 로컬 복제하고, 150+ REST API 엔드포인트를 앱 내부에서 제공. 30개 AI 컨텍스트 문서(CLAUDE.md·아키텍처·포팅 가이드)를 구축하여 팀원 전원이 Claude Code로 일관된 컨텍스트 위에서 개발할 수 있는 AI 협업 체계를 설계. VPN 연결 상태에 따라 온오프라인 모드를 자동 전환하고, 오프라인에서 작성한 검사표와 PDF 마크업을 온라인 복귀 시 서버에 동기화하는 양방향 데이터 흐름을 구현. 초기 출시 이후에도 멀티프로세스 격리·청크 저장·서버사이드 Flatten·사용자 PDF 격리·보안 감사 등 운영 안정성과 보안을 지속 강화.
하이브리드 온/오프라인 아키텍처 설계
- 내장 LocalWebServer에 Spring-style 어노테이션 프레임워크(@RestController, @PostMapping 등) 자체 구현, 웹 서비스 레이어 80% 재사용
- Gradle 플러그인으로 Controller/Service 보일러플레이트 자동 생성, 150+ REST API 엔드포인트를 앱 내부에서 서빙
온오프라인 모드 전환 및 네트워크 처리
- NetworkManager로 VPN 연결 상태를 실시간 감지하고, 연결 끊김 시 커스텀 에러 페이지에서 자동 재연결 시도(10초 카운트다운) + 3회 실패 시 오프라인 모드 전환 버튼 노출
- 오프라인 모드 진입 시 로컬 저장된 자격증명으로 인증 처리하고, 온라인 복귀 시 쿠키 초기화 후 서버 재접속 + 대기 데이터 자동 업로드
- 네이티브 2단계 로그인(VPN→OTP)을 WebView 단일 화면으로 통합, VPN 터널 타이밍 레이스컨디션을 폴링+재시도 패턴으로 해결 (WebViewCookieJar로 OkHttp↔WebView 세션 자동 공유)
WebView ↔ Native 브릿지 성능 최적화
- @JavascriptInterface의 동기 호출이 SQLite 쓰기 잠금과 충돌하여 수 초간 UI 프리징이 발생하는 문제를 근본 원인까지 추적, 비동기 디스패치 패턴으로 전환하여 UI 응답성 확보
- 다운로드 병렬 처리 시 스레딩 모델과 DB 잠금 경합 문제를 분석하여, @JavascriptInterface 메서드 전체를 I/O-free 원칙으로 재설계
오프라인 데이터 동기화 엔진
- OfflineDataSyncManager로 18+ 동기 서비스를 관리하고, SyncQueueHelper로 검사결과 저장과 업로드 큐 등록을 하나의 트랜잭션으로 처리
- 온라인 전환 시 SYNC_QUEUE → Canvas → PDF 순서로 대기 항목을 자동 업로드하고, 실패 시 지수 백오프로 재시도
- 증분 동기화로 변경분만 다운로드하고, 시설 단위로 50+ 테이블의 연관 데이터를 일괄 포함하여 오프라인 현장 조회 지원
- 모바일 네트워크 불안정성을 고려하여 일괄(Atomic) 대신 테이블 단위 부분 실패 허용 다운로드 전략을 채택, 중간 실패 시에도 완료된 데이터는 보존하고 실패 테이블만 재시도
Oracle→SQLite 자동 변환 레이어
- MyBatis 스타일 커스텀 SqlMapper ORM (Spring 미의존), 동적 SQL 빌딩 + 파라미터 바인딩
- NVL→COALESCE, DECODE→CASE WHEN, ROW_NUMBER, MERGE 등 함수 자동 변환, 128개 테이블 DDL 기반 SQLite 스키마 자동 생성
오프라인 PDF 마크업 편집 및 동기화
- 오프라인에서 PDF에 서명·주석을 편집하면 편집여부와 동기화 상태를 추적하고, 온라인 복귀 시 서버에 자동 반영
- Canvas JSON과 마크업 PDF를 각각 동기화하는 이중 업로드 파이프라인 구성, 이미지 압축으로 업로드 트래픽 절감
- PDF·스캔이미지 다운로드 이력을 로컬 DB에 기록하여, 앱 재시작 후에도 다운로드 상태를 복원
초기 로드 성능 최적화 (Gzip + Lazy Load + Splash)
- 초기 로드 분석 결과 109개 리퀘스트 / 9.9MB / 15초 빈 화면 문제를 식별, Gzip 압축 + OpenLayers(747KB) 지연 로딩 + 미사용 라이브러리 Defer 전략으로 전송량 ~2.5MB로 약 75% 경량화
- WebView 로딩 중 인라인 스플래시 화면을 적용하여 체감 대기시간을 제거하고, ScriptLoader를 확장(loadCssOnce, loadOpenLayers)하여 메뉴 최초 진입 시 동적 번들 로딩 구현
오프라인 UX 피드백 시스템
- 온/오프라인 상태를 현장 작업자가 즉각 인지할 수 있도록 Body 배경색·뱃지·SpeedDial·메뉴 비활성화 4계층 시각 피드백 설계
- 다운로드·동기화 11가지 상태를 순수 SVG + CSS 애니메이션으로 시각화 (stroke-dasharray 원형 프로그레스, 체크마크 드로잉, 시머 리플)
- Normal→Warning→Critical 3-상태 머신 기반 플로팅 세션 타이머 구현, 터치 임계값으로 드래그/탭 분리 및 보안 요구사항에 맞춘 갱신 로직 설계
팀 AI 협업 체계 구축
- CLAUDE.md·아키텍처·포팅 가이드 등 30개 AI 컨텍스트 문서를 구축하여 팀원 전원이 Claude Code로 일관된 컨텍스트 위에서 개발 가능한 환경 설계
- 커스텀 스킬(front-sync, scm, svn-commit-msg) 등록으로 반복 작업을 자동화하고, MCP 서버 연동으로 AI 에이전트의 작업 범위 확장
AI 기반 개발 프로세스
- Claude Code + MCP 활용하여 Oracle→SQLite 쿼리 포팅·스키마 변환 작업을 AI로 자동화, 128개 테이블 포팅 생산성 극대화
- 오프라인 앱 구조 설계 후 팀원에게 도메인별 업무를 분배하고, 코드 리뷰를 통해 품질 관리. 150+ API·8개 비즈니스 도메인 커버
- 자체 MCP 서버 개발 (`mcp-servers/db-schema/`) — Oracle 4개 스키마(CMORA01·HRORA01·SAORA01·SMART) DDL 파일을 파싱하여 5종 도구 (`get_table_schema`·`search_tables`·`search_columns`·`list_schema_tables`·`get_table_for_query`) 노출, Claude 가 SQL 작성 시 Oracle 원본 컬럼·타입을 정확히 조회하도록 도구화 — "DDL.sql 만 보고 추측" 회귀 사전 차단
- Gradle 플러그인 `ControllerRegistryPlugin` 자체 구현 — `@RestController` Java 소스 정규식 스캔, 다중 파라미터 생성자 + 동명 Service 패키지 alias 자동 생성, `ServiceContainer` Reflection 기반 DI ([Context, SqlMapper] 우선 · [SqlMapper] fallback) 로 Spring 스타일 컨벤션을 NanoHTTPD 위에 재현
- 7 Phase 오프라인 포팅 방법론 정립 (`docs/25_OfflinePorting/OFFLINE_PORTING_METHODOLOGY.md`) — "Oracle NULL → SmartHashMap → SQLite 빈문자열" 호환성 함정, `COALESCE/IFNULL` 빈 문자열 통과 함정, `INSERT OR REPLACE` vs `MERGE INTO` 동작 차이 등 실패 사례 + 예방 체크리스트 문서화
PdfViewer 멀티프로세스 격리 + Overlay WebView 풀링
PDF 뷰어를 별도 프로세스로 격리하여 OOM 사고가 메인 앱을 끌고 가지 않도록 분리. 그러나 격리는 새로운 문제를 만들었다 — 메인 프로세스의 PrimeVue UI(Drawer·SpeedDial)가 PdfViewer 위에 얹히지 못함. 정공법으로 우회 아키텍처를 설계.
- `AndroidManifest.xml` 에 `android:process=":pdfviewer"` 별도 프로세스 분리 → A0 도면 줌 OOM 이 메인 앱 + VPN 동반 사망으로 전파되던 회귀 차단
- 풀스크린 투명 WebView OverlayActivity + 위젯별 HTML 분리 (`widget-drawer.html` / `widget-speeddial.html`) 로 메인 프로세스 UI 차폐 문제 우회 — PrimeVue 컴포넌트를 별도 Activity 로 PdfViewer 위에 얹음
- `OverlayWebViewPool` 정적 풀 — WebView 인스턴스 + 페이지 로드 200~400 ms 를 mainPage 로드 직후 preload, 첫 클릭 비용 0 달성. close 시 자동 재부팅 사이클로 풀 유지
대용량 PDF 청크 저장 + 탭 라이프사이클 복원
- 1000+ 페이지 PDF 마크업 저장 시 메모리·Intent 1 MB 한계를 회피하는 청크 누적 패턴 — `onSaveChunk(seqId, pageNum, json)` 호출마다 `Map<String, TreeMap<Integer, String>>` 에 페이지별 JSON 누적, `onSaveCommit(seqId, totalPages, partialUpdate)` 시 단일 객체로 합쳐 기존 저장 경로 재사용
- 저장 직전 `/cmm/session/keepAlive.do` 호출로 세션 검증 → 만료 시 `anonymousUser` 로 저장되던 회귀 차단, 만료 감지 시 Svelte `window.pdfv.showAlert` + Activity finish 로 강제 재로그인 유도 (Native AlertDialog 폐기, Svelte 다이얼로그로 통일)
- 탭 비활성화로 finish 된 PdfViewerActivity 를 사용자가 탭 복귀 시 캐시된 unsaved canvas 로 자동 재 launch — `EXTRA_RESTORE_FROM_STATE` Intent extras 통한 1회성 복원, mainPage 탭 시스템과 별도 프로세스 PdfViewer 인스턴스 라이프사이클 연동
서버사이드 PDF Flatten 전환 + 분산 동시성 가드
- 로컬 PDF flatten + 멀티파트 업로드 경로 폐기 — `MarkupPdfFlattenManager` + `PdfUploadManager` 를 서버사이드 PDFBox flatten 호출 (`/cmm/pdfviewer/reflattenOnServer.do`) 로 이관, APP 디스크·대역폭 부담 해소 + `pdf_upload_queue` 테이블 제거
- 동일 (`ATCH_FILE_NO`, `SN`) 에 대해 PdfViewerActivity 즉시 reflatten 과 UploadManager 배치 reflatten 이 동시 발화하는 케이스를 30초 ConcurrentHashMap 디바운스 (`RECENT_FLATTEN`) 로 차단
- 동시성 락 격상 — `GLOBAL_UPLOADING` AtomicBoolean 을 인스턴스 단위에서 JVM 전역 락으로 격상, Scheduler / MainActivity / NetworkManager 다중 트리거 중복 동시 진입 차단
- `callReflattenOnServer(serverUrl, maxVersion)` — 저장 직후 `BAKED_MAX_VERSION` 전달로 STALE 분기 회피 (낙관적 버전 전달)
오프라인 동기화 자동화 — 3중 트리거 + 실패 사유 분기
- 3중 트리거 보장 — (1) 5분 주기 `ScheduledExecutorService` (`CanvasAutoSyncScheduler`, INITIAL_DELAY 2분→10초 단축) (2) `NetworkCallback` 회복 시 5초 디바운스 자동 발사 (`NetworkManager.scheduleSyncTriggerOnReconnect`) (3) VPN+OTP 성공 직후 즉시 발사 (`MainActivity.checkAndStartPendingUpload`)
- `UploadOutcome` enum 3분기 (SUCCESS / FAILED_RETRY / FAILED_AUTH_SKIP) — 401·403 인증 만료는 retry_count 미증가로 사용자 재로그인 후 자연 복구, 일반 일시 오류만 max_retry 카운트
- 회복성 — max_retry 5 → 20 상향, 24시간 경과 FAILED 자동 NOT_SYNCED 복구 (`recoverStaleFailedCanvas`), JVM 전역 `GLOBAL_UPLOADING` 으로 다중 트리거 중복 차단
사용자별 PDF 격리 + 매직바이트 진단
- 공용 태블릿 순차 로그인(검사관 A→B) 시 검사관 A의 PDF 가 B 에게 노출되는 보안 이슈를 PK 확장 (`atch_file_no`, `sn`, `user_id`) + 사용자별 디렉토리 분리 `pdfDirectory/{userId}/` 로 완전 격리
- SQLite PK 마이그레이션 — 임시 테이블 + INSERT + DROP + RENAME 트랜잭션 패턴 + 백업으로 무손실 마이그레이션
- "표시명은 `.pdf` 인데 매직바이트가 HWP (`D0 CF 11 E0`)" 디스크 파일 진단 → 가스안전공사 PDF 변환 솔루션 (`TRANS_*.pdf` / `PDF_CHG_SCS_YN`) 우회 경로를 신규 전용 엔드포인트 `/offline/getInspectionPdfFile.do` 로 분리 (옵션 C — 기존 `getPdfFile.do` 회귀 0건)
WebView 보안 감사 — 10건 조치 + 위험도·사이드이펙트 평가
WebView 기반 하이브리드 앱의 보안 취약점을 단순 나열이 아닌 위험도(높음/중간/낮음) + 사이드이펙트 + 선행조건까지 명시한 감사 보고서로 정리. 즉시 조치 10건 + 향후 검토 4건 (`docs/51_Security/SECURITY_AUDIT_REPORT.md`).
- VPN 비밀번호 평문 → AndroidX `EncryptedSharedPreferences` AES256-GCM + 평문 자동 마이그레이션 (`LoginPreferences.kt`)
- WebView 정책 강화 — `setAllowUniversalAccessFromFileURLs` / `setAllowFileAccessFromFileURLs` / `setAllowFileAccess` 3종 false, `MIXED_CONTENT_ALWAYS_ALLOW` → `COMPATIBILITY_MODE`, DevTools 조건부 활성화
- JS Injection 방지 — `callJavaScriptCameraCallback` · `onReturnDate` · `notifyNetworkStateChanged` 콜백에 `'`, `"` 이스케이프
- 경로 순회 방지 — `showPdfFromBase64` · `showPdfOnline` · `showEtcUrlPOP` URL 스킴 화이트리스트 + `File.getName()` + 특수문자 치환
- 민감정보 로깅 (쿠키·응답 body·POST body·GET params) 을 `BuildConfig.DEBUG` 조건부로 변경 — Release 빌드에서 로그캣 노출 차단
- 향후 검토 4건 (HTTP 평문·임시 PDF 잔류·FileProvider 경로 개방·콜백명 미검증) 은 *알면서 미루는* 의식적 판단으로 별도 우선순위 기록
GPS 듀얼 모드 + 실내 한계 기술 보고서
- `GpsManager` 3개 독립 모드 동시 운영 — 단발 조회 (`requestCurrentLocation`, 60초 타임아웃·5분 캐시), 연속 추적 (`startLocationTracking`, idempotent · `onPause/onResume` 자동 일시중지 · accuracy 30 m 필터), fresh 단발 (`requestFreshLocation`, 추적과 동시 진행 · requestTime - 1500 ms 이전 fix 거부 · 15초·100 m)
- "실내에서 GPS 안 됨" 사용자 문의를 위성 신호 감쇠율 (콘크리트 99%+) + VPN 의 Google 위치 서버 차단 라우팅까지 분석한 기술 보고서로 응답, VPN 화이트리스트 / 사내 WiFi DB / BLE 비콘 / 수동 입력 4가지 대안 검토안 제시
- `ConnectivityManager.NetworkCallback` 으로 VPN/WIFI/MOBILE/ETHERNET 트랜스포트 + validated capability 실시간 감지, 회복 시 5초 디바운스 후 미동기화 데이터 자동 업로드 발사
러닝 포인트
- 웹→네이티브 아키텍처 이식 — "동일 코드베이스, 다른 런타임" 전략
- 오프라인-퍼스트 동기화 설계 — 결국 "충돌 해소 정책"이 핵심이다
- Oracle→SQLite 자동 변환 — AI에게 "맥락"을 주면 반복 작업이 사라진다
- Spring 없이 Spring-style — 프레임워크의 본질은 "컨벤션"이다
- 3명 팀 리딩 + AI 협업 — 사람과 AI의 역할 분담 설계
- 별도 프로세스 격리 — 분리는 격리이자 새로운 통합 문제다
- 보안 감사 — 단순 나열이 아니라 위험도·사이드이펙트·선행조건까지
기여 포인트
웹 프로젝트에서 설계한 프론트엔드 아키텍처(IIFE 모듈, 메타데이터 라우팅, P-Edit-DataTable 등)를 Android 앱에 성공적으로 이식. 초기 로드 경량화·WebView 브릿지 비동기화·오프라인 UX 피드백 시스템 등 성능과 사용자 경험 전반을 주도적으로 개선. 출시 이후 멀티프로세스 격리·Overlay WebView 풀링·서버사이드 Flatten·사용자 PDF 격리·WebView 보안 감사·자체 MCP 서버 등으로 운영 안정성과 보안을 지속 강화. 3명의 팀원을 리딩하며 30개 AI 컨텍스트 문서 기반 AI 협업 체계를 설계.
스마트온 2.0 구축 — 가스 현장검사원 태블릿 업무 시스템
- 발주처
- 한국가스안전공사(KGS)
- 기간
- 2025.03 ~ 진행 중
- 역할
- 프론트엔드 아키텍트 / 기술 리드 (4명 주니어 리딩)
수천 명의 현장검사원이 사용하는 태블릿 업무 시스템을 전면 고도화하는 프로젝트. 기존 jQuery + Vue 1.x + jqGrid 레거시를 Vue 3 + PrimeVue 기반 현대적 아키텍처로 완전 재구축하면서, 기존 비즈니스 로직의 입출력 구조를 분석하여 더 효율적으로 리팩터링. 관공서 폐쇄망(Node.js 설치 불가, 외부 CDN 접근 차단) 환경에서 500+ 업무 화면을 운영하는 태블릿 시스템. 초기 구축 이후에도 PDF 뷰어 풀스택 통합·서버사이드 렌더링·오프라인 동기화 정합성·다운로드 성능 등 풀스택 영역의 후속 개선을 지속.
폐쇄망 프론트엔드 아키텍처 설계
- Node.js·npm·Webpack/Vite 사용이 불가한 폐쇄망에서 IIFE 패턴 기반 모듈 시스템을 설계하여 private 스코프 확보 및 전역 오염 방지
- 라이브러리를 UMD 빌드로 반입하고 의존성 그래프를 설계하여 로딩 순서 관리
- Promise 기반 ScriptLoader로 필요 시점에만 JS 파일을 동적 로드하여 초기 로딩 시간 50% 단축
메타데이터 기반 자동 라우팅 메뉴 시스템
- 서버에서 메뉴 메타데이터(menuId, compName, script 경로 등)를 수신하여 MenuRegistry가 캐싱하고, ScriptLoader가 동적 로드 후 ContentPanel이 Vue 컴포넌트를 자동 마운트하는 구조 설계
- 새 메뉴 추가 시 프론트엔드 코드 수정 제로, 개발 시간 80% 감소
인라인 편집 그리드(P-Edit-DataTable) 독자 설계
- PrimeVue DataTable 기반으로, 유료 솔루션(AG Grid 등) 없이 자체 설계한 3계층 아키텍처
- useEditGridFactory: 행 상태 머신 + 셀 단위 Dirty Tracking + 필수값·중복값 검증 + 일괄 저장 페이로드 자동 분류
- p-edit-datatable: VNode 변환 + 상태별 시각 피드백 + 변경 내역 팝오버
- p-edit-column: 선언적 required/unique/disabled prop
- 데이터 편집 워크플로우 4단계→1단계 단순화, 업무 개발자 CRUD 구현 코드량 80% 감소
디자인 시스템 및 PrimeBridge 모듈
- PrimeVue 4.x의 definePreset API로 커스텀 프리셋(smartonPreset)을 구성하고, colorScheme: { light, dark } 구조로 라이트/다크 모드의 semantic 토큰을 분리 정의
- darkModeSelector 설정으로 CSS 클래스 토글만으로 26개 컴포넌트가 일괄 테마 전환, 컴포넌트 설정 코드 95% 감소
Stateful App Shell 탭 시스템
- 단순 내비게이션을 넘어 시스템 전체의 골격(App Shell)으로 동작하는 Workspace Navigator 설계
- 탭별 독립 Vue 앱 인스턴스 생성으로 상태 격리, 이벤트 버스 기반 PopupService로 부모 탭 닫힘 시 자식 팝업 자동 정리
- WeakMap 활용 참조 순환 방지, 100개 탭 스트레스 테스트 메모리 누수 0건 통과
Tab Edit Mode UX 혁신 — iOS 홈 화면 앱 정리 UX 착안, 4단계 점진적 발전
검사원 1인당 5~10개 이상 탭을 동시 유지하는 환경에서, X 버튼 오터치·되돌리기 불가·일괄 정리 부재 문제를 해결하기 위해 고정형 탭 바를 In-place Edit Layout으로 혁신.
- X 버튼을 제거하고 Trash Zone 드래그 삭제를 도입, SortableJS delay:500 + onChoose/onUnchoose/onStart 콜백 조합으로 빠른 탭(<500ms→전환) / 롱프레스+드래그(→정렬) / 롱프레스+릴리스(→편집모드 진입) 3가지 터치 제스처를 정밀 분기. 고객 요구 이전에 자발적으로 제안·구현.
- "다수 탭 일괄 삭제 시 개별 드래그는 피로도가 높다"는 현장 피드백을 반영하여 iOS 위글 애니메이션, ⊖ 버튼 삭제 마킹(Set 토글 + 롤백), 블러 오버레이, ConfirmPopup 저장/취소(스냅샷 롤백) 설계.
- 개별 삭제 API N회 호출을 deleteBatchUserOpenMenu 단일 배치로 최적화.
- driver.js 코치마크 온보딩 도입, 스텝 전환 시 DOM 재생성으로 인한 체크 상태 소실을 클로저 변수로 해결.
태블릿 UX 최적화
- Hammer.js — 스와이프 패널 열기/닫기·롱프레스 제스처
- OverlayScrollbars — 네이티브 대비 공간 절약 커스텀 스크롤, v-os-scroll 디렉티브 간편 적용
- Sortable.js·Swiper.js는 Tab Edit Mode에서 심층 활용
외부 Svelte 5 PDF 뷰어 풀스택 통합 — 자사 시스템 표면으로 흡수
자사 솔루션으로 개발 중인 Svelte 5 PDF 뷰어(10,500줄)를 가스피아 SFTP·DRM·내부망 구버전 Chrome·멀티탭·앱·웹 전 표면에 통합. 외부 데모 라이브러리 도입을 넘어 데이터 모델 합의 → 외부 시스템 SQL 약속 충족 → 좌표 규범 통일까지 풀스택 책임.
- `MARKUP2_TRANS_*.pdf` 파일명 분리로 SmartOn 1.0 자산 보존, Append-only `PDF_CANVAS_DATA` 테이블 + 4단 폴백 체인 (`MARKUP2_TRANS → MARKUP_TRANS → TRANS → 원본`) 으로 단일 진실의 원천 확보
- 가스피아(KGSC) `STA00101MServiceImpl.getPdfDownload()` 표준 약속을 위해 `/techdocu/...` 경로 일관화, 외부 시스템과의 SQL 약속을 코드 변경 없이 충족
- Paper.js exportJSON 배열 형식(`["Path", {segments:[[100,200]], strokeColor:[0,0,0]}]`) 을 객체 형식으로 재귀 정규화 (`normalizeRawItem` + `normalizeSegment` + `normalizeColor`) 하여 "에러 없이 조용히 안 그려지는" 3중 silent failure 진단·수정
- `__DocumentViewer.openPDF` 단일 진입점 + `customButtons` 콜백 레지스트리 패턴으로 직렬화 불가 JS 함수의 Activity 전달 문제 해결
PDF 메타데이터 응답 50초+ → 100 ms — 서버 캐시 3계층 + prewarm
- 948페이지 PDF 첫 응답 50초+ (readTimeout) → 100 ms 내. 서버 메타 응답이 36 DPI 로 전 페이지를 실제 렌더링하던 사고를 `PDPage.getCropBox()` + `getRotation()` 메타 추출로 교체
- `PdfFileCache` 3계층 캐시 — PDF LRU+TTL(20분) / JPEG 디스크 캐시(500 MB LRU+TTL 60분) / 페이지 메타(20분) + 임시 PDF 토큰(30분 TTL), key 별 lock 으로 동시 요청 직렬화
- DPI 별 차등 JPEG 품질 (`PdfImageService.qualityForDpi()` — 썸네일 0.60 / 저해상도 0.75 / 본문 0.85) + 첫 페이지 백그라운드 prewarm + `getInitialBundle.do` 로 메타+첫 페이지 1 round-trip 통합
- Base64 인코딩 33% 오버헤드 제거 — `pageImage.jpg` 바이너리 직접 응답 + Blob URL 수명 관리 (`URL.revokeObjectURL`) 로 브라우저 HTTP 캐시 활용
오프라인 마크업 동기화 정합성 — 11개 빈틈 1Cycle 보강
검사원 제보 "동기화 안 됨" 의 실제 원인이 `pdf_file.sync_status` 미갱신으로 인한 UI 표시 결함임을 진단. P0/P1/P2/P3 11개 빈틈 전수 점검 후 한 야간 배포로 일괄 보강 (APP r1577/r1578 + Web 7e8f349).
- VPN+OTP 직후 `uploadPending(SYNC_QUEUE only)` 호출 빈틈을 `uploadAllPending(SYNC_QUEUE + Canvas + reflatten)` 통합으로 교체, max_retry 5 → 20 상향 + 24h 경과 시 자동 NOT_SYNCED 복구 (`recoverStaleFailedCanvas`)
- 오프라인 삭제·부분 업데이트 의도가 서버 미전달되어 reflatten 시 옛 마크업이 부활하던 회귀를 발견, `PDF_CANVAS_DELETE_QUEUE` / `PDF_CANVAS_UPDATE_QUEUE` 별도 큐 테이블 2개 신설
- `UploadOutcome` enum 3분기 (SUCCESS / FAILED_AUTH_SKIP / FAILED_RETRY) 로 401·네트워크·5xx 실패 사유 구분 — 인증 만료 시 retry 카운트 미증가로 자연 복구 보장
- 동시 발화 차단 — `AtomicBoolean static` 화로 Scheduler/MainActivity 동시 발화 전역 락, `requestServerFlatten` 30초 디바운스로 PdfViewerActivity 즉시 호출 + UploadManager 배치 호출 중복 제거
Oracle 오프라인 다운로드 최적화 — 풀스캔 제거 + 의존성 체인 + COUNT(*) 해시
- JENNIFER APM "TOO MANY FETCH" 워닝 진단 결과, `getRelatedMasterDataTable.do`(6,099 ms / 9회 호출) / `getGlobalReferenceCodes.do`(1,704 ms / 14개 테이블 풀스캔) 발견
- Phase 1 — 서버 캐싱 — `OfflineDownloadService.getCachedOrLoad()` TTL 60분 ConcurrentHashMap (13개 참조 테이블), 배정건 단독 다운로드 시 SKB0101MV_01 사전 체크
- Phase 2 — 의존성 체인 IN절 필터 — `배정건(LAW_TC/STIC_LAG_TC/ROLE_TC/INSP_KIND_TC) → inspTableSns → inspItemLrclCds → inspItemSmclCds → msrmtItemMdclSns` 5단 도출 후 6개 풀스캔 쿼리에 IN절 주입
- Phase 3 — 해시 변경 감지 — 13 테이블 행 수를 단일 DUAL select 로 한 번에 조회 + 카테고리 해시 비교, APP `SYNC_STATUS.table_hash` 컬럼 마이그레이션 (`COALESCE` 후방 호환), 2회차+ 변경 없는 카테고리 스킵
- SQLite WAL 동시 쓰기 미허용 특성에 따라 `isBasicDownloading ↔ isInspectionDownloading` computed 로 UI 레벨 상호 배타 잠금 — 네이티브 락 없이 SQLITE_BUSY 원천 차단
검색조건 자동 영속화 — 컨벤션 기반 프레임워크 레벨 자동 적용
- 43개 메뉴 중 39개(91%) 자동 적용 — `document` capture 단계 click 리스너 + `e.target.closest('.searchBtn')` + `contentPanel.getComponentInstance(tabId).vm.searchConditions` 딥 클론 + `setTimeout 50ms` 비블로킹 저장
- 백엔드 — `MenuController.updateUserOpenMenuProps.do` + `USER_MENU_INFO.MENU_PROPS` JSON 컬럼, 탭 복원 시 setup() 후 `Object.assign(vm.searchConditions, saved)` 로 Vue reactive 자동 갱신
- 개별 메뉴 JS 파일 수정 0건 — 단일 핸들러 + `.searchBtn` 컨벤션만 지키면 자동 적용
세션 통합 관리 + GPS Pub/Sub 인프라
- VPN(~3시간) + Web 세션(180분) 통합 `SessionManager` — 단일 카운트다운, API 호출 성공 시에만 자동 reset (DOM 이벤트 reset 정책 폐기), 낙관적 업데이트 + 실패 시 롤백, `NetworkCallback` 토스트 알림, 오프라인 환경(localhost:8080 + `conn.getConnectionStatus`) 자동 감지로 무동작
- 플로팅 세션 타이머 4상태 머신 (normal/warning/critical/extended) + 드래그 + localStorage 위치 저장 + `font-variant-numeric: tabular-nums`
- `GpsTrackerService` 싱글톤 Pub/Sub — 여러 탭/팝업이 구독해도 네이티브 GPS 리스너 1개만 유지, 100 ms 디바운스 리컨실리에이션 + `desiredState ↔ nativeState` 분리 + `onPause/onResume` 양방향 브로드캐스트
- `INativeAdapter` / `AndroidAdapter` / `DevAdapter` / `MockAdapter` 어댑터 패턴, Vworld 지오코딩 positive + negative caching 으로 API 호출 ~100배 절감
정적 리소스 차등 캐시 + 서버사이드 PDF Flatten
- Servlet Filter 차등 캐시 — `/js/vendor/**` 7일·`/js/app/**` `no-cache`(304 검증), Gzip(min-response-size 2048, ~75% 감소), HTTP/2(h2c), preload 4개 핵심, `<script defer>` (nfilter 1.1 MB + driver.js)
- 초기 로드 109 요청 9.9 MB ~15s → 2.5 MB ~5–8s 경량화, 재로그인 캐시 활용 시 500 KB
- 클라이언트 pdf-lib flatten (brittle Paper.js JSON 의존 + WebView OOM 부담) 을 서버 PDFBox `PdfMarkupFlattenService` 로 이관 — 회전 페이지(90/180/270) `Matrix` 행렬 정합, CJK fallback `FontMappers` 전역 등록
- 외부 PDF Gateway (`PdfGatewayRestfullApiUtil.jobConv`) 를 `ensureAttachmentConverted.do` 단일 엔드포인트로 통합 — Lazy On-Demand 변환 + DB 영속 캐시 + 행 lock 동시성 가드 + 30초 timeout 폴링
러닝 포인트
- 폐쇄망 IIFE 모듈 시스템 = Micro Frontend 원리
- P-Edit-DataTable — 팀 전체 생산성을 끌어올린 컴포넌트 설계
- OOM 진단 회고 — 증상과 원인을 혼동하면 엉뚱한 처방을 오래 한다
- 프레임워크 레벨 자동화 — 개별 메뉴 수정 0건으로 39개에 적용
기여 포인트
프론트엔드 아키텍처 전체를 단독 설계하고, 4명 주니어 개발자가 일관된 방식으로 개발할 수 있는 환경을 구축. ESLint/Prettier 기반 코드 컨벤션 정립, 개발 가이드 문서 작성으로 신규 개발자 온보딩 1일 이내 달성. 고객 요구 이전에 Tab Edit Mode·드래그 삭제 등 차별화 UX를 자발적으로 제안·구현하여 시스템 정체성 확립.
갤러리 보기 (19장)
대시보드 (라이트)
오늘의 목표 · WTD · 공지사항 · 즐겨찾기
대시보드 (즐겨찾기)
드래그 앤 드롭으로 즐겨찾기 순서 변경
대시보드 (다크)
디자인 토큰 기반 1줄 코드 테마 전환
P-Edit-DataTable
행 상태(saved/added/modified/deleted) 시각 피드백
편집 그리드 (상태)
셀 단위 Dirty Tracking + 변경 하이라이트
편집 그리드 (변경내역)
수정 행 클릭 시 변경 전→후 팝오버
편집 그리드 (필수값)
누락 셀 자동 포커스 + Popover 안내
편집 그리드 (중복검증)
uniqueFields 선언적 중복값 체크
데이터 목록
행 확장으로 상세 정보 인라인 표시
입력 폼
PrimeVue 컴포넌트 기반 검사 데이터 입력
팝업 (검사원 배정)
PopupService 기반 독립 Vue 앱 인스턴스
팝업 (결재 상신)
드래그로 결재 행 순서를 변경하는 상신 팝업
단일 탭 제스처
롱프레스 드래그 스위칭 · Trash Zone 드래그 삭제
코치마크 온보딩
driver.js 2단계 투어 — 편집모드 진입 시 자동 표시
편집모드 조작
⊖ 삭제 마킹 · 롱프레스 순서 변경 · ConfirmPopup 일괄 저장
위성망 이용 관리 시스템 — Interactive 분배도표 차트
- 발주처
- 한국방송통신전파진흥원(KCA)
- 기간
- 2024.12 ~ 2025.03
- 역할
- Interactive 분배도표 차트 설계 및 단독 개발
위성 주파수 이용현황을 시각화한 Interactive 분배도표 차트를 직접 설계 및 단독 개발. 분배↔주파수↔용도↔이용 4행이 주파수 축으로 정렬·연결되는 복잡한 레이아웃 특성상 범용 차트 라이브러리(D3, Chart.js 등)로는 구현이 불가능하여, 차트 라이브러리 없이 순수 React + Emotion으로 자체 구현. 대외용/내부용으로 구분된 6개 밴드(L, S, C, X, Ku-V)별 데이터를 주파수 값 기반으로 위치·너비를 동적 계산하여 렌더링하는 데이터 시각화 프로젝트.
합성 컴포넌트 패턴으로 선언적 차트 구조 설계
- Band > Band.Header / Band.Body / Band.Arrow 계층 구조로 컴포넌트 간 결합도 최소화
- Band.Body 내부에 BunBae·JuPaSu·YongDo·EYong 4행을 선언적으로 배치하여 협업 효율과 인수인계 용이성 확보
서버-클라이언트 상태 이원화 — useReducer 상태 머신
- React-Query(staleTime: Infinity)로 서버 상태를 캐싱
- Context API + useReducer로 클라이언트 상태(배율 0.3~1.75x, 실제 스케일 토글, 호버 하이라이팅)를 4가지 액션 디스패치 기반 상태 머신으로 관리
- MyBatis 계층적 ResultMap(ReleaseSectionDTO → BandDTO → BandDetailDTO 3단계 중첩 collection)으로 단일 API 호출에 전체 트리 데이터 반환
주파수 좌표 계산 엔진 독자 설계
- 주파수 범위를 픽셀 너비로 변환하는 좌표 매핑 엔진 구현
- 밴드별 가상 전체 너비(VIRTUAL_TOTAL_WIDTH)와 확대 계수(MAGNIFICATION_FACTOR) 상수 맵 6종으로 실제/기본 스케일 이중 모드 정밀 제어
- 제너레이터 함수(mergeSortedArraysLazy)로 정렬된 배열 병합, 이벤트 기반 구간 분할 알고리즘으로 분배→주파수 구간 자동 매핑
- 레이블 겹침 감지 + 적응형 폰트 사이즈 자동 축소
React Portal + Framer Motion
- Toolbar를 Portal로 분리하여 차트 스케일 변경에 영향받지 않는 독립 렌더링 확보
- Framer Motion 스프링 물리(stiffness:300, damping:30)로 실제 스케일 토글 애니메이션 구현
- Tippy.js Portal로 Tooltip 위치 정밀 제어
Contextual UI + 스크롤 음영 + 호버 하이라이팅
- 마우스 오버 시에만 액션 버튼을 표시하는 사용자 행동 기반 UI로 화면 복잡도 감소
- 가로 스크롤 밴드에 ScrollShadow를 적용하여 좌/우 끝 도달 여부를 그라데이션 음영으로 시각 힌트 제공
- 이용(EYong) 요소 호버 시 Context 전파로 차트 전체에 걸쳐 연관 요소 하이라이팅
러닝 포인트
- CSS-in-JS 기술 선택 — Emotion vs Vanilla Extract
- 커스텀 차트 엔진 vs 라이브러리
갤러리 보기 (2장)
Interactive 분배도표
대외용/내부용 주파수 대역별 분배·용도·이용 현황 시각화
Contextual Toolbar
확대/축소 버튼 + 실제 스케일 토글 (마우스 오버 시 노출)
스마트공장 PMS 구축 및 유지운영
- 발주처
- 중소벤처기업부 / 스마트제조혁신추진단
- 기간
- 2023.03 ~ 2024.11
- 역할
- 협약 영역 기능 개발 · 공통 컴포넌트 자체 발굴·단독 개발 · 상태 관리 설계 · 유지보수
25명 규모 개발팀(사전/협약/평가/공통 4개 파트) 내 협약 파트 담당. 촉박한 일정 속에서 각자 화면 개발에 집중하느라 상태 관리 체계가 부재하고 코드 스타일이 중구난방이던 상황에서, React 상태 관리의 중요성을 인식하고 Context API 기반 전역 상태 관리 체계를 자체 설계. 업무(협약) 팀 소속이면서도 팀 전체에 필요한 공통 컴포넌트를 자체 발굴·단독 개발하여 코드 리뷰·사용법 안내로 팀 코드 일관성과 생산성에 기여.
Context API + useReducer 기반 전역 상태 관리 체계 자체 설계
- 이미 개발이 진행 중이라 Redux 등 라이브러리 도입이 불가능한 상황에서, Context API + useReducer로 체계적 상태 관리 적용
- 도메인별로 4개 독립 Context를 분리 설계하고, State/Dispatch 분리 커스텀 훅으로 Props Drilling 해소
공통 컴포넌트 4종 자체 발굴·단독 개발 → 코드 리뷰·팀 전파
- 공통팀이 아닌 업무(협약) 파트 소속이면서, 팀 전체에 반복되는 UI 패턴(목록·검색·팝업·탭 등)을 직접 식별하여 재사용 가능한 공통 컴포넌트로 설계·개발
- 선언적 설정만으로 화면을 구성할 수 있도록 만들어, 새로운 화면 개발 시 빠르게 적용 가능한 온보딩 환경 조성
- 코드 리뷰와 사용법 안내를 통해 팀 내 코드 일관성 확보
협약변경 — 변경 시각화 UX 독자 설계
- 변경된 셀에 연노랑 배경 강조 + 입력 포커스 시 원본값 팝오버를 띄워 공간 효율적 전후 비교
- ChangePopover·ChangeCheckText 컴포넌트로 읽기/입력 모드 모두 변경 여부 즉시 파악
- 공급기업 대표기관 추가/삭제 시 자동 선택 + 왕관 아이콘(파란색=변경후, 회색=변경전) 시각화
- 사업비 S1↔S2 연차별·항목별 합계 자동 검증
Controller → Service → Mapper(MyBatis) → SQL 쿼리까지 전 계층 직접 개발
개발 완성도에 대한 개인적 목표 달성을 위해 유지보수 프로젝트에 자발적 참여. SR 게시판 답변 작성 + 고객 전화 응대 약 30,000건 처리
러닝 포인트
- 개발 도중 상태 관리 도입 — 실용적 아키텍처 결정
갤러리 보기 (3장)
협약변경 검색 · 목록
공통 List 컴포넌트 — 검색조건 + 테이블 + 페이지네이션 자동 구성
변경 정보 상세
연노랑 배경 강조 + 왕관 아이콘 대표기관 시각화
추가 · 삭제 · 수정 확인
파란(추가)/빨간(삭제)/노란(수정) 행 색상 구분 + 사업비 테이블
온라인 검사서류 신청·접수 시스템 시범 구축
- 발주처
- 한국가스안전공사(KGS)
- 기간
- 2022.09 ~ 2023.02
- 역할
- 신규 기능 추가 개발 · 모바일 화면 구현
레거시(Spring, JSP) 관공서 내부망 시스템에 모바일 환경 이수증 발급 기능 신규 개발
OZ(문서 생성) → MarkAny(보안 적용) → ePapyrus(뷰어) 3개 솔루션 순차 파이프라인 구성
갤러리 보기 (2장)
본인 인증 시스템
KGS 사이버지사 모바일 로그인 + 본인 인증
교육이수 이력 조회
가스 안전 교육 이수 과정 조회 + PDF 이수증 발급
AI 신약개발 플랫폼 구축
- 발주처
- 한국화학연구원(KRICT)
- 기간
- 2022.03 ~ 2022.06
- 역할
- 플랫폼 전체 구조 설계 및 개발 주도
Django + Flask 이중 구조 플랫폼 설계
- Django(메인 웹 + 사용자 관리)와 Flask(분석 모듈 API)를 분리한 이중 구조 설계
- SMILES 구조 입력 → 15개 이상의 AI 분석 모듈 실행 → 결과 시각화 + PDF/CSV 다운로드까지 전체 파이프라인을 단독 구현
Python multiprocessing 기반 병렬 분석
- 기존 단일 모듈 순차 실행 구조를 Pool 기반 병렬 처리로 전환
- 12개 모듈 동시 실행 시에도 모듈별 독립 프로세스로 안정적 처리, 분석 시간 대폭 단축 및 모듈 추가 시 확장성 확보
실시간 Job 모니터링 UX
- Axios polling 방식으로 모듈별 진행 상태(대기/실행중/완료)를 실시간 시각화
- SMILES 분자 구조 이미지와 함께 Job Status를 한 눈에 확인 가능, 일시정지(Pause)/재개 기능으로 사용자 제어권 확보
Crontab 배치 자동화 + SMILES Editor 통합
- "Waiting" 상태의 Job을 주기적으로 자동 실행하는 배치 스케줄러 구성
- 분자 구조 편집기(SMILES Editor)를 작업 등록 화면에 통합하여, 시각적으로 분자를 그리고 SMILES 코드로 변환하는 직관적 입력 UX 제공
갤러리 보기 (7장)
메인 랜딩 페이지
Cardiotoxicity, BBB Permeability 등 분석 모듈 소개
Module List
15개 AI 분석 모듈 관리 (API name, Level, 등록일)
Register Job
SMILES Editor로 분자 구조 시각적 편집 + SMILES 코드 목록 등록
Job List
SMILES 입력값, 선택 모듈, 상태(PAUSE/COMPLETE), 재생/삭제 액션
Job Detail
분자 구조 시각화 + 12개 모듈별 실시간 진행 상태 모니터링
Result Detail
모듈별 예측 결과 + SMILES 물성 정보 + PDF/CSV 다운로드
결과 내보내기
PDF 리포트(분자 구조 + 분석 결과) 및 CSV 스프레드시트 다운로드
LIME-DQM AI 학습데이터 품질 검증 플랫폼
- 발주처
- 자사 솔루션
- 기간
- 2021.03 ~ 2021.11
- 역할
- 플랫폼 전체 구조 설계 및 개발 주도
NIA AI학습용 데이터 구축사업에서 PMO 조직이 활용하는 AI 학습데이터 품질 자동 검증 플랫폼. 텍스트·이미지·영상·음성 등 정형/비정형 데이터를 100여 개의 품질측정 모듈로 자동 검수하고, 데이터 프로파일링·육안검수·통계 대시보드·결과 보고서까지 품질 진단 전 과정을 단일 플랫폼에서 처리.
6단계 품질 진단 워크플로우 전체 설계·구현 (프론트엔드 + 백엔드)
- 품질지표 정의 → 데이터 프로파일링 → 데이터 적재 → 품질 검수 → 결과 보고서까지, 새로고침 없는 단일 화면 비동기 UX 구현
- 백엔드에서는 6단계 x 7상태 x 2역할(Auditor/Collector) 검토·승인 워크플로우를 2계층 상태 모델로 설계하여 다중 검토자 병렬 승인 지원
대용량 비정형 데이터 적재·분석 알고리즘 직접 고안
- 무한 깊이 JSON 축약·재귀 탐색 알고리즘 설계
- JSON/CSV/XML/Excel 4개 포맷 자동 감지·변환 파이프라인 구축
- 청크 단위 병행 처리를 결합하여 적재·분석 시간을 1/6 ~ 1/10으로 단축, 컬럼별 자동 프로파일링 산출
사내 최초 Elasticsearch 도입 주도
- 용도별 인덱스 분리 설계(원본 데이터/검수 결과/배치 분석)
- search_after 딥 페이징, ES CRUD 전 과정 구현으로 데이터 조회 속도 10배 이상 개선
- django-crontab 기반 배치 분석 자동화에서도 ES 파이프라인 활용
대용량 미디어 파일 육안 검수 도구 설계
- ES 연계 아이디어를 직접 건의하여 채택 — Zip 내부 미디어 메타데이터를 ES에 인덱싱하여 빠른 조회·추출
- Zip 대량 추출에서 3가지 방식(병렬처리/일괄추출/멀티프로세싱)을 시도·비교하여 최적 방식 확정
- 검수 진행률을 ES aggregation으로 실시간 집계
JS·Django 대량 중복 코드 리팩토링 건의·실행
- 팀장에게 직접 건의하여 양 레이어의 중복 코드를 체계적으로 모듈화
- JS에서는 중첩 모달 z-index 충돌 문제를 스택 카운터 기반 공식으로 해결, 검수 결과를 A4 규격 인쇄 최적화 보고서로 동적 생성
갤러리 보기 (3장)
데이터 적재 · 구조 분석
JSON key별 Level·타입·매핑 자동 추출 + 프로파일링 항목 선택
품질지표 기반 검수 계획
검증 계획서 버전 관리 + 데이터셋별 지표 항목·검수모듈 매핑 테이블
검수 결과 보고서 출력
A4 규격 인쇄 최적화 보고서 동적 생성 + Prev/Next 페이지 네비게이션
LabelOn 내부 어드민 페이지 구축
- 발주처
- 자사 솔루션
- 기간
- 2020.09 ~ 2021.02
- 역할
- 백오피스 개발
자사 AI 학습데이터 구축 플랫폼 LabelOn의 내부 관리 시스템. 클라우드워커·리뷰어의 라벨링 작업부터 프로젝트·데이터셋·회원·정산까지, 수십만 건의 운영 데이터를 관리하는 백오피스 개발.
입사 첫 프로젝트 — 사수의 가이드 아래 7개 관리 모듈 개발
- UI 설계부터 백엔드 API까지 대부분의 개발을 담당하며 6개월 내 완성
- 회원·프로젝트·데이터셋·어노테이터·리뷰어 작업 관리 등 핵심 CRUD 모듈 구현
신입 개발자로서 자발적으로 UX 개선 — 새로고침 없는 화면 전환 구현
- SSR 환경에서 페이지 전환마다 새로고침이 발생하는 것에 의문을 품고, AJAX 개념을 스스로 학습하여 Django SSR 부분 갱신 패턴을 적용
- 요구사항에 없었지만, 수십만 건 테이블의 검색·페이징·필터링을 새로고침 없이 처리하는 UX를 스스로 제안하고 구현
DB 기반 동적 메뉴 + 역할별 접근 제어
- Menu·MenuPermission 모델로 메뉴 구조를 DB에서 관리하고, 관리자 역할(Role)에 따라 접근 가능한 메뉴를 동적 생성
- OTP 2차 인증·SMS 발송·주소 검색 API 등 보안·부가 기능 구현
갤러리 보기 (3장)
OTP 로그인
이메일 + 비밀번호 + OTP 2차 인증(SMS 발송) 보안 로그인
DB 기반 동적 메뉴
Menu·MenuPermission 모델 기반 역할별 접근 제어 + 다단계 메뉴 구조
목록 필터링 · 엑셀 내보내기
필터링 설정/해제/재적용 상태 관리 + 엑셀 다운로드 툴바
모두텍
2019.08 ~ 2019.12
웹 개발
연구 지원 시스템 웹 개발
- 발주처
- 한국전자통신연구원(ETRI)
- 기간
- 2019.08 ~ 2019.12
- 역할
- 웹 프론트엔드 개발 전담
첫 실무 프로젝트 — Node.js(Express) + EJS 기반 웹 프론트엔드 개발 전담
연구원(Python) RESTful API 연동, Swagger UI 활용 API 검증 및 테스트
Slack 기반 연구원과의 커뮤니케이션 주도, 주 1회 연구소 방문 회의 참석
Strengths
제약을 설계 기회로 전환하는 아키텍처 엔지니어
폐쇄망에서 500+ 업무 화면을 운영하는 태블릿 시스템의 프론트엔드 아키텍처를 설계했습니다. npm/번들러 없이 과 로 화면별 JS를 동적 로드하는 를 구현하여, 초기 로딩 시간을 약 50% 단축했습니다.
이 아키텍처를 Android 오프라인 앱으로 확장하여, 내장 위에서 동일한 웹 프론트엔드를 구동하고 의 Oracle→SQLite 자동 변환 레이어를 설계했습니다. Gzip·지연 로딩·Defer 전략을 조합하여 앱 초기 로드 전송량을 약 75% 경량화하고, WebView↔Native 브릿지 비동기화로 UI 응답성을 확보했습니다. 하나의 아키텍처가 웹과 앱 두 플랫폼을 관통하는 재사용 가능한 설계 자산으로 확장된 사례입니다.
PDF 마크업 뷰어 모듈에서는 한 단계 더 나아가, 에 동시 임베드되는 구조를 설계했습니다. 뷰어 내부에 호스트 분기 코드를 두지 않고, (setVisibility 패치·registerConfirmHandler·setSideToolbarPosition·setSaveIntent 등)로 호스트가 자신의 컨텍스트(태블릿 가로·데스크탑·모바일 web)에 맞춰 뷰어를 패치하도록 외부화. 임베드 가능한 모듈은 호스트의 종류를 몰라야 한다는 원칙을 분기 코드 0으로 구현했습니다.
으로 새 메뉴 추가 시 프론트엔드 코드 수정 제로를 달성하여, 제약 환경에서도 확장성을 확보하는 아키텍처를 설계합니다.
팀 전체의 개발 속도를 구조로 끌어올리는 엔지니어
500+ 업무 화면을 4명의 주니어 개발자가 일관되게 개발할 수 있는 구조를 설계했습니다. Vue UI 프레임워크(PrimeVue)를 프로젝트에 맞게 래핑한 디자인 시스템 PrimeBridge를 으로 설계하여, 팀 전체가 동일한 컴포넌트·스타일·동작 규칙 위에서 개발하는 환경을 만들었습니다.
핵심인 은 행 단위 ·필수값 검증·저장 페이로드 자동 분류를 내장하여, CRUD 개발 시 중복 코드를 약 80% 감소시키고 주니어 개발자 온보딩 1일 이내를 달성했습니다.
탭 관리 시스템도 ·검색조건 자동 복원·동시성 가드를 내장한 로 설계하여, 개별 기능보다 팀 전체 생산성을 높이는 구조에 집중합니다.
프론트엔드에서 DB까지, 전 계층을 설계하는 엔지니어
프론트엔드 전문이지만, 필요한 경우 을 직접 설계하고 구현합니다. 스마트공장 PMS에서는 Spring Boot + MyBatis 백엔드를, AI 신약개발 플랫폼에서는 와 Python multiprocessing 병렬 처리 파이프라인을 설계했습니다.
프론트엔드가 한 번의 API 호출로 필요한 데이터를 모두 받을 수 있도록, 를 구조적으로 방지합니다. MyBatis 으로 하나의 SQL에서 부모→자식→손자 관계의 데이터를 트리 구조로 자동 조립하여 반환하고, LIME-DQM에서는 Elasticsearch 인덱스 분리와 으로 100만 건 이상의 품질 데이터를 수 초 내로 조회합니다.
Oracle·MySQL·SQLite·Elasticsearch 등 실무 경험을 바탕으로, 프론트엔드가 소비하기 최적인 데이터 구조를 API 설계 단계에서부터 고려합니다.
AI 에이전트를 설계·운용하는 개발 인프라 엔지니어
Claude Code를 개인 코드 생성 도구가 아닌 팀 개발 인프라로 운용합니다. 기반 프로젝트 컨텍스트 설계, (DB 스키마 조회·SVN 커밋 자동화 등)으로 에이전트 작업 범위 확장, 커스텀 스킬 등록으로 반복 워크플로우 자동화 — 이 세 가지를 조합하여 AI가 프로젝트 맥락 위에서 동작하는 환경을 구축합니다.
스마트온 오프라인 프로젝트에서 아키텍처·포팅 가이드·코딩 컨벤션 등 를 체계적으로 구축하여 팀원 3명 전원이 Claude Code로 일관된 컨텍스트 위에서 개발. Oracle→SQLite 쿼리 포팅·스키마 변환 등 을 AI로 자동화하고, 엔드포인트의 보일러플레이트를 Gradle 플러그인 + AI로 생성했습니다.
업무 성격에 따라 AI 도구를 선별합니다: 코드 생성·리팩토링은 Claude Code, 기술 문서 분석·인수인계는 NotebookLM, 도메인 Q&A는 Google Gems — 하여 개발 외 영역까지 AI 활용을 체계화합니다.
요구사항 너머의 UX를 설계하는 엔지니어
SI 환경에서 주어진 요구사항만 구현하지 않습니다. 스마트온 2.0에서 탭의 오터치·되돌리기 불가 문제를 고객 요구 이전에 식별하고, 를 자발적으로 제안·구현했습니다. 롱프레스 시간 분기(빠른 탭→전환, 롱프레스+드래그→정렬, 롱프레스+릴리스→편집모드)를 으로 정밀 설계했습니다.
입사 첫 프로젝트(LabelOn)부터 SSR 환경의 새로고침 문제에 의문을 품고 을 스스로 학습·적용했고, 스마트공장 PMS에서는 협약 변경 시 를 띄우는 공간 효율적 전후 비교 UX를 독자 설계했습니다.
스마트온 오프라인 앱에서는 현장 작업자가 시스템 상태를 즉각 인지할 수 있는 다층 시각 피드백과, 세션 만료를 단계적으로 경고하는 상태 머신 기반 플로팅 타이머를 요구사항 없이 자발적으로 설계했습니다.
PDF 마크업 뷰어에서는 1인 솔로 개발의 장점을 살려 UX 디테일에 후반부 시간의 절반을 투자했습니다. 도구를 선택하면 colored 탭이 슬라이드 다운으로 나타나고, 그 탭을 누르면 되는 시그니처 모션을 cubic-bezier(.3, 1.4, .5, 1) 380ms 탄성 over-shoot 로 설계. 으로 통일하여 모듈 전체의 시각 일관성을 확보했고, 으로 탭 배경색의 명도에 따라 두께 숫자의 흑/백 텍스트를 자동 분기 — 사용자가 어떤 색을 골라도 가독성이 깨지지 않도록 했습니다.
동료들이 '솔루션을 개발해야 한다'고 평가할 만큼, 사용자 인지 부하를 줄이는 데 집착하며 요구사항 이면의 실제 문제를 찾아 해결합니다.
Education
충남대학교
대전2012.03 ~ 2018.08
컴퓨터공학과 · 공학계열 · 학사
졸업중일고등학교
대전2009.03 ~ 2012.02
졸업Training
2026.03
- 전략적 프롬프트 설계: 를 통해 직무별 맞춤형 답변의 정확도와 일관성 향상
- 업무 자동화 체계 구축: 를 활용한 반복적 기획안 초안 작성 및 기반의 기술 문서 분석 프로세스 단축
- Vibe Coding 실무 적용: 생성형 AI와의 협업을 통해 가속화
- AI 신뢰성 검증: 식별을 위한 출처 기반 팩트 체크 및 보안 가이드라인을 준수하는 책임감 있는 AI 활용 원칙 적용
SW개발 심화과정(합숙 AWS 교육)
영우디지털2019.10 ~ 2019.10
- 영우디지털 본사 내에서 아마존 웹 서비스의 핵심 기능 이론 학습 및 실습.
- 교육 내용: 기본 개념, EC2, S3, RDS 등.
SW개발 심화과정(합숙 JAVA 교육)
제주창조경제혁신센터 · Oracle · 영우디지털2019.07.15 ~ 2019.08.10
- 제주도 라마다 호텔에서 한 달간 합숙하며 총 4주(140시간 이상) Java 심화 교육 수료. (본인 포함 25명)
- 1주차: Java SE 8 Programming, 자료구조 & 알고리즘
- 2주차: 네트워크 응용 프로그램, OOP 최신 트렌드와 Framework 이해
- 3주차: SQL 실무, JDBC 실무, JSP Programming
- 4주차: JSP & JDBC 응용 마이크로 프로젝트, Web 표준기술 이해, 해커톤 프로젝트 진행 및 결과 발표
- 교육생들끼리 팀을 구성하여 해커톤 대회 참가(제주도 여행객 대상 '대신 기다려주기' 웹 서비스 구현)
