[8팀 현지수] Chapter 1-1. 프레임워크 없이 SPA 만들기 - #51
Conversation
- URL 파라미터명을 current에서 page로 변경하여 API와 일치 - limit 변경 시 page를 1로 리셋하는 로직 추가 - select 요소의 현재 값을 URL 파라미터와 동기화 - 상품 재로딩 시 로딩 상태 표시 및 렌더링 처리 - popstate 이벤트로 브라우저 뒤로가기/앞으로가기 지원
- 상품 로딩, 상품 설정, 카테고리 설정 액션 정의
- 로딩, 상품, 카테고리 상태 변경 로직 분리
- 상태 변경 시 자동 렌더링 및 이벤트 재등록 구조 적용
- SET_LOADING_MORE, APPEND_PRODUCTS 액션 타입 추가 - setLoadingMore, appendProducts 액션 생성자 함수 구현
- 페이지네이션 정보 관리 (currentPage, hasNext)
- loadMoreProducts 함수 추가 - 중복 로딩 방지 로직 (isLoadingMore, hasNext, loading 체크)
- InfiniteScrollLoader 컴포넌트 추가 - 센티넬 요소 (#scroll-sentinel) 생성
- registerInfiniteScroll 함수 추가 - IntersectionObserver 설정 (rootMargin: 200px, threshold: 0.01) - 센티넬 요소 감지 시 loadMoreProducts 호출
| export const ACTION_TYPES = { | ||
| SET_LOADING: "SET_LOADING", | ||
| SET_PRODUCTS: "SET_PRODUCTS", | ||
| SET_LOADING_MORE: "SET_LOADING_MORE", | ||
| APPEND_PRODUCTS: "APPEND_PRODUCTS", | ||
| SET_CATEGORIES: "SET_CATEGORIES", | ||
| SET_ROUTE: "SET_ROUTE", | ||
| SET_PRODUCT_DETAIL: "SET_PRODUCT_DETAIL", | ||
| SET_PRODUCT_DETAIL_LOADING: "SET_PRODUCT_DETAIL_LOADING", | ||
| ADD_TO_CART: "ADD_TO_CART", | ||
| REMOVE_FROM_CART: "REMOVE_FROM_CART", | ||
| CLEAR_CART: "CLEAR_CART", | ||
| }; | ||
|
|
There was a problem hiding this comment.
와 지수님 이렇게 액션 만들어서 쓰는거 짱인거같아요
unseoJang
left a comment
There was a problem hiding this comment.
지수님!!시간 없으셧을 텐데 과제하시느라 너무 수고 많으셨습니다.
코드가 전체적으로 1년차 답지 않게 React, Redux 기반의 설계에 잘 따라서 코드가 구성되어 있네요,
나머지 과제들을 진행한다면 지금보다 훨씬 더 발전한 지수님 모습이 기대가 될것 같아요.
분명 과제 끝까지 하셨다면 충분히 BP받고도 남을 수준의 과제였던 것 같습니다.
구조도 탄탄하고 네이밍이 특히 잘 구성되어있어서 남들이 보기에도 명확한 기능을 갖고 있는 코드라는 것을 알수 있었습니다.
다음 과제에선 과제 완성해서 BP노려보도록 합시다.
너무 수고하셨습니다.
| observe(element) { | ||
| this.elements.add(element); | ||
| // 테스트용으로 observer를 전역에서 접근 가능하게 설정 | ||
| window.testIntersectionObserver = this; |
There was a problem hiding this comment.
운서님 꼼꼼한 코드리뷰 감사합니다 😇
피드백 주신 부분들 반영해서 더 개선해보겠습니다!
There was a problem hiding this comment.
아직 미완성인 부분이 있네요, 코드 자체는 모듈화, 관심사, 네이밍 등 너무 적절하게 구성해주셧어요!
담번애는 완성을 목표로 과제를 진행해봅시다
| if (!limitSelect) return; | ||
|
|
||
| limitSelect.value = currentParams.limit; | ||
| limitSelect.onchange = (e) => { |
There was a problem hiding this comment.
되도록 일관성을 유지하면서 코드를 작성하는게 좋을것 같아요, 전체적으로는 addEventListener를 썻는데 여기서만 onchange를 썻네요
There was a problem hiding this comment.
시간이 좀더 있었으면 지수님 실력정도면 컴포넌트 관심사 분리를 할수 잇었을것 같아요 추후 2챕터의 클린코드에서 해당 컴포넌트 관심사 분리과제가 있으니 해당 챕터에서 경험해 보고 해당 코드 리펙토링 하는 것도 좋을 것 같아요!
There was a problem hiding this comment.
여기 코드도 마찬가지로 전체적으로 컴포넌트 관심사 분리가 필요해보여요
| export const ACTION_TYPES = { | ||
| SET_LOADING: "SET_LOADING", | ||
| SET_PRODUCTS: "SET_PRODUCTS", | ||
| SET_LOADING_MORE: "SET_LOADING_MORE", | ||
| APPEND_PRODUCTS: "APPEND_PRODUCTS", | ||
| SET_CATEGORIES: "SET_CATEGORIES", | ||
| SET_ROUTE: "SET_ROUTE", | ||
| SET_PRODUCT_DETAIL: "SET_PRODUCT_DETAIL", | ||
| SET_PRODUCT_DETAIL_LOADING: "SET_PRODUCT_DETAIL_LOADING", | ||
| ADD_TO_CART: "ADD_TO_CART", | ||
| REMOVE_FROM_CART: "REMOVE_FROM_CART", | ||
| CLEAR_CART: "CLEAR_CART", | ||
| }; | ||
|
|
There was a problem hiding this comment.
해당 코드 Redux를 보는것같네요
지수님 리액트를 정확히 잘 이해하고계시네요...잘하신다 1년차 같진 않아요
저보다 훨씬 더 코드 깔끔하게 구성하시는것같네요
| const getState = () => state; | ||
|
|
||
| /** 상태 변경 */ | ||
| const dispatch = (action) => { |
There was a problem hiding this comment.
Redux라이브러리 공부를 한번 따로 하신걸까요? reducer까지 따로 이렇게 구현한건 대단한거같아요
There was a problem hiding this comment.
Redux는 사용해본 적이 없고, useReducer 훅 써본 경험을 바탕으로 구현했습니다!
There was a problem hiding this comment.
각 역할마다 분기처리가 잘 되어있네요 DEFAULT_PARAMS를 상수로 두고 쓰는 것도 너무 좋아요
a90ad7b to
d5eb31b
Compare
과제 체크포인트
배포 링크
https://hyunzsu.github.io/front_6th_chapter1-1/
기본과제
상품목록
상품 목록 로딩
상품 목록 조회
한 페이지에 보여질 상품 수 선택
상품 정렬 기능
무한 스크롤 페이지네이션
상품을 장바구니에 담기
상품 검색
카테고리 선택
카테고리 네비게이션
현재 상품 수 표시
장바구니
장바구니 모달
장바구니 수량 조절
장바구니 삭제
장바구니 선택 삭제
장바구니 전체 선택
장바구니 비우기
상품 상세
상품 클릭시 상세 페이지 이동
/product/{productId}형태로 변경된다상품 상세 페이지 기능
상품 상세 - 장바구니 담기
관련 상품 기능
상품 상세 페이지 내 네비게이션
사용자 피드백 시스템
토스트 메시지
심화과제
SPA 네비게이션 및 URL 관리
페이지 이동
상품 목록 - URL 쿼리 반영
상품 목록 - 새로고침 시 상태 유지
장바구니 - 새로고침 시 데이터 유지
상품 상세 - URL에 ID 반영
/product/{productId})상품 상세 - 새로고침시 유지
404 페이지
AI로 한 번 더 구현하기
과제 셀프회고
자바스크립트로 SPA를 구현하는 것이 처음이어서 처음에 어떤 것부터 시작해야 될지 몰랐고, 막막했습니다.
상태관리 → 라우터 → 컴포넌트 순서로 차근차근 접근하면서 전체적인 SPA 구조를 이해할 수 있었습니다.
기술적 성장
자랑하고 싶은 코드
1. Redux-like 상태 관리 패턴: 순수 함수 기반 리듀서와 액션 생성자 구현
복잡한 상태 관리를 어떻게 효율적이게 구현할 수 있을지 고민이 많았습니다. 초기에는 전역 변수나 DOM 직접 조작으로 상태를 관리하려 했지만, 컴포넌트 간 데이터 공유와 상태 동기화 문제가 발생했고, 애플리케이션이 복잡해질수록 상태 변화를 추적하기 어려워졌습니다.
설계 이유:
실제 적용 사례:
2. 무한 스크롤 (Intersection Observer API)
구현 이유:
개선이 필요하다고 생각하는 코드
전반적으로 모두 개선이 필요하다고 생각해요.....🥲
상태 관리와 URL 중심 접근 사이의 경계가 모호해서 같은 데이터를 여러 곳에서 관리하는 문제가 심각한 것 같아요.
AI 활용 경험 공유하기
리뷰 받고 싶은 내용