[4팀 오하늘] Chapter 1-1. 프레임워크 없이 SPA 만들기#59
Open
eveneul wants to merge 61 commits intohanghae-plus:mainfrom
Open
[4팀 오하늘] Chapter 1-1. 프레임워크 없이 SPA 만들기#59eveneul wants to merge 61 commits intohanghae-plus:mainfrom
eveneul wants to merge 61 commits intohanghae-plus:mainfrom
Conversation
- 매치된 첫 번째 라우트만 렌더링되게 return 추가
- type(category, products, product)에 따른 분기 처리
- ProductList, ProductCard, Search 컴포넌트 생성 - Home 페이지에서 getProducts API 호출 - useStore.js 기본 전역 상태 추가
- 2 depth가 변경되어도 1 depth 전체를 반환해주는 코드로 변경 (gpt)
- globalStore에서 filter -> params로 변경 및 항목 추가 - ProductCard.js에서 상품 카드 이미지 경로를 데이터로 수정 - Search.js 컴포넌트 추가 및 이벤트 바인딩 - 🐛 검색 결과에 따른 상품 목록 리랜더링이 먹히지 않음
- Search.mount()로 Search에 관한 이벤트 다시 랜더링 해 주어야 함
- 스켈레톤 UI 노출 후 새로운 프로덕트 리스트 UI 노출 작업 중
- ProductCard.js에 상품 클릭 시 상세 페이지로 이동하는 기능 추가 - 장바구니 추가 버튼 클릭 시 콘솔 로그 출력 기능 추가 - Home.js에서 ProductCard.mount() 호출하여 이벤트 바인딩
- 상품 상세 페이지에서 로딩 상태 관리 기능 추가 - URL 변경 시 뷰를 리렌더링하는 이벤트 리스너 추가 - Loading 컴포넌트의 스타일 수정으로 화면 최적화
- 상품 목록에서 pagination.total과 products를 안전하게 접근하도록 수정 - 상품 상세 페이지에서 관련 상품을 가져오는 기능 추가 - 상품 정보 및 이미지 동적으로 렌더링하도록 수정
- package.json에 다양한 테스트 스크립트 추가: 기본, 쉬움, 어려움 레벨의 E2E 테스트를 위한 스크립트 추가 - CI 구성에서 새로운 테스트 작업 추가: 기본, 쉬움, 어려움 레벨의 E2E 테스트를 위한 GitHub Actions 워크플로우 설정 - 새로운 E2E 테스트 파일 추가: 쉬움 및 어려움 레벨의 E2E 테스트 시나리오 구현
- 앞으로/뒤로가기 시 데이터가 누적돼서 호출 - useNavigate 훅을 싱글톤으로 수정
- Home.js에서 fetchProducts와 fetchCategories 함수 호출로 카테고리 데이터 관리 방식 변경 - 무한 스크롤 함수 임시 주석 처리 - Search.js에서 불필요한 return 추가
- store에서 limit 및 sort 파라미터를 가져와서 선택 요소에 설정 - 중복된 주석 코드 제거
- Search.js에서 기본 선택 옵션을 20개 및 가격 낮은순으로 설정 - Home.js에서 카테고리 데이터를 포함하여 렌더링 방식 변경
- useNavigate 및 useStore 훅을 main.js에서 직접 가져와 사용하도록 변경 - render 초기화 및 Layout 마운트 방식 수정 - URL 변경 시 뷰 리렌더링 로직 개선 - ProductCard 및 Product 컴포넌트에서 navigate.push() 대신 window.history.pushState() 사용으로 변경
- Home.js에서 초기 로딩 상태 설정 및 fetchCategories 함수에서 로딩 상태 업데이트 추가 - Product.js에서 fetchProduct 및 fetchRelatedProducts 함수에서 로딩 상태 관리 제거 후 mount 메서드에서 로딩 상태 업데이트 추가 - Product.init 메서드 추가로 초기 로딩 상태 설정 방식 개선
- 모든 상품을 확인했습니다 메시지를 삭제하여 UI 간소화
- Toast.js 파일을 새로 생성하여 다양한 알림 메시지 템플릿 추가
- ProductCard.js에서 장바구니 추가 버튼 클릭 시 Toast.mount("addCart") 호출로 알림 표시 기능 추가
- ProductList 컴포넌트에서 props 구조 분해 할당을 적용하여 가독성 향상 - Search 컴포넌트에서 이벤트 핸들링 방식을 개선하고, 검색 입력값을 상태에서 가져오도록 수정 - Home 컴포넌트에서 fetchMoreProducts 함수를 비동기로 변경하고, 스크롤 이벤트 핸들러를 추가하여 무한 스크롤 기능 개선
- Search.js에서 불필요한 console.log 제거 - useNavigate.js에서 Header 컴포넌트 추가 및 렌더링 로직 개선 - Product.js에서 장바구니 추가 및 수량 조절 기능 구현
- handleDeleteToast 함수에 event 매개변수 추가 - Toast.mount에서 toastCloseBtn 클릭 이벤트 핸들러를 수정하여 콘솔 로그 추가 - Toast 메시지 삽입 위치를 document.body에서 main으로 변경
- 상품 이미지 클릭 시 window.history.pushState 대신 navigate.push로 변경하여 내비게이션 로직 개선
- Search.js에서 카테고리 필터링 기능 추가 및 이벤트 핸들링 개선 - Home.js에서 카테고리 상태를 store에 저장하고, Search 컴포넌트에 전달하여 검색 기능 향상 - useStore.js에서 categories 초기 상태 추가
- Breadcrumb.js 파일을 새로 생성하여 카테고리 내비게이션 기능 구현 - Search.js에서 Breadcrumb 컴포넌트를 통합하여 카테고리 필터링 UI 개선 - Home.js에서 Breadcrumb을 렌더링하고 mount하여 카테고리 상태 관리 기능 강화
- 가격 표시를 포맷팅하는 formatPrice 함수를 추가하여 천 단위 구분 기호 적용 - 브랜드 정보가 없을 경우 대체 텍스트로 maker 또는 mallName을 표시하도록 수정
- Search.js에서 URLSearchParams를 사용하여 쿼리 파라미터를 객체로 변환하고, 이를 통해 검색 및 정렬 기준을 설정하도록 수정 - Home.js에서 fetchProducts 호출 시 URL 파라미터를 전달하여 동적 검색 기능 강화 - Breadcrumb.js에서 카테고리 초기화 시 빈 문자열 대신 null로 설정하여 상태 관리 개선 - useRender.js에서 draw 함수에 tag 유효성 검사 추가
- NotFound.js 파일에 404 에러 페이지 추가 - 홈으로 돌아가는 링크를 추가
- fetchMoreProductsScroll 함수에서 현재 경로가 "/"일 때만 스크롤 이벤트를 처리하도록 수정하여 불필요한 호출 방지 - 중복된 경로 체크 로직을 함수 내에서 통합하여 코드 가독성 향상
- CartButton 컴포넌트를 새로 생성하여 장바구니 아이콘 및 수량 표시 기능 구현 - Header 컴포넌트에서 장바구니 상태를 관리하고 CartButton을 렌더링하도록 수정 - Layout 컴포넌트에서 Header.mount() 호출 추가하여 장바구니 상태 초기화 - ProductCard 및 ProductList 컴포넌트에서 장바구니 추가 기능을 위한 이벤트 핸들링 개선 - Toast 컴포넌트를 통해 장바구니 추가 시 사용자 피드백 제공
- package.json에 프로덕션 빌드 및 미리보기, 배포 스크립트 추가 - vite.config.js에서 프로덕션 환경에 맞는 기본 경로 및 빌드 설정 추가
- package.json에 gh-pages 패키지를 추가하고, 배포 스크립트를 수정하여 빌드 후 dist 디렉토리를 gh-pages로 배포하도록 변경 - pnpm-lock.yaml에서 gh-pages 의존성을 추가하여 패키지 관리 개선
- mockServiceWorker.js의 URL을 설정하는 serviceWorker 옵션을 추가하여 모킹 기능 개선
- Vite 설정 파일(vite.config.js)에서 프로덕션 환경에 맞는 기본 경로를 수정하여 배포 경로를 일관되게 유지
- 새로운 404.html 파일을 생성하여 사용자에게 페이지를 찾을 수 없음을 알리는 디자인을 추가 - 홈으로 돌아가는 링크와 함께 사용자 친화적인 메시지를 포함하여 사용자 경험 개선
- package.json의 배포 스크립트를 gh-pages에서 pnpm preview:prod로 변경하여 배포 방식 개선 - vite.config.js에서 프로덕션 환경에 맞는 기본 경로 설정을 수정 - GitHub Actions를 활용한 배포 자동화를 위한 deploy.yml 파일 추가
- index.html 파일에 로딩 중 표시 및 기본 콘텐츠 구조 추가 - main.js에서 모킹 기능을 개선하여 workerOptions를 사용하도록 수정 - browser.js에서 serviceWorker URL 설정을 환경 변수에 따라 동적으로 처리하도록 변경
- BASE_PATH를 제거한 앱 경로를 반환하는 getAppPath 함수 추가 - Header, Home, Product 컴포넌트에서 getAppPath 함수를 사용하여 경로 처리 개선 - useRender에서 경로 매칭 로직을 getAppPath로 변경하여 코드 일관성 향상
- deploy from a branch 설정으로 변경 테스트
- browser.js 롤백
a90ad7b to
d5eb31b
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
과제 체크포인트
배포 링크
https://eveneul.github.io/front_6th_chapter1-1/
기본과제
상품목록
상품 목록 로딩
상품 목록 조회
한 페이지에 보여질 상품 수 선택
상품 정렬 기능
무한 스크롤 페이지네이션
상품을 장바구니에 담기
상품 검색
카테고리 선택
카테고리 네비게이션
현재 상품 수 표시
장바구니
장바구니 모달
장바구니 수량 조절
장바구니 삭제
장바구니 선택 삭제
장바구니 전체 선택
장바구니 비우기
상품 상세
상품 클릭시 상세 페이지 이동
/product/{productId}형태로 변경된다상품 상세 페이지 기능
상품 상세 - 장바구니 담기
관련 상품 기능
상품 상세 페이지 내 네비게이션
사용자 피드백 시스템
토스트 메시지
심화과제
SPA 네비게이션 및 URL 관리
페이지 이동
상품 목록 - URL 쿼리 반영
상품 목록 - 새로고침 시 상태 유지
장바구니 - 새로고침 시 데이터 유지
상품 상세 - URL에 ID 반영
/product/{productId})상품 상세 - 새로고침시 유지
404 페이지
AI로 한 번 더 구현하기
과제 셀프회고
기술적 성장
onClick=”myFunction”식 바인딩을 꿈꾸며 전역 함수 & 커스텀 훅 스타일로 시작MyComponent.mount = () ⇒ { … }패턴 도입하여 “DOM 생성 후 실행”을 보장mount뿐만 아닌init,unmount등 다양한 메서드들을 추가로 도입할 수 있을 것 같음.자랑하고 싶은 코드
core/useStore.js로 전역에 상태하는 훅을 만들었다.
Recoil, Zustand가 어떻게 돌아가는지도 모르고 생각없이 막 사용하던 지난 날….. 처음 전역 상태 관리를 도입해야겠다고 생각하고, Zustand 코드를 참고했다.
get으로 미리 선언해둔 globalState에 있는 객체 중 해당하는 key만 정보를 추출하여 리턴한다.globalState를 구성했으나, 카트라든지 카테고리라든지 다른 상태도 관리할 일이 생겨서 2뎁스까지 들어가서 value를 바꾸는 함수를 구성했다. (여담으로 저때 좀 신 들렸나 보다. AI 도움 안 받고 갑자기 생각나는 대로 작성했다. 지금 하라고 하면 못 할 듯)watch는set으로 객체를 변경하면 그것을 감지하고, 새롭게 변경한 state를 알려 주고, 콜백을 제공한다. 나 같은 경우, 하위 컴포넌트 또는 다른 컴포넌트에서 store.set으로 객체를 변경하면, 상위 컴포넌트에서 변경을 감지해 다시 dom에 그려주는render를 진행하는 식으로 구현했다.개선이 필요하다고 생각하는 코드
학습 효과 분석
과제 피드백
AI 활용 경험 공유하기
리뷰 받고 싶은 내용