Bang Eunsu

Introduce

Hi, I'm Bang Eunsu — a frontend developer with 2y of professional experience (age 27).

I build web services with TypeScript, React, and Next.js, and also develop and maintain new features for our in-house mobile application in a React Native (CLI) environment.

I don't stop at building the screen — I focus on the parts that touch the user experience, like initial load performance and interactions. When problems come up, I look into the root cause with the team and try to solve them in a structural way.

I am also deeply interested in weaving AI tools like Claude Code into the day-to-day development flow. I think a lot about how to load project context per-domain, automate repetitive work with sub-agents, and naturally fold AI into real engineering tasks.

When issues come up at work, I prefer to talk them through with the team. I believe that closing the gap between business and engineering is where good products begin. I want to keep adapting to changing technologies and AI-driven development environments, and grow into a developer who delivers a better experience to users.

Experience

Wonder Round Inc.

2025.04 ~ Present

Day 390 on the job

  1. 1.

    Introduced a staged-mount pattern to optimize entry performance on key screens

    • Problem

      On heavy screens that accumulate many hooks and API calls (lists / map / detail), every widget mounts at the same time on entry, which makes the navigation animation stutter and delays the appearance of the skeleton.

      Solution

      Split the screen into entry point and body in two stages — show the skeleton immediately right after the navigation transition, and detect the end of the transition with setImmediate so the body only mounts after the animation finishes. This minimizes the cost of the first paint and shortens perceived entry time.

    • Pre-warmed data shown at the top of the screen with a separate prefetch hook so that it is already cache-hit by the time the body mounts.

    • Introduced a shared hook that handles scroll event handlers in a JS-thread non-blocking way, so other interactions are not delayed during scrolling.

  2. 2.

    Built push notification and deep link entry flows

    • Problem

      When a push is tapped from a cold start, the navigation stack is not ready yet, so routing is sometimes dropped.

      Solution

      Stored the pending payload in a global store and consumed the queue once navigation is ready, applying an async-queue pattern for routing.

    • Problem

      When the deep link target is a webview screen and the app is launched from a cold start, the navigation stack ends up containing only that single webview, so pressing back terminates the app instead of returning to the previous in-app screens.

      Solution

      Instead of a plain navigate call, I composed the navigation state directly to reset it into a structure where BottomTabs is the base route and a Stack (related underlay screen + webview) is stacked on top. This guarantees a natural back flow: webview → related screen → BottomTabs.

    • Added a normalization layer for the notification list response to match the updated push-sending API schema on the backend.

    • Implemented a deep link handler that parses the push payload and branches across cold-start / background / foreground entry cases.

  3. 3.

    Introduced and standardized an optimistic-update pattern with Tanstack Query

    • Problem

      For toggle-like mutations such as bookmark / like, the UI was not updated until the server response, so users repeatedly tapped the same button across multiple screens.

      Solution

      Applied the standard cancel → snapshot → cache update → rollback flow to reflect the change in the UI immediately. On failure, the onError step rolls back from the snapshot and shows a toast so the flow stays consistent.

    • Patched related screen caches directly with setQueryData to remove unnecessary network round-trips caused by invalidate, and to keep state consistent across screens.

  4. 4.

    Implemented a Naver Map–based store discovery screen and optimized search/render

    • Problem

      Code-driven camera moves (region filter selection, initial camera setup) were treated identically to user gestures, which caused the result-list API to be called multiple times.

      Solution

      Tracked code-driven camera moves with a separate ref to distinguish them from real user gestures, and toggled a re-search-enabled flag so re-search is only triggered on meaningful user actions.

    • Built a util that derives the southwest/northeast bounds of the visible area from the map camera center and lat/lng deltas, and passes them as the search range to the result-list API. This way, only results that match exactly what the user is looking at on the map are fetched.

  5. 5.

    Implemented a custom pull-to-refresh inside a BottomSheet layout where a banner is always visible

    • Problem

      The main screen has a composite layout where a BottomSheet is partially visible above a top banner, with the BottomSheet snapPoint fixed so the banner is always visible. In this setup, binding a standard RefreshControl to the list inside the BottomSheet does not detect a pull gesture in the banner area, so pull-to-refresh does not work on either iOS or Android.

      Solution

      Wrapped the entire screen with a GestureDetector, detected the pull gesture directly via Pan Gesture, and synced the indicator position / rotation / opacity to the pull distance with Reanimated worklet. Triggered the refresh once the threshold was crossed and held the indicator until the response completed — designing the state flow myself.

    • Resolved conflicts between scroll gestures inside the BottomSheet and the screen-wide Pan Gesture by adjusting gesture priorities with waitFor, so pull in the banner area and scroll inside the BottomSheet were cleanly separated.

    • Branched the indicator look / position per platform to follow iOS and Android guidelines.

  6. 6.

    Android-specific platform troubleshooting

    • Problem

      On high-refresh-rate / high-density Android devices, fast fling scrolls on virtualized lists briefly showed empty rows, making the scroll feel choppy.

      Solution

      Added an Android-specific branch in the shared LegendList wrapper. Increased drawDistance (which defines the pre-render area) from 250 to 400 to widen the pre-rendered range, and split decelerationRate into fast for iOS / normal for Android to compensate for platform inertia differences. Exposed removeClippedSubviews (which temporarily detaches off-screen views) as an opt-in to reduce Android overdraw cost.

    • Problem

      The image picker library cut off its action button area on Android because it was hidden behind the system bottom navigation bar.

      Solution

      Patched the library itself to respect SafeArea inset, and managed it through a pnpm patch workflow so the patch is preserved across dependency upgrades.

    • Problem

      A custom horizontal swiper built with Reanimated Spring + Pan Gesture overshot too much on Android, missed fast swipes, and felt sluggish compared to iOS for the same gesture.

      Solution

      Branched Spring settings and gesture thresholds per platform. For Android, increased damping to 25 (iOS 22) to suppress overshoot, narrowed Pan Gesture activeOffsetX from ±10 to ±8 to improve swipe sensitivity, and lowered the swipe trigger velocity threshold to 150 to compensate for Android reporting lower velocity values — bringing the feel close to iOS.

  7. 7.

    Built a Claude Code–based development productivity infrastructure

    • With the prior RN app developer leaving and domain knowledge handover broken, I had to maintain the app and ship new features alone with limited RN experience. To cut the learning cost and keep domain context always accessible, I designed and built a Claude Code–based assist infrastructure myself.

    • Split project rules per domain (UI ecosystem / performance / animation / server state / navigation / global state / i18n / new feature flow), so only the rules relevant to the current task are loaded based on keywords.

    • Composed a planner → generator → evaluator 3-stage loop sub-agent to automate parts of the implementation work.

    • Built a separate sub-agent dedicated to Android performance optimization, so it can automatically diagnose Android-specific issues — virtualized list jank / gesture conflicts / render load / memory usage — and propose code changes.

    • Hardened the dev environment with RN debugging tool hook setup.

Korea Global Knowledge Network Inc.

2024.03 ~ 2025.03

1y 10d of total experience

  1. 1.

    Built question bank management features needed for quizzes

    • Problem

      When changing the order of choices, the API request needed each choice ID — but during add / edit / delete, it was hard to distinguish new choices from existing ones.

      Solution

      After adding/editing/deleting a choice, kept the question data fresh by leveraging Tanstack Query invalidateQueries to auto-refresh. Then sorted based on the latest choice data and called the order-change API for accuracy.

  2. 2.

    Built management features for course composition units (chapters / sections / VOD / quiz / hands-on)

    • Problem

      Configuration values required for hands-on, VOD, etc. differed, so providing a single consistent form was hard, and UI complexity grew.

      Solution

      Built independent forms per content type and rendered them dynamically based on the selected type, easing UI complexity and improving usability.

  3. 3.

    Built an attendance calendar component & a feature that shows attendance status by selected year, month, and week

    • Implemented weekly / monthly view modes

    • Built a popup component letting users select a specific year, month, and week

Skills

Languages

  • JavaScript (ES6+)
  • TypeScript
  • HTML5 / CSS3
  • Java
  • C#

Libraries & Frameworks

  • React.js (vite)
  • Next.js
  • React Native (CLI)
  • Tailwind CSS
  • Tanstack Query
  • Zustand
  • Recoil
  • Shadcn
  • Express

Backend

  • Prisma
  • Drizzle
  • Neon
  • Supabase
  • Vercel
  • Docker
  • GitHub Actions
  • EC2
  • S3

Tools

  • Git & GitHub
  • Jira
  • Notion
  • Figma
  • Slack

Portfolio

Bread And Source

  • Site & back-office for an actual operating bakery (beta)
Next.jsTypeScriptTailwind CSSNeonDrizzleZustandTanstack QueryFramer motion

Eunsutory

  • Personal retrospective & introduction blog
Next.jsTypeScriptTailwind CSSPrisma

Scrama

  • Amazon web scraping site
Next.jsTypeScriptTailwind CSSCheerio

Wasd Rental System

  • Equipment rental system built for a university club
React.jsTypeScriptExpress.jsTailwind CSSZustandTanstack Query

Eunimation

  • Animation recommendation site
Next.jsTypeScriptTailwind CSSFramer MotionZustand

Eunsuread

  • Threads clone site
Next.jsTypeScriptTailwind CSSClerkMongoose

Education

Myongji College

Department of Software Contents

2022.03.02 ~ 2024.02.28

  • Graduated with a GPA of 4.26
  • Ran a web development club as the vice president and led project development (2022.06 ~ 2024.02)
  • Built an equipment rental system, a local restaurant / spot finder site, a 2D roguelike mobile game, and more

Certification

  • Engineer Information Processing (Industrial)
  • Computer Specialist Level 1
  • Word Processor
  • TOEIC (Score 815)Acquired on 2023.07.19