Skip to content

[Project] 여러분들의 크고 작은 다양한 고민을 접을 수 있도록 도와주는 고민접기 입니다.

Notifications You must be signed in to change notification settings

gomin-solution/Frontend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

image (2)

📃 고민접기, 당신의 고민을 접어드립니다.

thumbnail-01

오늘 뭐 먹지…?” “이럴 땐 어떻게 해야 하는 걸까…”
너무 사소하거나 너무 무거워서 남들에게 쉽게 꺼낼 수 없었던 고민이 있으신가요?
저희 고민접기는 여러분들의 크고 작은 다양한 고민을 접을 수 있도록 도와주는 커뮤니티입니다.

📱 고민접기 링크
📎 Backend


💡 주요 기능


매일 색다른 행운의 편지열기 골라주기 작성 후 투표 답해주기 작성 및 의견받기
유저와 1:1 쪽지하기 미션 완료 후 종이접기 획득하기 미션 완료에 따른 등급 상승

+) 검색 기능, 알림 기능 도입

🛠️ 프로젝트 아키텍처

image



⚙️ 기술 스택

Frontend






🔩 기술 스택 & 라이브러리 사용 이유

React-Query

  • 친숙한 React Hook을 사용 : 복잡하고 장황한 코드가 필요한 다른 데이터 불러오기 방식과 달리 React Component 내부에서 간단하고 직관적으로 API를 사용할 수 있습니다.
  • 서버 상태 관리와 관련된 반복적인 작업들을 쉽게 처리 : 서버에서 받아오는 데이터를 처리할때 useEffect로 해결해야 했던 여러 가지 상황들을 refetchOnMount, refetchOnReconnect, refetchOnWindowFocus와 같은 옵션으로 쉽게 처리할 수 있습니다.
  • Infinite scroll : 서비스 특성상 모바일 환경에 최적화되어 있기 때문에 무한스크롤을 도입하는 것이 필수라고 생각했습니다. 데이터를 한 번에 받아오지 않고 10개 항목씩 받아오기 때문에 렌더링 시간을 많이 단축할 수 있었습니다.
  • Optimistic update UI (낙관적 업데이트) : ‘고민접기’의 ‘골라주기’ 탭에서 항목 선택 시 투표 결과를 보여주도록 구현이 되어 있습니다. 처음 서비스 개발 당시엔 데이터를 받아온 후 리렌더링 되어 유저가 결과를 볼 수 있도록 되어 있어서 즉각적인 결과를 보길 원하는 유저는 불편함을 느꼈습니다. 이를 개선하기 위해 react-query에 낙관적 업데이트를 적용하여 데이터가 정상적으로 받아올 것이란 걸 예상하여 반영하는 로직을 추가할 수 있었습니다.

socket.io-client

  • 유저 간에 1:1 실시간 대화 기능 구현 : webSocket은 브라우저 별로 지원하는 버전이 다르고 지원하지 않는 브라우저도 있습니다. Soket.io는 webSocket 보다는 무겁지만 socket통신을 지원하지 않는 브라우저도 Websocket 방식을 이용해 통신할 수 있게 하고 연결 실패시 자동으로 재연결 시도를 해주는 등 연결 신뢰성이 높고 더 다양한 기능을 제공하기 때문에 socket.io를 사용하게 되었습니다.

styled-compoenents

  • 조건부 스타일링 : 투표가 진행중인지, 마감인지에 따라 스타일링을 다르게 해야 했습니다. 이때 컴포넌트 내부에서 css를 작성할 수 있으므로 props를 통해 손 쉽게 조건부 스타일링이 가능합니다. 또한 자주 사용하는 테마 css 설정 값을 props로 받을 수 있어 코드가 절약 됩니다.
  • 전역 스타일 : css reset을 선언하여 브라우저마다 공통적인 스타일링을 줄 수 있습니다. 또한 모바일 반응형을 위한 미디어쿼리, 폰트, 엘리먼트 스타일 등을 전역적으로 쓰기 간편합니다.

PWA

  • 서비스를 모바일환경에 최적화 하기 위해 도입하였습니다. 서버로부터 받아오는 데이터 외의 데이터를 캐싱하고 있기 때문에 속도가 개선되며, 일반 앱처럼 앱아이콘이 생기므로 접근성을 향상시킬 수 있습니다.

FCM

  • 실시간 알림 기능 구현 : 유저의 게시물에 댓글이 달리거나 유저가 쪽지를 받았을 때처럼 유저에게 즉각적으로 알려주는 기술이 추가되면 사용자경험이 향상될 것이라고 생각했습니다. FCM을 사용하면 백그라운드뿐만 아니라 포그라운드 환경에서도 알림을 받을 수 있습니다.
  • 리소스 절약 : 서버를 경유해서 실시간으로 알람을 받으려면 사용자는 항상 서버에 접속해 있어야 해서 사용자 기기의 배터리 및 네트워크 리소스를 크게 낭비하지만, FCM의 경우 FCM서버가 중간에 연결되어 있기 때문에 사용자는 배터리 소모를 줄이고 네트워크의 사용만으로도 메세지를 실시간으로 송수신 처리를 할 수 있습니다.

⚠️ 기술적 도전 및 트러블 슈팅

즉각적인 반응 처리로 사용자 경험 증대(optimistic update UI)

구분 내용
문제상황 변경사항을 즉각적으로 유저에게 보여주지 못함
요구사항 골라주기 항목 선택, 북마크, 좋아요 기능은 유저가 클릭 시 변경사항을 즉각적으로 보여줘야 함
의사결정 React-query의 onMutate, onError, onSettled 옵션을 사용하여 조건에 따른 낙관적 업데이트 적용
근거 데이터 통신이 성공할 것을 예상하여 미리 반영 가능 실패 시 원래의 값으로 돌릴 수 있음

알림 기능 도입(Firebase Cloud Messaging)

구분 내용
요구사항 유저의 편의성을 위한 알림기능 구현
선택지 socket.io, FCM
의사결정 FCM
근거 socket.io는 백그라운드에서 알림을 보낼 수 없으므로
FCM 의 onBackgroundMessage, onMessage를 사용하여 백그라운드 환경에서도 알림 기능 구현

리워드 페이지 응답 개선

구분 내용
문제상황 리워드 페이지 조회 시 서버 데이터 응답시간이 평균 2초대 소요
유저활동 기록이 많아질수록 응답시간 또한 길어짐
요구사항 DB에 유저활동 기록 테이블을 추가하여 활동 기록에 변경을 주는 요청마다
유저활동 기록을 가져오는 정보의 속도 개선
의사결정 활동 기록을 업데이트 하는 형태로 변경
근거 유저활동을 따로 기록하여 저장하고 리워드 조회 시 불필요한 조인을 최소화하여
데이터를 받아오는 속도가 약 90% 개선됨

‼️ 유저 피드백 개선

총 피드백 78개 중, 유효 피드백 58개, 반영 피드백 48개

  • 인트로 페이지 이미지 리사이징 및 서버인증 미들웨어 개선을 통한 서비스 속도 향상
  • Intro에서 슬라이드 버튼과 스킵 버튼을 추가하여 편의성을 증대
  • 골라주기 항목 타이틀의 가독성을 높이고 본인이 선택한 항목 표기
  • 받아올 데이터가 없어서 빈 화면일 때 단순 텍스트가 아닌 이미지를 넣어서 완성도 향상

📌 유저 피드백 정리


📸 고민 접기의 팀원

🍀홍정표 정도은 🍀이승표 이준 손민성 이현서
스크린샷 2022-12-16 오후 1 58 16 스크린샷 2022-12-16 오후 1 58 20 스크린샷 2022-12-16 오후 1 58 26 스크린샷 2022-12-16 오후 1 56 58 스크린샷 2022-12-16 오후 1 58 12 스크린샷 2022-12-16 오후 2 08 05
FE FE BE BE BE DE

About

[Project] 여러분들의 크고 작은 다양한 고민을 접을 수 있도록 도와주는 고민접기 입니다.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •