프론트엔드 개발 포트폴리오 | 프로젝트 정리 공유 서비스
내일배움캠프 4기 웹 개발 과정 React 트랙 수료생 최종 프로젝트 'Codefolio'를 소개합니다.
Aug 16, 2023
⭐️부트캠프 프로젝트를 한곳에서 정리하고 피드백을 받아보자!
프로젝트의 SA, 최종 프로젝트 정리 및 회고 등 여러곳에 흩어져 있던 정보들을 한 곳에 모아놓고,
다양한 사람들의 피드백을 받아 볼 수 있는 공간입니다.
- CodeFolio Demo
🛠️ Service Architecture
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252F75db8f33-edde-41f3-a712-77b492c17f86%252Fcodefolio-cloudcraft.png%3Ftable%3Dblock%26id%3D02230325-318a-4cdc-9213-c628ed1a6df9%26cache%3Dv2&w=3840&q=75)
📂 Tech Stack
정적인 페이지가 많은 서비스 특성상 SSR을 쉽게 구현할 수 있는 Next.js를 사용합니다.
Next와 잘 어울리는 배포 시스템인 Vercel을 이용합니다.
빠른 백엔드 구축을 위해 BaaS 서비스인 Supabase를 사용합니다.
로컬 상태관리를 위해 react스러운 상태관리를 제공하는 recoil을 사용합니다.
서버 상태관리를 위해 각종 편리한 유틸을 제공해 주는 react-query를 사용합니다.
CSS in JS를 사용하기 위해 styled-components를 사용합니다.
✅ 핵심 기능
포트폴리오 게시 기능 (md editor 지원)
포트폴리오 댓글 및 칭찬뱃지 기능
⚠️ 트러블 슈팅
디테일 모달 로딩속도 및 사용자 경험 개선
초기버전에서 디테일 모달을 불러올 때 약 1.6초정도의 로딩시간이 소요되었습니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252Fced46c8f-b524-4786-b37b-9eb41b1e614b%252F03.%2525E1%252584%252580%2525E1%252585%2525A2%2525E1%252584%252589%2525E1%252585%2525A5%2525E1%252586%2525AB%2525E1%252584%25258C%2525E1%252585%2525A5%2525E1%252586%2525AB%2525E1%252584%252585%2525E1%252585%2525A9%2525E1%252584%252583%2525E1%252585%2525B5%2525E1%252586%2525BC.gif%3Ftable%3Dblock%26id%3Da8907861-58d1-4cf0-8de0-82ba0701504e%26cache%3Dv2&w=3840&q=75)
기존 현상에서 아래의 문제점들을 생각 해 보았는데요
- 로딩 시간 동안 데이터가 들어오지 않아 UI적으로 보기 좋지 않음
- 데이터가 들어오며 레이아웃이 변경되면서 일어나는 레이아웃 시프트
- 각종 데이터들을 한곳에서 처리하지 않고, 각각의 컴포넌트가 따로 처리하며 데이터가 한번에 로딩되어지지 않음
그래서 저희는 아래와 같이 리팩토링 했습니다.
- 로딩 시간동안 로딩 스피너를 보여줌
- 각종 컴포넌트들이 따로 불러오던 데이터를 가장 상위의 컴포넌트에서 한번에 패칭해 온 후 전체 컴포넌트에 뿌려줌
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252F14ace1b1-ac51-4694-b60a-aab11087d034%252F04.%2525E1%252584%252580%2525E1%252585%2525A2%2525E1%252584%252589%2525E1%252585%2525A5%2525E1%252586%2525AB%2525E1%252584%252592%2525E1%252585%2525AE%2525E1%252584%252585%2525E1%252585%2525A9%2525E1%252584%252583%2525E1%252585%2525B5%2525E1%252586%2525BC.gif%3Ftable%3Dblock%26id%3D6d584afc-30b8-4379-b828-b78c7976e733%26cache%3Dv2&w=3840&q=75)
리팩토링 후 페이지에 데이터가 모두 불러오질 때 까지의 시간은 총 0.6초가 소요되었고 기존과 비교해서 약 60%의 성능 개선 효과를 볼 수 있었습니다.
좋아요, 북마크 Optimistic update
서버 state를 local에서 관리하고 있지 않아, 기존의 좋아요, 북마크 기능은 사용자 인터렉션 → 서버 POST 요청 → refetch → 화면 변화의 순으로 진행되었는데, 약 1200ms정도의 레이턴시가 있었습니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252Fcf672689-57a7-44c4-8653-0228790b27e4%252F10.%2525E1%252584%252580%2525E1%252585%2525A2%2525E1%252584%252589%2525E1%252585%2525A5%2525E1%252586%2525AB%2525E1%252584%25258C%2525E1%252585%2525A5%2525E1%252586%2525AB%2525E1%252584%25258C%2525E1%252585%2525A9%2525E1%252587%252582%2525E1%252584%25258B%2525E1%252585%2525A1%2525E1%252584%25258B%2525E1%252585%2525AD.gif%3Ftable%3Dblock%26id%3D038a387f-36d4-46d0-8d4c-e4c0e72441f8%26cache%3Dv2&w=1200&q=75)
개선 전 좋아요
좋아요의 인터렉션이 늦게 반응하는 것이 UX적으로 좋지 못하다는 생각이 들어, react-query의 Optimistic update를 적용하기로 하였고, 적용 결과 약 400ms정도 후 컴포넌트가 반응하였습니다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252F44ae4e0c-9723-42d5-abbe-b35cbcd33054%252F09.%2525E1%252584%252580%2525E1%252585%2525A2%2525E1%252584%252589%2525E1%252585%2525A5%2525E1%252586%2525AB%2525E1%252584%252592%2525E1%252585%2525AE%2525E1%252584%25258C%2525E1%252585%2525A9%2525E1%252587%252582%2525E1%252584%25258B%2525E1%252585%2525A1%2525E1%252584%25258B%2525E1%252585%2525AD.gif%3Ftable%3Dblock%26id%3D228a0df5-fdce-4c78-a587-2e0db7148236%26cache%3Dv2&w=1200&q=75)
개선 후 좋아요
좋아요, 북마크, 뱃지기능 throttle 적용
유져가 인터렉션을 발생시킬 때, 실수 또는 고의로 여러번 반복해서 이벤트를 발생시킬 경우 서버와의 통신이 기하급수적으로 늘어날 수 있습니다. 이 부분을 미연에 방지하고자 lodash에서 제공해주는 throttle 기능을 활용 해 500ms내의 이벤트는 최초의 이벤트를 제외하고는 무시할 수 있도록 구성하였습니다.
AS-IS
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252F6e8d0b42-4a49-4599-8edb-bd1c1122ce5c%252F11.Throttle%2525E1%252584%25258C%2525E1%252585%2525A5%2525E1%252586%2525A8%2525E1%252584%25258B%2525E1%252585%2525AD%2525E1%252586%2525BC%2525E1%252584%25258C%2525E1%252585%2525A5%2525E1%252586%2525AB%2525E1%252584%252587%2525E1%252585%2525AE%2525E1%252586%2525A8%2525E1%252584%252586%2525E1%252585%2525A1%2525E1%252584%25258F%2525E1%252585%2525B3.gif%3Ftable%3Dblock%26id%3D5bf5955e-eb49-44ad-8157-9b8c8c69f6aa%26cache%3Dv2&w=3840&q=75)
TO-BE
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fs3-us-west-2.amazonaws.com%252Fsecure.notion-static.com%252Fbeb3e961-3e53-49b1-aa88-653541eba7a5%252F12.Throttle%2525E1%252584%25258C%2525E1%252585%2525A5%2525E1%252586%2525A8%2525E1%252584%25258B%2525E1%252585%2525AD%2525E1%252586%2525BC%2525E1%252584%252592%2525E1%252585%2525AE%2525E1%252584%252587%2525E1%252585%2525AE%2525E1%252586%2525A8%2525E1%252584%252586%2525E1%252585%2525A1%2525E1%252584%25258F%2525E1%252585%2525B3.gif%3Ftable%3Dblock%26id%3D73a1fff4-8ee2-4f29-82ef-28bde567cf83%26cache%3Dv2&w=3840&q=75)
Share article
Subscribe to our newsletter