Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[jiheon788] 주문 목록 페이지 구현 #9

Merged

Conversation

jiheon788
Copy link
Member

@jiheon788 jiheon788 commented Mar 20, 2023

구현 목록

  • 주어진 데이터를 이용하여 주문 목록 페이지를 구현해주세요
    • 주문 목록 페이지에는 주문에 대한 모든 정보를 표 형태로 확인할 수 있어야 합니다.
    • 주문 목록은 페이지네이션이 구현되어야 합니다(한 페이지에 50건의 주문이 보여야 합니다)
    • 데이터 중에서 오늘의 거래건만 보여지도록 해주세요
      • 여기서 오늘은 “2023-03-08”일을 의미합니다.
  • 서버에 들어온 주문을 5초마다 최신화 해주세요
    • 서버 API는 구현되어 있지 않지만, 구현되어 있다는 가정 하에 요구사항을 충족해주세요
  • Date Picker
  • 기타 통계 수치
    • 총 주문 수
    • 총 금액
    • 페이지 당 처리완료 여부
    • 페이지 당 주문 인덱스 정보 e.g. Showing 51 - 100 out of 267

참고 사항

  • 한가지 기능만 하도록 역할에 따라 컴포넌트 분리 (페이지는 컴포넌트의 조립용), 레이아웃은 Outlet 사용
  • 어드민 페이지의 목적성에 맞게 관리자가 데이터를 파악하기 용이하도록 기타 통계 기능을 추가 구현했습니다.
  • useSetParams, useGetOrderData 두 가지 커스텀 훅을 만들어 반복되는 로직을 재사용하고, 모든 컴포넌트에서 비동기처리 및 상태를 관리합니다.

사용 라이브러리

  • React Query: data fetching 라이브러리, react-query는 서버의 값을 클라이언트에 가져오거나, 캐싱, 값 업데이트, 에러핸들링 등 비동기 과정을 더욱 편하게 하는데 사용됩니다.

  • MSW: MockServiceWorker를 사용하여 Mock 백엔드 API구현 사용 이유는 아래 상세 기재

    • public/mockServiceWorker.js은 msw에서 제공하는 셋업용 보일러플레이트 코드입니다. 사용시 수정할 일이 전혀 없으므로 보지않으셔도 됩니다!!
    • API 사용법은 docs/API.md에 기재

이번 과제에서 가장 깊게 고민해본것은 만약 실제 서비스라면 페이지네이션, 필터링, 소팅을 프론트에서 할것인가 백에서 할것인가였습니다. 이에 대해 조사한 결과는 다음과 같습니다.

  • 실무에서 백엔드 정렬 or 페이지네이션이 노말한 경우입니다.
  • 백엔드 솔루션 장단점
    • 서버의 CPU 비용 증가
    • 선택한 행 수만 서버에서 전송되므로 요청 시간과 데이터가 줄어듭니다.
    • 브라우저는 더 적은 메모리를 필요로 하므로 필터, 매핑, 축소 등과 같은 처리 속도가 더 빠릅니다(한 페이지만 해당)
  • 프론트 솔루션 징단점
    • 서버의 CPU 비용 감소
    • 전체 데이터에 대해 필터, 검색, 매핑, 축소가 가능합니다.
    • 사용자 PC 과부하

조사를 통해 내린 결론은 정답이 아닌 각각 장단점이 존재합니다. 비즈니스 요구 사항을 분석해 어떤 것이 효율적인지 판단해 상황에 맞게 선택을 해야합니다.

이번 과제가 실제 서비스라면 백엔드에서 처리하는것이 효율적이라 생각합니다. 클라이언트에서 과도한 계산을 피하는 것이 좋습니다, 사용자 PC의 성능을 알 수 없기 때문입니다. 또한 클라이언트 솔루션은 소량의 데이터에 적합합니다. 현재 서버 없이 mock_data를 사용하여 데이터가 적다고 생각할 수 있습니다. 하지만 현재만 보는 것이 아니라 이를 실제 서비스 하였을때를 고려해야한다고 생각합니다. 저희 과제는 주문 목록을 보여주는 admin페이지를 구현하고 있습니다. 5초에 한번씩 최신화를 진행해야할 정도로 변화가 빠르고 데이터의 크기 또한 무한정 늘어날 것 입니다.

과제 요구사항 중 5초에 한번씩 최신화가 핵심이라 생각합니다. 5초에 한번씩 전체 데이터를 새로 받은 후 다시 각종 처리를 하는게 효율적이지 않다고 판단했습니다.
과제는 전체데이터를 다 보여주는 것이 아닌 50개의 페이지당 컨텐츠 수가 정해져 있습니다. 즉 필요한 항목만을 서버에서 받아 클라이언트에 과부하를 주지 않을 수 있습니다.

결론

위의 이유로 실제 서비스라면 백엔드에서 처리하게 될 것을 가정하고 구현하였습니다. 프론트엔드는 필요한 것을 말하고 백엔드는 적용합니다.

참고 자료

Sample

새 비디오 만들기 (1)

- ui library: chakra ui
- fetch library: react-query
- set mock data
- chakra provider
- query client
- api client
- router setting
- 실 백엔드 API와 같은 환경으로 구현하기 위하여 가상 API server 구현
- 요구사항을 잘못이해하여 오늘의 날짜만 부른다고 판단하였음
- 요구사항 맞춰서 오늘의 주문보기, 전체보기로 분리
- 총 currency
- 총 주문 수
- 현재 페이지 주문 index
- 반복되는 로직 줄이기 위함
@jiheon788 jiheon788 self-assigned this Mar 20, 2023
@jiheon788 jiheon788 added the Type: Enhancement New feature or request label Mar 20, 2023
@bokjunwoo
Copy link
Contributor

지헌님 항상 과제에 대한 생각을 적어주셔서 좀 더 빠른 이해가 됩니다👍 저도 클라이언트에 과부화을 생각해 백엔드에서 처리해야 한다고 생각하고 mock데이터를 가공해서 클라이언트에 제공하는데 MSW 라이브러리를 사용해 가상의 REST API를 할 수 있는 부분을 배웠습니다.

Copy link
Collaborator

@jhoon9494 jhoon9494 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다!
페이지네이션 처리에 대한 분석과 mocking api를 이용하여 적절히 구현한 부분 잘 봤습니다!!
항상 과제에 대한 분석을 꼼꼼하게 하고 진행하시는 부분 배워야하는데 쉽지않네요 ㅠ

Copy link
Contributor

@Noeyso Noeyso left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지헌님 고생하셨습니다! 작성하신 문서 보니까 프로젝트에 대해 진심으로 고민하신게 느껴져요. 프론트엔드에서 어디까지 데이터를 처리하는 것이 효율적인지에 대해 저도 다시 한번 생각해보게되네요.
관심사 분리와 네이밍을 적절하게 잘하신 것 같아요. 이번에도 많이 배우고 갑니다.👍

@raw20
Copy link

raw20 commented Mar 20, 2023

지헌님 고생많으셨습니다!!
저도 마찬가지로 5초에 한번씩 최신화가 핵심이라고 생각했는데 과부화없이 효율적으로 데이터를 받아오는 과정이 쉽지 않더군요 ㅠㅠ

Copy link
Contributor

@tnghgks tnghgks left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정말 깔끔하고 정돈된 코드인 것 같습니다.
항상 정확한 근거를 적어주셔서 리뷰하는 입장에서도 너무 편하고 배워가는게 많은것 같습니다.
고생하셨습니다! 지헌님!👍

placeholder="Select Date and Time"
size="lg"
bg="white"
type="date"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DatePicker를 통해서 날짜를 선택할 수 있는것이 사용자에게 좀더 좋은 경험이 될 수 있어서 좋은것 같습니다.

import useGetOrderData from '@/lib/hooks/useGetOrderData';
import useSetParams from '@/lib/hooks/useSetParams';

const StatsArea = () => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테이블의 종합 정보를 분리해서 깔끔하게 잘 보여주시는것 같습니다! 👍

return { startDate, endDate };
};

export const generateZeroToNArr = (n: number) => Array.from(Array(n).keys());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fill을 안쓰고 이렇게 빈 배열을 만들 수도 있군요 좋은걸 배워갑니다.

@jhoon9494 jhoon9494 merged commit bcc1bb4 into Wanted-PreOnboarding-Team-8:develop Mar 20, 2023
@jhoon9494 jhoon9494 mentioned this pull request Mar 20, 2023
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Type: Enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants