본문으로 바로가기Skip to main content
najeong.me

사람을 이해하고, 함께 더 나은 경험을 만들어가는 Frontend EngineerA Frontend Engineer who understands people and builds better experiences together

사용자가 겪는 불편을 세심하게 살피고, 동료들과 해결 방법을 함께 고민합니다. 인터랙션과 성능을 개선하고 반복되는 일을 자동화하며, 제품을 사용하는 사람과 만드는 사람 모두에게 더 나은 경험을 만들고 있습니다.I pay close attention to the friction users experience and work with teammates to find thoughtful solutions. By improving interactions and performance and automating repetitive work, I create better experiences for both the people who use products and the people who build them.

User Experience · Interaction Engineering · Learning & Sharing

소개About

사용자 경험과 팀의 협업 경험을 함께 개선합니다I improve both the user experience and the way teams collaborate

인터랙티브 UI와 공통 컴포넌트를 개발하며 자연스러운 사용 경험을 만드는 데 집중합니다. 사용자 행동 및 오류 데이터를 분석하고 다양한 직군과 개선 방향을 논의합니다.I build interactive UI and shared components with a focus on natural, intuitive experiences. I analyze behavioral and production data, then work across disciplines to decide what to improve.

반복되는 문제는 AI와 자동화로 해결합니다I turn recurring problems into systems with AI and automation

반복되는 정책 질의와 오류 대응을 시스템으로 해결하기 위해 RYACO와 AI 코드 수정 에이전트를 개발했습니다. AI Talk를 운영해 개발 경험을 조직의 AI 활용 문화로 확산했습니다.I built RYACO and an AI code-fixing agent to systematize recurring policy questions and incident response. I also ran AI Talks to help turn individual experiments into a broader culture of practical AI use.

배우고 공유하며 기술과 사람을 연결합니다I connect technology and people through learning and sharing

페어 프로그래밍·스터디·문서화와 기술 발표를 통해 문제 해결 과정을 동료와 나눕니다. 다양한 직군의 관점을 기술과 제품에 연결하며 함께 해결책을 만듭니다.I share problem-solving processes through pair programming, study groups, documentation, and technical talks. By connecting perspectives across roles to the product and its technology, I help teams shape solutions together.

Frontend Architecture
React · Next.js · TypeScript · Zustand · TanStack Query
Interaction Engineering
Motion · Rive · Storybook
Runtime Performance
React Profiler · Virtualization · Lighthouse/CDP
Production Reliability
Sentry · Cypress · Vitest/Jest
AI Tooling & Automation
RAG · FastAPI · Azure OpenAI · Kubernetes
02  PRODUCTS

Real Academy

생성형 AI 기반 1:1 대화 기술로 대치동 수준의 초등 영어 영작·말하기 교육을 집에서 구현한 에듀테크 홈스쿨링 서비스입니다.An edtech homeschooling service that brings high-quality English writing and speaking education for elementary students into the home through generative AI-powered one-on-one conversations.

Company
Socra AI (전 Riiid)Socra AI (formerly Riiid)
Role
Frontend Engineer
Period
2023.07 — 재직 중Jul 2023 — Present
WHAT I BUILT
  • 01라이브 수업 — 학생이 강사와 실시간 영어 수업을 듣고 복습하는 전 과정을 구현·운영했습니다. 9개 학기의 목록·상세·VOD·노트·시간표·알림을 담당하고 학기 설정 리드타임을 71% 단축했습니다.Live Classes — Built and operated the complete journey from joining live English lessons with an instructor to reviewing them afterward. Owned the class list, detail pages, VOD, notes, schedules, and notifications across nine terms, reducing term setup lead time by 71%.
  • 02영상관 — 기존 스쿨라이브의 영상 학습 서비스를 Real Academy로 이관해 한 달 만에 출시했습니다. 3단계 학습 흐름을 옮기고 긴 자막 목록을 가상화해 DOM·마크다운 렌더를 99.4% 줄였습니다.Video Library — Migrated the existing School Live video-learning service to Real Academy and launched it within one month. Rebuilt its three-step learning flow and virtualized long transcript lists, reducing DOM and Markdown rendering by 99.4%.
  • 03다이어리 · 리얼챌린지 — 학생이 영어로 일상을 기록하고 꾸준한 학습에 참여하도록 돕는 기능입니다. 기획부터 출시·운영까지 참여하고 행동 지표를 바탕으로 개선을 반복했습니다.Diary & Real Challenge — Features that help students describe their daily lives in English and keep learning consistently. Contributed from planning through launch and operation, iterating on the experience using behavioral metrics.
  • 04프로덕션 안정화 · 사내 AI 도구 — 학습을 진행할 수 없게 만들던 반복 문제를 해결해, 79건이었던 발생 건수를 0건으로 줄였습니다. 동료의 반복 업무를 줄이는 RAG 챗봇과 사람 승인 기반 Sentry 자동 수정 에이전트도 구축했습니다.Production Reliability & Internal AI Tools — Eliminated a recurring issue that blocked learning, reducing occurrences from 79 to zero. Also built a RAG chatbot and a human-approved Sentry auto-fix agent to reduce repetitive work for teammates.

GOPAX

대한민국에서 원화로 거래할 수 있는 5대 암호화폐 거래소 중 하나입니다.One of South Korea's five major cryptocurrency exchanges supporting Korean won trading.

Company
스트리미 (Streami)Streami
Role
Frontend Engineer
Period
2022.03 — 2023.03Mar 2022 — Mar 2023
WHAT I BUILT
  • 01레거시 마이그레이션 — 운영 중인 거래소를 중단하지 않고 11개월간 Node 8→16, JavaScript→TypeScript, 클래스→함수 컴포넌트, Redux→Zustand로 프론트엔드 환경을 점진적으로 전환했습니다.Legacy Migration — Modernized the frontend over 11 months without interrupting the live exchange: Node 8→16, JavaScript→TypeScript, class→function components, and Redux→Zustand.
  • 02USDC 마켓 오픈 — 사용자가 USDC 기반으로 가상자산을 거래할 수 있는 신규 마켓 출시에 대응했습니다. 마켓별 조건문 하드코딩을 환경 변수 기반 설정 구조로 전환했습니다.USDC Market Launch — Supported the launch of a new market where users could trade digital assets against USDC. Replaced hard-coded market conditionals with an environment-based configuration structure.
  • 03API 테스트 어드민 — 개발자·PM·QA가 거래소 API의 요청과 응답을 직접 확인할 수 있는 사내 도구입니다. 타입 시각화와 탐색 구조를 설계·개발했습니다.API Testing Admin — Designed and built an internal tool that lets developers, PMs, and QA inspect exchange API requests and responses directly, including type visualization and navigation.
  • 04OCR·주문창 UX — 신분증을 촬영하는 본인 인증 과정에 반응형 가이드를 구현하고, Web·iOS·Android 주문창의 UI를 통합해 플랫폼 간 사용 경험을 맞췄습니다.OCR & Order Form UX — Built responsive guidance for ID capture during identity verification and unified the Web, iOS, and Android order-form UI for a consistent cross-platform experience.
03  CASE STUDIES
CASE 01

Behavior-Driven UX Improvement

Hotjar · Sentry · React · TypeScript

What I owned
행동 분석 → UI 개선 → 배포 후 검증Behavior analysis → UI improvement → post-release validation
Period
2025.06 — 2025.10Jun 2025 — Oct 2025
AT A GLANCE행동에서 확인한 변화Changes verified through behavior
161/day
비활성 영역 터치Taps on an inactive area
실제 버튼으로 전환Turned into a real button
8% → 0%
활성 사용자 크래시율Active-user crash rate
무한 루프 hot-fixInfinite-loop hotfix
46%
음성 일기 연속 작성률Consecutive Voice Diary entries
3주 평균Three-week average
01 CONTEXT & PROBLEM

초등학생 사용자는 불편을 정확한 언어로 설명하기 어렵습니다. 팀의 의견만으로 우선순위를 정하지 않고, 오인 터치·이탈·크래시처럼 화면에 남은 행동으로 문제를 확인해야 했습니다.Elementary students often cannot explain friction precisely. Rather than prioritizing from team opinion alone, I used observable signals—mis-taps, drop-offs, and crashes—to identify problems.

02 APPROACH

Heatmap으로 사용자가 버튼으로 인식한 영역을, 사용 지표와 퍼널로 이탈 구간을, Sentry Session Replay로 크래시 직전의 동작을 확인했습니다. 데이터 확인부터 문제 정의·UI 개선·배포 후 검증까지 담당했습니다.Heatmaps revealed what users perceived as clickable, metrics and funnels showed where they dropped off, and Sentry Session Replay exposed actions before a crash. I owned the process from analysis and problem framing through UI changes and post-release validation.

03 IMPLEMENTATION

비활성 영역에 몰린 일평균 161회 터치를 발견해 실제 버튼과 시각 피드백을 추가했습니다. 활성 사용자 8%의 크래시는 Session Replay로 무한 루프를 찾아 hot-fix했고, 음성 일기는 이탈 퍼널을 바탕으로 튜토리얼을 개선했습니다.I turned an inactive area receiving 161 daily taps into a real button with visual feedback. Session Replay traced an 8% active-user crash rate to an infinite loop, which I hot-fixed. For Voice Diary, I improved the tutorial based on its drop-off funnel.

04 RESULT
  • —비활성 영역 일평균 161회 터치 → 버튼화로 오인 터치 해소161 daily taps on an inactive area → resolved through a real button
  • —활성 사용자 크래시율 8% → 0%Active-user crash rate: 8% → 0%
  • —음성 일기 연속 작성률 3주 평균 46%Three-week average for consecutive Voice Diary entries: 46%
CASE 02

Interactive Learning Experience

Motion · Rive · React · TypeScript

What I owned
인터랙션 설계 → 컴포넌트 구현 → 문서화·회귀 검증Interaction design → component implementation → documentation and regression testing
Period
2024.07 — 2024.10Jul 2024 — Oct 2024
AT A GLANCE인터랙션 설계Interaction system
01
레이아웃 변화Layout changes
Motion · layout(FLIP)Motion · layout (FLIP)
02
아바타 상태Avatar states
Rive State MachineRive State Machine
03
공통 피드백Shared feedback
Storybook · CypressStorybook · Cypress
01 CONTEXT & PROBLEM

초등학생이 매일 쓰는 학습 앱에서 어색한 전환과 끊기는 모션은 몰입을 방해합니다. 성능 부담 없이 화면을 전환하고, 아바타 상태가 바뀌어도 움직임이 자연스럽게 이어져야 했습니다.In a learning app used daily by elementary students, awkward transitions and interrupted motion break focus. Screens had to transition without performance overhead, while avatar motion needed to continue naturally across state changes.

02 APPROACH

레이아웃 변화는 Motion의 layout(FLIP)으로, 상태에 따라 달라지는 아바타 모션은 Rive State Machine으로 나눴습니다. 인터랙션의 성격에 맞는 도구를 선택해 별도 로직과 상태 분기를 줄였습니다.I used Motion's layout animation (FLIP) for layout changes and Rive State Machines for state-driven avatar motion. Matching each tool to the interaction reduced custom transition logic and state branching.

03 IMPLEMENTATION

Motion의 layout(FLIP)을 적용해 레이아웃 변화 전후를 자연스럽게 보간했습니다. Rive로 TTS와 입 모양을 동기화하고 아이템 교체를 상태 전이로 연결했습니다. 툴팁·튜토리얼·토스트는 공통 컴포넌트로 만들고 Storybook과 Cypress로 문서화·검증했습니다.I used Motion's layout animation (FLIP) to interpolate between layout states, synchronized avatar mouth shapes with TTS in Rive, and handled item changes as state transitions. Tooltips, tutorials, and toasts became shared components documented in Storybook and covered by Cypress.

04 RESULT
  • —별도 애니메이션 로직 없이 레이아웃 변화 대응Handled layout changes without custom animation logic
  • —TTS 입 모양 동기화·아이템 교체 시 모션 끊김 해소Synchronized TTS mouth motion and removed breaks when changing items
  • —공통 인터랙션 컴포넌트의 구현 편차와 회귀 위험 감소Reduced implementation variance and regression risk through shared interaction components
  • —「CSS 애니메이션 한계 넘기」로 학습 내용 공유Shared the work in “Beyond the Limits of CSS Animation”
CASE 03

Native-Feeling Tablet WebView

Flutter · flutter_inappwebview · Web-App Bridge · React · TypeScript

What I owned
WebView의 로딩·오류·디바이스 상태를 앱에 맞는 화면으로 구현했습니다.Built app-specific loading, error, and device states for the WebView.
Period
2024.02 — 2024.04Feb 2024 — Apr 2024
AT A GLANCEWebView와 앱의 역할WebView and app responsibilities
01
Web 콘텐츠Web content
학습 화면 · 오류 화면Learning · error screens
02
Web-App 브리지Web-App bridge
상태 전달State exchange
03
Flutter · 기기Flutter · device
네트워크 · 블루투스 · 배터리Network · Bluetooth · battery
01 CONTEXT & PROBLEM

Real Academy는 WebView로 만든 서비스지만 사용자는 태블릿 앱으로 인식합니다. 이미지가 뒤늦게 나타나거나 화면 로딩이 길어지면 앱 안에서 갑자기 웹을 보는 것처럼 어색해집니다. 네트워크가 끊기거나 404가 발생했을 때도 사용자가 직접 새로고침하기 어렵고, 블루투스·배터리 같은 기기 상태는 웹만으로 알 수 없었습니다.Real Academy is built with a WebView, but users experience it as a tablet app. Late-loading images or long screen loads made the app suddenly feel like a website. Users could not simply refresh after a network failure or 404, and the web layer could not read device states such as Bluetooth or battery on its own.

02 APPROACH

정상 화면뿐 아니라 로딩과 실패 상황까지 앱 경험의 일부로 봤습니다. 이미지와 콘텐츠는 미리 준비하고, 네트워크·디바이스 상태는 Flutter와 연결했습니다. 웹의 기본 오류 화면 대신 앱 안에서 상황을 설명하는 전용 화면을 제공했습니다.I treated loading and failure states as part of the app experience, not exceptions outside it. Images and content were prepared ahead of time, device state was connected through Flutter, and browser error pages were replaced with screens that stayed within the app's context.

03 IMPLEMENTATION

Flutter와 flutter_inappwebview로 전용 컨테이너를 만들고 RpcService·AssetManager 캐싱으로 이미지와 콘텐츠 로딩을 줄였습니다. Web-App 브리지로 블루투스·네트워크·배터리 상태를 전달하고, 네트워크 단절과 404에서는 일반 웹 페이지 대신 앱 전용 오류 화면을 보여줬습니다.I built a dedicated container with Flutter and flutter_inappwebview and used RpcService and AssetManager caching to reduce visible image and content loading. The Web-App bridge delivered Bluetooth, network, and battery state to the web layer. Network failures and 404s showed app-specific error screens instead of generic web pages.

04 RESULT
  • —이미지·콘텐츠 로딩이 화면에 드러나는 구간 축소Reduced moments where image and content loading became visible
  • —네트워크 단절·404에서도 웹의 기본 오류 화면 대신 앱 화면 유지Kept users inside the app experience during network failures and 404s
  • —블루투스·네트워크·배터리 상태를 앱 화면에서 바로 안내Displayed Bluetooth, network, and battery state directly in the app interface
CASE 04

Frontend Performance & Reliability

Flutter WebView · Lighthouse/CDP · React Profiler · Zustand · Virtualization · Sentry

What I owned
태블릿 성능 계측부터 React 최적화, 프로덕션 오류 검증까지 담당했습니다.Owned tablet performance measurement, React optimization, and production validation.
Period
2026.07 — 2026.09Jul 2026 — Sep 2026
AT A GLANCE측정된 개선Measured improvements
−95%
홈 이미지 전송량Home image payload
2,218KB → 110KB2,218KB → 110KB
40·60 → 0
관련 없는 렌더 커밋Unrelated render commits
자막 재생 · 에세이 입력Transcript · essay input
−99.4%
DOM·마크다운 렌더DOM and Markdown rendering
1,279행 → 화면 7~8행1,279 rows → 7–8 visible
79 → 0
프레임 인덱스 문제Frame-index issues
11명에게서 발생Across 11 users
01 CONTEXT & PROBLEM

Real Academy는 WebView 기반 태블릿 앱이라 개발 PC에서 괜찮던 화면도 실제 기기에서는 느리게 느껴졌습니다. 사용자가 겪는 느린 화면 반응과 불안정한 학습 경험을 개선하려 했지만, 문제를 재현하고 개선 전후를 비교할 기준이 없었습니다. 그래서 초기 로딩, React 런타임, 프로덕션 안정성을 각각 측정·검증하고, 확인한 원인을 실제 개선까지 연결할 수 있는 환경부터 만들었습니다.Real Academy runs as a WebView-based tablet app, so screens that felt fine on development machines could still feel slow on real devices. I wanted to improve sluggish interactions and an unstable learning experience, but we had no repeatable way to reproduce problems or compare changes. I therefore first created environments for measuring and validating initial loading, React runtime performance, and production reliability, then used the findings to drive concrete improvements.

02 APPROACH

초기 로딩은 실제 태블릿과 비슷한 1280×800@2x, CPU 2배 감속, 10Mbps 환경에서 측정했습니다. 인증 화면과 캐시 상태를 맞춘 5회 측정의 중앙값으로 이미지 전송 병목을 찾고, 개선 후에도 같은 조건에서 다시 측정했습니다. React 런타임은 Profiler로 렌더 커밋과 상태 구독 범위를 추적한 뒤, 상태 구독과 DOM 렌더 범위를 필요한 만큼으로 줄였습니다.I measured initial loading under tablet-like conditions: 1280×800@2x, 2× CPU slowdown, and a 10Mbps network. With authentication and cache state controlled, I used the median of five runs to identify image-transfer bottlenecks and repeated the same measurement after each improvement. For React runtime performance, Profiler traced render commits and subscription scope before I reduced state subscriptions and DOM rendering to only what each screen needed.

프로덕션 안정성은 문제를 재현 조건과 근본 원인별로 분류하고 배포 전에 성공 기준을 정했습니다. 릴리스별 사용자당 Sentry 이벤트와 미수정 이슈의 추이를 함께 비교해 실제 사용자 환경에서 개선 여부를 확인하고, 확인된 문제는 회귀 테스트로 남겼습니다.For production reliability, I grouped issues by reproduction condition and root cause and defined success criteria before release. I compared Sentry events per user across releases with trends from unresolved issues, validated the changes in real user environments, and encoded confirmed failure scenarios in regression tests.

03 IMPLEMENTATION

성능 계측·로딩 최적화 — CDP로 인증 상태를 주입해 로그인 이후 화면을 Lighthouse에서 측정했습니다. 홈 이미지는 실제 렌더 폭에 맞게 sizes를 지정하고 LCP 이미지에 priority를 적용해 불필요하게 큰 이미지가 전송되지 않도록 했습니다.Performance measurement and loading optimization — I injected authentication through CDP to measure post-login screens in Lighthouse. Home images received sizes based on rendered width and priority for the LCP image, avoiding unnecessarily large transfers.

런타임 최적화 — 자막 재생과 에세이 입력 중 관련 없는 컴포넌트까지 다시 렌더되는 경로를 Profiler로 찾았습니다. Zustand 스토어 전체를 구독하던 코드를 필요한 상태만 구독하도록 바꾸고, 1,279행의 가변 높이 자막과 마크다운은 화면에 보이는 7~8행만 렌더하도록 가상화했습니다. 렌더 커밋 횟수를 검사하는 성능 테스트도 추가했습니다.Runtime optimization — Profiler exposed unrelated re-renders during transcript playback and essay input. I replaced whole-store Zustand subscriptions with targeted selectors, virtualized the 1,279-line variable-height transcript to 7–8 visible rows, and added performance tests for render commits.

안정성·검증 — 6주간 수집한 레슨 기능의 프로덕션 문제를 재현 조건과 근본 원인별로 정리했습니다. 배포 전에 성공 기준을 정하고 미수정 이슈의 추이를 비교군으로 두어, 실제 사용자 환경에서 수정 효과를 검증했습니다. 레슨 중단·오디오·세션 생명주기 문제를 수정하고 회귀 테스트를 구축했습니다.Reliability and validation — I organized six weeks of production issues in the lesson experience by reproduction condition and root cause. I defined success criteria before release and used trends from unresolved issues as a comparison group to validate the fixes in real user environments. I fixed lesson-blocking, audio, and session-lifecycle issues and added regression tests.

04 RESULT
  • —홈 이미지 전송량 2,218KB → 110KB (−95%), LCP 10.9초 → 9.9초Reduced home image payload from 2,218KB to 110KB (−95%) and LCP from 10.9s to 9.9s
  • —자막 재생·에세이 입력 중 관련 없는 컴포넌트의 렌더 커밋 각각 40건·60건 → 0건, Zustand 전체 상태 구독 지점 325곳 → 151곳Reduced unrelated render commits during transcript playback and essay input from 40 and 60 respectively to zero, and Zustand state subscriptions from 325 to 151
  • —자막 1,279행 중 화면 동시 렌더를 7~8행으로 고정, DOM·마크다운 렌더 99.4% 감소Held simultaneous rendering for a 1,279-line transcript to 7–8 rows, reducing DOM and Markdown rendering by 99.4%
  • —레슨 화면의 프레임 인덱스 문제 11명에게서 79건 발생 → 0건, 성능·프로덕션 문제 회귀 테스트 추가Reduced frame-index issues in the lesson experience from 79 cases across 11 users to zero and added regression tests for performance and production issues
CASE 05

Operational Automation for Live Classes

Zoom SDK · Zustand · TanStack Query · React · TypeScript

What I owned
라이브 수업 전 구간 구현 → 학기 운영 자동화 → 출석·상태 동기화End-to-end live-class experience → term operations automation → attendance and state synchronization
Period
2024.06 — 현재Jun 2024 — Present
AT A GLANCE운영 결과Operational outcomes
−71%
학기 설정 리드타임Term setup lead time
< 1%
출석 누락률Missed attendance
Heartbeat 누적 판정Accumulated heartbeat decisions
−80%
네트워크 호출Network requests
Adaptive PollingAdaptive Polling
4 terms
지연·운영 문제 0건Zero delays or operational issues
01 CONTEXT & PROBLEM

Real Academy의 라이브 수업은 학생이 강사와 실시간 영어 수업을 듣고 VOD와 노트로 복습하는 서비스입니다. 매 학기 공지·개강 조건·QA 계정 설정을 수작업으로 반복해 일정 지연과 누락 위험이 있었고, 네트워크 단절과 재입장 때문에 한 번의 입·퇴실 이벤트만으로 출석을 정확히 판단하기도 어려웠습니다.Real Academy's live classes let students take real-time English lessons with instructors and review them through VOD and notes. Repeating notice, opening-condition, and QA-account setup by hand each term created risks of delays and omissions, while disconnections and re-entry made attendance difficult to determine from a single join or leave event.

02 APPROACH

학생에게는 참여부터 복습까지 이어지는 경험을, 운영자에게는 반복 준비를 설정 변경으로 처리하는 구조를 만들었습니다. 학기 상태와 권한은 코드와 데이터로 관리하고, 출석은 누적된 상태로 판단했으며, 상태 확인 주기는 수업 여부에 따라 조절했습니다.I created a connected journey from participation to review for students and reduced recurring preparation to configuration changes for operators. Term state and permissions moved into code and data, attendance was based on accumulated state, and polling frequency adapted to whether a class was active.

03 IMPLEMENTATION

수업 경험 — 목록·상세·VOD·노트·커리큘럼·시간표·알림을 구현하고, Zoom SDK를 iframe으로 통합해 제품 안에서 참여와 복습이 이어지게 했습니다.Class experience — I built lists, details, VOD, notes, curriculum, schedules, and notifications, then integrated the Zoom SDK in an iframe to connect participation and review within the product.

운영 자동화 — 학기 상태와 권한을 백오피스와 연결하는 반자동 동기화 파이프라인을 만들고, 반복 설정과 QA 과정을 문서화했습니다.Operations automation — I built a semi-automated pipeline connecting term state and permissions to the back office and documented recurring configuration and QA.

출석·상태 동기화 — 1분 주기로 Heartbeat를 수집해 세션당 20회 이상 확인되면 출석으로 인정했습니다. Adaptive Polling으로 수업 중에는 상태를 자주 확인하고 비활성 구간에는 주기를 늘렸습니다.Attendance and state synchronization — I collected one-minute heartbeats and marked attendance after at least 20 detections per session. Adaptive Polling checked frequently during class and relaxed its interval during inactive periods.

04 RESULT
  • —9개 학기 데이터·UI·QA 담당, 4학기 연속 지연·운영 문제 0건Owned data, UI, and QA across nine terms, with zero delays or operational issues for four consecutive terms
  • —학기 설정 리드타임 71% 단축, 문서화로 전담 운영 인력 없이 인수인계 가능한 구조 마련Reduced term setup lead time by 71% and enabled handoff without dedicated operations staffing through documentation
  • —Heartbeat 누적 판정으로 출석 누락률 1% 미만, 관련 CS 문의 해소Kept missed attendance below 1% through accumulated heartbeat-based decisions and resolved related support requests
  • —비활성 구간의 상태 확인 주기를 늘려 네트워크 호출 80% 감소Reduced network requests by 80% by extending state-check intervals during inactive periods
CASE 06

Human-in-the-Loop AI Tooling

RAG(Qdrant) · FastAPI · React · Vite · Azure OpenAI · Kubernetes

What I owned
RYACO 기획·2인 풀스택 개발 → 사람 승인 기반 AI 수정 워크플로 설계 → 운영 배포RYACO planning and two-person full-stack development → human-approved AI workflow design → production deployment
Period
2026.04 — 현재Apr 2026 — Present
AT A GLANCE사람 승인 기반 오류 수정 흐름Human-approved error-fix flow
01
오류 알림Error alert
02
AI 분석AI analysis
03
Slack 공유Slack post
04
사람 승인Human approval
명시적 승인 경계Explicit approval boundary
05
Draft PRDraft PR
01 CONTEXT & PROBLEM

정책 문서가 여러 곳에 흩어져 있어 동료들이 같은 내용을 반복해서 찾고 답해야 했고, 정책의 충돌이나 누락은 개발이 시작된 뒤에야 발견되기도 했습니다. Sentry 알림도 사람이 매번 열어 원인을 분석해야 했습니다. 검색과 분석은 AI로 줄일 수 있었지만, 정책 원문과 코드를 바꾸는 일까지 근거와 승인 없이 맡길 수는 없었습니다.Policy documents were scattered across multiple locations, so teammates repeatedly searched for and answered the same information, while conflicts and omissions sometimes surfaced only after development began. Every Sentry alert also required manual investigation. AI could reduce the search and analysis work, but changes to source policies and code could not be delegated without evidence and approval.

02 APPROACH

AI는 문서를 검색하고 문제를 분석해 수정안을 만들고, 사람은 근거를 확인해 최종 변경을 승인하도록 역할을 나눴습니다. 모든 답변과 수정안에 원문 출처와 판단 맥락을 남기고, 명시적인 승인 전에는 정책이나 코드가 바뀌지 않도록 두 워크플로에 같은 원칙을 적용했습니다.I divided responsibilities so AI searched documents, analyzed problems, and drafted changes, while people reviewed the evidence and approved final changes. Both workflows retained original sources and decision context, and neither policy nor code could change before explicit human approval.

03 IMPLEMENTATION

RYACO — 흩어진 정책 문서를 RAG로 검색해 답변과 원문 출처를 함께 제공하는 사내 도구를 2인 풀스택으로 개발했습니다. 문서의 누락·충돌·개선점을 찾고 승인된 수정만 원문에 반영하는 검색→검토→반영 흐름을 설계했습니다. 운영 환경에 맞춰 ChromaDB를 Qdrant로, LLM 실행 경로를 CLI→워커→Azure OpenAI로 이관했습니다.RYACO — In a two-person full-stack team, I built an internal RAG tool that searches scattered policy documents and returns answers with original-source links. I designed a search→review→apply flow that finds omissions, conflicts, and improvements and applies only approved changes. To fit the operating environment, I migrated ChromaDB to Qdrant and the LLM execution path from CLI→worker→Azure OpenAI.

Sentry 자동 수정 에이전트 — 오류 알림→AI 분석→Slack 게시→사람 승인→Draft PR 생성 흐름을 구축했습니다. 분석과 코드 변경을 분리하고, Draft PR 강제·중복 실행 방지·토큰 마스킹을 적용했습니다. Kubernetes 환경변수와 webhook을 구성해 배포하고 예외 경로를 포함한 테스트 36건을 만들었습니다.Sentry Auto-fix Agent — I built a flow from error alert→AI analysis→Slack post→human approval→Draft PR. I separated analysis from code changes and added mandatory Draft PRs, duplicate-run prevention, and token masking. I configured Kubernetes environment variables and webhooks, deployed the workflow, and added 36 tests covering failure paths.

04 RESULT
  • —반복되는 정책 질의에 원문 출처가 포함된 답변 제공Provided source-backed answers to recurring policy questions
  • —개발 전 정책 검토 단계에서 충돌과 누락 발견Found policy conflicts and omissions before development
  • —검토 의견·근거·결정 맥락을 기록하는 협업 과정 구축Established a review process that records opinions, evidence, and decision context
  • —사람의 최종 승인 권한을 유지하며 오류 분석부터 Draft PR까지 자동화, 테스트 36건으로 운영 검증Automated error analysis through Draft PRs while preserving final human approval, validated by 36 tests
  • —사내 AI Talk를 운영하고 RYACO 사례를 SIPE 5기 사담콘에서 공유 — 발표자료Ran internal AI Talks and shared RYACO at the SIPE 5th Cohort SAdAM Conference — Slides
04  ACTIVITIES & WRITING
SIPE 5·6기SIPE 5th · 6th Cohorts

'우리가 다니고 싶은 회사 만들기'를 주제로 조직 문제 해결 사례 발표. 6기 부회장으로 프로그램 방향·일정·주제 논의 및 커뮤니티 운영 참여.Presented organizational problem-solving cases under the theme ‘Building a Company We Want to Work For.’ As vice president of the 6th cohort, helped shape program direction, schedules, topics, and community operations.

NEXTERS 25·26기NEXTERS 25th · 26th Cohorts

WeSki, for the Block 프론트엔드 개발. 25기 대상 및 카카오 대표이사상 수상, MAU 4천·리텐션 50%+ 기록.Built the frontend for WeSki and for the Block. Won the Grand Prize and Kakao CEO Award in the 25th cohort; reached 4K MAU and 50%+ retention.

Google Cloud Study Jam HackathonGoogle Cloud Study Jam Hackathon

Gemini 기반 AI 서비스 새김(Saegim) 개발, Top 6 선정.Built Saegim, a Gemini-powered AI service, and placed in the Top 6.

Agile Coach Squared Lv.1Agile Coach Squared Lv.1

습관 설계·CTA·마음읽기·잡크래프팅 등 개인·조직의 학습·협업 방법론을 학습하고 실무와 팀에 적용.Studied methods for individual and organizational learning and collaboration—including habit design, Commitment to Action, mind-reading, and job crafting—and applied them in practice with my team.

부스트캠프 · 코드숨Boostcamp · CodeSoom

네이버 커넥트재단 부스트캠프 웹·모바일 6기에서 협업툴 Duxcord 개발 및 'React에서 Jest' 발표. 코드숨 리액트 편에서 TDD·코드리뷰 중심으로 학습.Built the collaboration tool Duxcord and presented ‘Jest in React’ during NAVER Connect Foundation's Boostcamp Web·Mobile 6th cohort. Practiced TDD and code-review-driven learning in CodeSoom's React program.