Skip to content

프론트엔드 기초 프로젝트 - 익명 질문 공유 서비스 오픈 마인드

Notifications You must be signed in to change notification settings

co-react/openMind

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

image

✨프로젝트 소개

👨‍💻 Members

Codeit FE Sprint 4기 - 1팀

멤버 소개👀



김동현

김영은

노은수

🐶박기범

개별 역할☝️
  • 김동현
    • 컴포넌트 : FeedCard, Modal(Question, Answer), Skeleton
    • 페이지 : AnswerPage (CardPage의 조건부 랜더링으로 구현)
    • git flow 초기 설정, 레포지토리 관리
    • 무중단 배포 및 도메인 연결
    • 다크모드
  • 김영은
    • 컴포넌트: buttons,input
    • 페이지 : MainPage
    • 에러 객체
    • 로컬 스토리지 객체 선언 및 관리
    • svg 파일 전역으로 관리
    • global style
    • constant 전역으로 관리
  • 노은수
    • 컴포넌트 : floatingButton, dropdown, reactions(좋아요, 싫어요), toast, avator
    • 페이지 : CardPage
    • date utils 함수
    • 커스텀 훅 : 무한 스크롤, mutation(api 최신 업데이트), Query
    • facebook, 카카오 공유 기능
    • api 연결 리팩토링 → react Query 적용
    • 라우터 연결
    • 컴포넌트 성능 개선
  • 박기범
    • 컴포넌트 : Badge, Pagination, User card
    • 페이지 : ListPage
    • 버튼 컴포넌트 css 수정
    • 추가 모달 구현
    • 페이지네이션 기능 개선
    • 메타태그 수정

🎞 Duration

2024.02.26(월) ~ 03.12(화)

☀️ Project Topic

질문과 답변을 통해 의미 있는 대화를 할 수 있는 독특한 커뮤니케이션 플랫폼

💻 Site

https://www.openmind-coreact.store/

🛠️ Skills & Tools

React JavaScript Figma NPM NodeJS GitHub Visual Studio Code

📚 Library

Styled Components React Router React Query ESLint

💬 Community

Jira Discord

🚢 Deploy

Vercel


✨로컬 환경 - 설치 및 실행 가이드

1. Getting the sources

git clone https://github.com/co-react/openMind.git
cd openMind

2. Install packages

npm install

3. Run development server

npm run start


✨ Feature

1. 메인 페이지 (컴포넌트 명: pages/Main.jsx)

  • 이름을 입력해서 질문을 받을 수 있는 피드 생성
  • 질문을 위한 질문 목록 페이지로 이동

2. 질문 목록 페이지 (컴포넌트 명: pages/ListPage.jsx)

  • 생성된 피드들을 카드 형태로 페이지별로 표시
  • 피드들을 ‘이름순’ , ’최신순’ 기준으로 선택해서 정렬
  • 원하는 피드를 선택하여 질문 피드 페이지로 이동
  • 질문할 피드를 랜덤으로 골라주는 랜덤선택 기능

3. 질문 피드 페이지 (컴포넌트 명: pages/CardPage.jsx)

  • 질문 생성
  • 질문에 대한 답변 여부, 답변 표시
  • 질문에 대한 좋아요, 싫어요 버튼, 수치 표시
  • 링크 복사, 카카오, 페이스북 공유
  • 무한 스크롤 방식

4. 답변 페이지 (컴포넌트 명: pages/CardPage.jsx)

  • 피드 삭제
  • 답변하기 및 수정하기
  • 개별 질문 삭제하기
  • 답변 거절하기
  • 질문에 대한 좋아요, 싫어요 버튼, 수치 표시
  • 링크 복사, 카카오, 페이스북 공유
  • 무한 스크롤 방식


✨ Project Architecture

🔁 User Flow

UserFlow

💡 Git branch strategy : Git flow

프레젠테이션2

Domain flow

https://whispering-sassafras-4ac.notion.site/3e52bc153e4d4955962d907802f163ae?pvs=4



✨ Problem & solution

개발 환경 및 협업 관련

⚠️ pr에 대한 초기 셋팅의 미흡

✅ develop에서 메인 브랜치로 바로 pr을 진행해, 하나의 pr에 너무 많은 커밋이 누적.

해결 방안
  • feature 단위로 pr 단위를 나눔.
  • 다만, 초반부터 적용하지 않아 커밋, pr을 유연하게 적용하기 어려움

⚠️ 대 소문자 폴더, 파일명 변경 시, git 충돌 에러

✅ git config core.ignorecase false를 적용하지 않고, push 했을 때, 다른 팀원들에게 문제가 발생. ✅ 로컬환경에서 develop 브랜치에서 pull 했을 때, feature 브랜치로 이동하지 못하는 현상.

해결 방안
  • 먼저 git 설정 점검.
  • 원격 저장소에 대, 소문자 2개로 누적된 파일, 폴더는 삭제
  • 만약, 개인 feature 브랜치로 이동이 어려운 경우 : 파일을 삭제 후, 이동 -> 이동 후 git flow finish -> 다시 pull

기능 구현 요소 관련

⚠️ 화면 사이즈마다 페이지 수를 동적으로 변경하는 문제

✅ ListPage에서 화면 사이즈마다 화면상에 보이는 카드 수가 다름.

해결 방안
  • 원래는 8개를 고정으로 limit값을 지정해주었는데 사이즈 별로 동적으로 limit를 지정.
  • limit값이 변함에 따라 전체 페이지 수도 계산해주었고 이를 테블릿 → PC / PC → 테블릿 사이즈로 변경할때 동적으로 페이지 수가 바뀌도록 해주어야하는데 구현하는데 어려움을 겪음.
  • 조금 더 효율적인 방법이 있을지 고민.

⚠️ 상태 관리에 대한 문제

✅ props의 단방향성으로 인해(부모 -> 자식), 생기는 문제

  • 만약 A 컴포넌트에서 상태를 정의하고, A의 자식 컴포넌트인 B 컴토넌트에서 A의 상태를 변경해야 할 때, 문제가 발생한다.
  • 상태를 변경할 수 있는 setter 함수 혹은 setter를 포함하는 핸들러 함수를 props로 전달해 상태를 바꿀 수 있다. 이를 drilling이라고 한다.

✅ setter 함수를 넘기는 문제

  • 만약 컴포넌트 트리가 깊어지면 어떨까?

    • 실제 동작을 수행하는 “아래 트리의 컴포넌트”뿐 만 아니라, 해당 컴포넌트를 건너기 위한 중간 컴포넌트들이 “모두” setter 함수를 접근할 권한을 얻게 된다.
    • 또한, 그저 전달을 위한 props를 연쇄적으로 정의하게 되어 번거로움을 유발한다.
  • 결정적으로, props로 함수를 전달할 경우, 컴포넌트 렌더링 과정에서 함수가 새로이 정의된다. props가 변경되었다고 인식하여, 실제 변화가 없더라도 함수 props를 전달 받은 컴포넌트는 "무조건" 리렌더링이 발생한다.

    • 이를 방지 하기위해 useCallback을 감싸야하는 번거로움이 발생한다.
  • 예상 해결 방안: 전역 상태 도입, 전역 상태 라이브러리인 "Redux" 도입


⚠️ 서버로 받은 데이터 관리 문제

✅ Post 요청 후에 상태 관리 문제

  • useEffect를 통해 서버에서 데이터를 받을 경우 : 보통 서버에서 받은 데이터를 useState로 관리할 것이다.
    • 만약, 다른 컴포넌트에서 post를 보내면? → 데이터를 받았던 컴포넌트의 상태는 “상한(오래된) 상태”가 된다.
    • 이를 해결하기 위해, post를 보냈다는 "또 다른 상태"를 컴포넌트 안에서 선언해, get을 요청하는 컴포넌트에 알려야 한다.
    • 이는 "전역 상태" 문제와 동일한 문제를 발생시킨다.

✅ Post 요청의 높은 자유도

  • 서버 요청은 컴포넌트, 페이지의 제한 없이 다양한 곳에서 호출이 가능하다. 따라서, 이를 컴포넌트 내부 상태로 관리하려고 하면, 최신 상태를 업데이트 하기 위해, 많은 settter를 props로 전달해야 한다.

✅ 카드 생성 시, 중복 검증을 위해, GET 요청을 반복적으로 하는 문제

  • 서버에 존재하는 사용자 이름을 중복되지 않도록 하기 위해 GET 요청, 이때, 중복된 경우, 다음 중복 검사에서 다시 요청. -> 매우 느림
  • 만약, 2명의 사용자가 동일한 이름(ex:오스틴)을 요청한 경우: GET 요청을 통해 저장한 내부 상태는 "오스틴"이 없는 상태 -> 2명이 동시에 요청 -> 한 명이 POST 성공하더라도, GET 요청을 다시 하지 않으면, 내부 상태는 여전히 "오스틴"이 없는 상태 -> 결국, 2명 다 "오스틴" 이름을 가지게 됨.
해결 방안

✅ React-Query의 도입

  • server state 정의 : 서버 요청의 높은 자유도를 관리하기 위해, 컴포넌트 내부의 상태가 아닌, 컴포넌트 외부, 즉 "server state"를 도입.
  • 데이터 캐시 : 서버 요청을 최소화하기 위해, 클라이언트의 자원을 활용. 서버로부터 받은 데이터를 캐싱(일종의 메모이제이션). -> 이를 통해, 중복 검사 시, 서버 재요청의 문제 해결
  • Mutation : React-Query는 useMutation 훅으로, 캐시를 통해 관리되는 server state는 post 요청에 대한 후속 처리를 지원. -> 같은 쿼리키를 가지는 쿼리에 post 요청 -> 서버측 데이터로 post 보내는 것 뿐만 아니라, 쿼리 데이터(캐시에 저장된 데이터)도 갱신. -> useQuery를 통해 서버 데이터를 요청하는 쪽으로 데이터가 변경되었다는 것을 자동으로 알려서 새로운 데이터를 보냄.

🙏QnA

About

프론트엔드 기초 프로젝트 - 익명 질문 공유 서비스 오픈 마인드

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •