하루 메이트
하루 메이트

하루 메이트

Tags
React
TypeScript
React-Query
Redux-Toolkit
styled-components
Published
June 29, 2023
Author
notion image

📢 프로젝트 개요


[기간]
2023.06.29 ~ 2023.07.26
 
[팀 구성]
FE 3명, BE 3명
 
[소개]
하루메이트는 하루 일정을 만들고 친구에게 손쉽게 공유할 수 있는 서비스입니다.
여행을 가는 것 보단 친구와 저녁에 잠깐 만나기, 주말 중 하루 데이트하기 등의 하루를 즐기는 일정이 더 많다고 생각했고, 그럼 하루 일정을 관리하고 공유할 수 있는 서비스가 있다면 어떨까? 라는 생각에서 출발한 서비스입니다.
 

📎 배포 및 회고 링크


 

🧐 맡은 역할


프로젝트 부팀장으로서 공통 문서를 관리하고 원활한 커뮤니케이션을 이끌었습니다.
프론트엔드 팀장으로서 프론트엔드 팀의 일정을 관리하고 규칙을 정해서 개발에 몰두할 수 있도록 했고, 배포를 담당했습니다.
 

📦 기술 스택


TypeScript React Redux React-Query styled-components
 

📌 구현한 부분


📄 일정 등록 페이지

카테고리 검색 / 직접 검색

notion image
구현 기능
  • 카카오 맵 API를 활용하여 카테고리 검색 및 직접 검색
  • geolocation API를 활용한 현재 위치 적용
 
 

장소 마커 및 동선 확인

notion image
 

추가된 장소 순서 변경 및 삭제

구현 기능
  • 추가한 장소 위치에 마커 추가
  • 장소가 여러 곳일 경우 마커들을 선으로 연결해서 동선 생성
 
notion image
 
구현 기능
  • 드래그 앤 드롭을 활용한 순서 변경
  • 추가된 장소 삭제
 
 

⚙️ 일정 저장 기능

notion image
 
구현 기능
  • 썸네일 선택
  • 달력을 활용한 날짜 선택
  • 유효성 검사를 적용한 제목과 내용 작성
  • 일정 저장
 

⚙️ 일정 수정 기능

notion image
구현 기능
  • 일정 등록 페이지를 재사용
  • 일정 수정
 

🦋 반응형 디자인 (모바일 환경)

notion image
notion image
구현 기능
  • 하단 바를 터치하면 열리고 닫히는 UI 구현
  • 모바일 환경에 맞게 재배치
 

🔍 개발 내용


전체

  • props가 여러 번 전달될 것 같은 경우, RTK를 사용하여 전역으로 상태를 관리하여 props-drilling을 예방했습니다.
  • TypeScript를 적용하여 코드 작성 단계에서 발생할 수 있는 에러를 방지했고, 코드 자동 완성 기능을 활용하여 개발 생산성을 증가시켰습니다.
  • 복잡한 서버 관련 코드를 명확한 React Query 로직으로 대체하여 코드의 가독성을 증가시키고 예측하기 힘든 사이드 이펙트를 예방했습니다.

최적의 사용자 경험 제공

  • React.lazy, Dynamic Import, Suspense를 활용해 코드 분할을 했고, 이로 인해 초기 로딩 속도를 최대 50% 감소시켰습니다.
  • Suspense의 fallback 기능을 활용하여 로딩할 때마다 흰 화면 대신 로딩 페이지를 표시하여 사용자의 이탈률을 감소시켰습니다.
  • media query를 활용하여 웹, 태블릿, 모바일 환경에 맞는 반응형 웹을 제공했습니다.
  • React Profiler를 사용하여 렌더링 횟수가 많은 컴포넌트들 찾아서, state를 ref로 전환, useMemo 또는 useCallback hook을 활용하여 렌더링 횟수를 감소시켰습니다.

일정 등록

등록된 장소의 순서 변경에서는 react-beautiful-dnd 라이브러리를 활용하여 Drag & Drop으로 변경할 수 있도록 하여 사용자가 조금 더 편하게 사용할 수 있게 했습니다.

일정 수정

일정 수정 페이지와 일정 등록 페이지는 수정과 등록이라는 텍스트만 다르고 나머지는 같게 설계했습니다. 따라서 두 가지 페이지를 각각 만드는 것은 굳이 라고 생각했기에 일정 등록 페이지를 재사용하려고 생각했습니다.
수정 버튼을 클릭했다면 쿼리 파리미터로 modify와 courseId를 넘겨줬고, 일정 등록 페이지 컴포넌트에서 useLoaction과 URLSearchParams를 활용하여 modify 값을 활용한 조건부 렌더링으로 등록과 수정을 다르게 표시했습니다.
또한 useQuery의 enabled 옵션에 쿼리 파라미터로 받았던 modify를 전달해 modify가 true일 때만 일정 데이터를 가져올 수 있도록 했습니다.

트러블 슈팅