Gu Doyoon

PROJECT RECORD

  • React
  • TypeScript
  • Vite
  • Zustand
  • Tanstack Query
  • Styled-Components

CoKo

JavaScript를 게임처럼 배우는 퀴즈 기반 교육 서비스

2024.09 — 2025.036명프론트엔드 팀장 · 어드민 페이지 개발
GitHub
CoKo 서비스 화면
CoKo / quiz-based JavaScript learning service

CONTRIBUTION LOG

내가 맡은 일

01 / LEARNING

퀴즈 유형과 학습 진행 화면 구현

OX·객관식·주관식·조합형 퀴즈 화면과 문제 조회 흐름을 구현했습니다. 진행 중인 학습에서는 사용자별 문제를 별도로 조회하도록 구성했습니다.

02 / LEAVE SAFELY

학습 중 이탈 확인 흐름 추가

퀴즈를 풀다가 다른 화면으로 이동할 때 진행 내용이 사라질 수 있음을 알리고, 계속 학습하거나 나갈 수 있게 확인 화면을 추가했습니다.

03 / OPERATIONS

콘텐츠와 상점 아이템 운영 화면 구현

문제·섹션·파트의 등록·수정 화면을 만들고, 드래그앤드롭으로 학습 순서를 바꿀 수 있게 했습니다. 상점 아이템 등록과 이미지 업로드 흐름도 구현했습니다.

DECISION RECORD

구현하며 확인한 문제

ref 콜백 함수 전달로 인한 무한 리렌더링 이슈 해결
문제 상황
reference image

팝업 컴포넌트 마운트 시 무한 리렌더링 발생

DOM rect 정보를 전역 상태로 저장하기 위해 콜백 ref로 DOM 노드에 접근해야 했습니다. 하지만 특정 팝업 컴포넌트가 마운트되면 무한 리렌더링이 발생하여 브라우저가 프리징되는 현상이 있었습니다.

원인 파악

React의 ref 콜백은 렌더링마다 새로운 함수 참조가 전달되면 다시 실행됩니다. ref 실행 → 상태 변경 → 리렌더링 → ref 재실행의 무한 루프가 원인이었습니다.

해결 과정
reference image

ref 콜백을 useCallback으로 감싸 참조를 고정

결과 요약
useCallback을 활용한 ref 참조 안정화 및 브라우저 프리징 문제 제거
퀴즈 데이터 유실 방지
문제 상황

퀴즈 풀이 도중 실수로 새로고침이나 뒤로가기를 눌렀을 때, 전역 상태가 초기화되어 진행 상황이 모두 날아가는 문제가 있었습니다.

해결 과정

복잡한 복구 로직 대신, 브라우저의 beforeunload 이벤트를 활용해 실수를 방지하는 것이 MVP 단계에서 가장 효율적인 해결책이라 판단했습니다.

useEffect(() => { if (!enabled) return; window.addEventListener("beforeunload", handleBeforeUnload); return () => { window.removeEventListener("beforeunload", handleBeforeUnload); }; }, [enabled, handleBeforeUnload]);
결과 요약
실수로 인한 퀴즈 데이터 유실 방지 및 사용자 경험 향상