Wikied는 사용자들이 자유롭게 인물에 대한 문서를 생성하고 편집할 수 있는 플랫폼입니다. 생성한 위키 페이지의 링크를 복사하여 친구들과 공유할 수 있으며, 그들이 함께 작성하도록 초대할 수 있습니다. 또한, 자유게시판에서 글을 작성할 수 있으며, 많은 좋아요를 받은 글은 베스트 게시글에 오를 수 있습니다.
API 응답 대기 시간으로 인한 UI 반응 속도 저하 문제를 낙관적 업데이트 적용으로 해결
useMutation
훅을 활용한 낙관적 업데이트를 적용하여, 데이터 변경 요청 시 UI를 즉시 변경하고 응답 실패 시 롤백하는 기능을 구현사용자 입력 중복으로 인한 불필요한 API 호출 및 서버 부하를 줄이기 위한 검색 기능 성능 최적화를 진행
lodash
의 debounce
를 적용하여 사용자 입력이 멈춘 후 500ms 뒤에만 API 호출되도록 구현debounce
작업을 즉시 취소하는 로직 추가전체 페이지가 로딩된 후에야 렌더링되는 문제를 해결하기 위해 Streaming SSR을 도입하여 초기 로딩 속도와 사용자 경험을 개선했습니다.
최적화되지 않은 SVG로 인한 초기 렌더링 지연 문제를 해결하기 위해 SVG 최적화 전략을 수립하고 적용했습니다.
페이지 전환 시 데이터 중복 요청으로 인한 로딩 시간 증가 및 사용자 경험 저하를 해결
useQuery
훅과 placeholderData
옵션을 사용하여 페이지 전환 시 이전 데이터를 즉시 표시하며 새로운 데이터를 백그라운드에서 요청하는 방식 적용마크다운 기반 편집기 구현을 위해 React Quill 라이브러리를 도입하여, 비기술적인 사용자도 쉽게 문서를 작성할 수 있는 환경 구축
모바일, 태블릿, 데스크탑 등 다양한 디바이스에서 일관되고 최적화된 사용자 경험을 제공하기 위해 반응형 디자인을 적용
📌 문제 배경
초기에는 Article 페이지 전체 콘텐츠가 모두 준비된 후에야 화면이 렌더링되는 구조였습니다. 이로 인해, 사용자가 첫 번째 주요 콘텐츠를 보기까지 지연이 발생했고, LCP가 2.4초로 기준선에 근접한 느린 수준이었습니다. 특히, 댓글(CommentSection)처럼 비동기 데이터를 필요로 하는 컴포넌트가 병목으로 작용하여 초기 화면 렌더링을 지연시켰고, 사용자 체감 속도가 저하되는 문제가 있었습니다.
🔍 원인 분석
🛠 해결 과정
React Suspense
를 활용하여, 주요 콘텐츠와 댓글을 독립적인 <Suspense>
로 분리fallback={<Skeleton />}
을 사용해 주요 콘텐츠(ArticlePage)는 먼저 렌더링되고, 댓글(CommentSection)은 백그라운드에서 병렬 로딩✅ 결과
🧠 배운 점
Streaming SSR
을 적용하면 모든 콘텐츠를 기다리지 않고 주요 콘텐츠를 먼저 렌더링할 수 있어, 초기 반응성(LCP)과 사용자 경험을 효과적으로 개선할 수 있음을 체감했습니다. 특히, React Suspense와 Next.js의 지원을 활용하면 점진적인 페이지 로딩 전략이 구현 가능하며, 이는 UX와 SEO 모두에 긍정적인 영향을 미친다는 점을 실감했습니다.
📌 문제 배경
초기 프로젝트에서는 SVG
아이콘을 직접 인라인으로 삽입하거나, public/ 폴더에 저장한 후 <Image>
태그로 불러오는 방식으로 사용했습니다. 하지만, SVG 파일 용량이 커지고, 불필요한 속성이 포함되어 렌더링 속도가 저하되는 문제가 발생했습니다. 특히, 자주 사용되는 아이콘이 여러 번 렌더링되면서 초기 로딩 시간이 증가했고, Lighthouse 성능 점수에서도 LCP(최대 콘텐츠 페인트) 지연이 확인되었습니다.
🔍 원인 분석
fill
, stroke
속성이 유지되면서 스타일 오버라이드가 어려움🛠 해결 과정
SVGR
을 활용하여 React 컴포넌트로 변환fill
, stroke
속성을 props로 받아 동적으로 스타일 변경 가능하도록 처리SVGO
를 사용하여 불필요한 속성 제거 및 용량 최적화SVGR
을 활용한 React 컴포넌트 변환public/
폴더에 저장 후 next/image
활용✅ 결과
React
에서 불필요한 리렌더링을 줄이면서 최대 지연 시간 약 51% 감소🧠 배운 점
SVG 최적화는 단순한 파일 크기 감소뿐만 아니라 렌더링 성능과 유지보수성에도 큰 영향을 준다는 것을 확인했습니다. SVGR
과 SVGO
를 함께 활용하면 아이콘을 효율적으로 관리할 수 있고, 브라우저 성능도 최적화할 수 있습니다.
📌 문제 배경
Next.js의 내장 모달 라우팅을 사용하여 모달을 열고 닫는 기능을 구현할 때, URL 변경이 계속 발생하면서 Params
와 배경 상태를 일관되게 관리해야 하는 문제가 생겼습니다. 모달 상태를 라우팅과 동기화하려다 보니 코드가 복잡해지고, URL과 UI 상태를 일관되게 유지하는 데 추가적인 관리가 필요해졌습니다. 이러한 과정에서 라우팅 의존성이 과도하게 커지는 점이 불편함을 느꼈습니다.
🔍 원인 분석
🛠 해결 과정
✅ 결과
🧠 배운 점
Next.js 내장 모달 라우팅은 URL을 통해 모달 상태를 기록하고 브라우저 히스토리를 유지하는 데 유용하지만, 복잡한 UI 상태 관리가 필요한 경우에는 과도한 접근 방식이 될 수 있습니다. 반면에, React 포털을 사용한 모달은 URL과 독립적인 상태 관리가 가능하며, 간단한 UI 관리가 필요할 때 효율적인 방법입니다. 프로젝트에서 상황에 맞는 기술을 선택하는 중요성을 깨닫게 되었고, 단순한 UI 관리에는 React 포털, 상태 관리와 라우팅 연동이 중요한 경우에는 내장 모달 라우팅을 사용하는 것이 효과적이라는 점을 알게 되었습니다.