Skip to main content

Command Palette

Search for a command to run...

[Kream 클론 프로젝트] 상품 더보기 기능

Updated

목표

offset/limit parameter를 사용한 상품 더보기 기능 구현


과정

1. 상품 더보기 기능

상품 목록 하단의 더보기 버튼을 누를 때마다 상품을 8개씩 더 로딩해오는 기능을 구현하기위해 예전에 배웠던 query parameter와 offset/limit 개념을 활용했다. offset과 limit을 설정해두면 데이터 요청 후 받아온 결과값에 순서를 부여해서 offset부터 limit까지의 데이터만 보여줄 수 있도록 페이징 처리가 가능해진다. 이렇게 상품 로딩 기능을 구현하는 방식은 크게 두가지로, limit을 고정하고 offset을 조정해서 버튼을 누를 때마다 limit 만큼의 새로운 데이터를 볼 수 있게 하는 방법과 offset을 고정하고 limit을 조정해서 첫 상품부터 limit만큼 추가된 전체 리스트를 보여주는 방법이 있는데, 나는 더보기 기능을 구현해보고 싶어서 후자의 방식으로 코드를 작성했다.

코드🔻

// (...)
const OFFSET = 0;

const ItemList = () => {
  const [limit, setLimit] = useState(8);

  const loadQueryString = `&offset=${OFFSET}&limit=${limit}`;
  const loadMore = () => {
    if (limit > 64) {
      alert('상품이 더 이상 없습니다!');
    } else {
      setLimit(limit + 8);
    }
  };

  useEffect(() => {
// (...)
    fetch(
      `${BASE_URL}products?${categoryString}${priceString}${shoeSizeString}${clothString}&search=${userInput}&sort=${optionValue}${loadQueryString}`,
      {
        method: 'GET',
      }
    )
      .then(res => res.json())
      .then(data => {
        setProductsList(data.product_list);
      });
  }, [
  // (...)
    loadQueryString,
  ]);

// (...)
};
export default ItemList;


결과🔻




2. 페이지 상단 이동 기능
더보기 기능을 구현하고 나니 버튼을 눌렀을 때 상품 목록이 추가되어 Nav bar나 카테고리를 클릭하려면 다시 페이지 상단으로 스크롤해가야하는 번거로움이 생겨버렸다. 간단하게 다시 상단으로 되돌아갈 수 있도록 scroll back to top 버튼을 만들어두고, 사용자의 스크롤을 감지해서 특정 좌표 아래로 커서가 이동되었다면 버튼을 보여주는 기능을 추가했다.

코드🔻

// (...)
const ItemList = () => {
 // (...)
  const [isScrolled, setIsScrolled] = useState(false);

  useEffect(() => {
    window.addEventListener('scroll', () => {
      const isTop = window.scrollY < 500;
      setIsScrolled(!isTop);
    });
  }, []);

  const handleGoToTop = () => {
    window.scrollTo({
      top: 0,
      behavior: 'smooth',
    });
  };

  return (
    <ContentWrapper>
      <Content>
      // (...)
      </Content>
      {isScrolled && <GoToTopBtn onClick={handleGoToTop}>&uArr;</GoToTopBtn>}
    </ContentWrapper>
  );
};
export default ItemList;


결과🔻




회고

지난 프로젝트에서 다뤄보지 못했던 기능들을 구현해보는 것이 목표였던만큼 이번 프로젝트에서는 생소한 개념을 공부하고 적용해야하는 일이 많았다. 내가 잘 모르는 부분을 계속 맞닥뜨리다보니 조급하고 불안한 마음이 들기도 했지만 이제 하나의 웹사이트가 어떻게 구성되어있고 어떤 방식으로 동작하는지 확실히 알게된 것 같아 뿌듯하다. 1차 프로젝트때에 비해 작업 속도도 훨씬 빨라져서 우리가 완성하게될 사이트가 어떤 모습이어야할지 좀 더 고민해보는 시간을 가질 수 있었던 것도 너무 좋았다.
다만 이번 프로젝트에서는 그동안 다뤄보지 못했던 git rebase를 사용해야했고, 상품 리스트 페이지를 다른 팀원분과 같이 작업하다보니 git과 관련해 이것저것 문제가 많이 발생하기도 했는데, 그동안 작업했던 것들을 날려버릴까봐 심장 떨리는 순간이 많았지만 여러 문제를 해결해나가며 git flow에 대해 더 깊이 이해할 수 있게 되어서 지금 생각해보면 오히려 다행이었던 것 같다. 이제 위코드의 커리큘럼을 거의 다 마치고 취업 준비를 앞두고 있는데, 이곳에서 겪었던 모든 시행착오들이 나를 더 당당한 개발자로 만들어 주기를 바란다🥳

More from this blog

[Kream 클론 프로젝트] 상품 검색 & 정렬 기능

목표 상품의 검색과 옵션별 정렬이 가능한 상품 목록 페이지 구현 과정 1. 상품 목록(메인) 페이지 UI 1) Kream이 상품 거래 사이트이다보니 각 상품마다 동일하게 반복되는 양식들이 많았는데, 이 부분들을 전부 컴포넌트로 만들고 재사용함으로써 코드의 길이를 많이 줄일 수 있었다. 특히 2차 프로젝트에서는 styled components를 사용하면서 각 페이지마다 js파일의 코드 양이 두배로 많아지는 바람에 한번 작성하고나면 알아보기가...

Jul 22, 2022

[Lululemon 클론 프로젝트] 장바구니 페이지

목표 상품 추가 / 삭제 / 수량 변경이 가능한 장바구니 페이지 구현 과정 1. 상품 데이터 받아오기 1) 사용자가 장바구니에 넣은 상품들의 목록을 렌더링하기위해 fetch 함수로 서버에서 데이터를 받아온 후 'itemList' 변수에 저장해두었다 . 2) 사용자를 식별한 다음 그에 맞는 데이터를 불러와야하기때문에 request header에 로그인시 발급했던 토큰 인가 과정을 추가했다. 코드🔻 const Bag = () => { co...

Jun 11, 2022

[Lululemon 클론 프로젝트] 로그인/회원가입 페이지

목표 JWT 인증방식을 활용한 로그인/회원가입 페이지 구현 과정 1. 로그인/회원가입 페이지 UI 1) lululemon의 사이트는 로그인 페이지에서 회원가입 버튼 클릭시 양식이 슬라이드로 올라와 한 페이지에서 로그인과 회원가입을 모두 진행할 수 있는 방식으로 되어 있었다. 이를 구현하기 위해 로그인 양식과 회원가입 양식을 각각 컴포넌트로 만든 뒤 'modal' 변수의 상태값이 true인지 false인지에 따라 적절한 컴포넌트가 렌더링될 수 ...

Jun 11, 2022

Rey's Blog

49 posts