[3팀 여진석] Chapter 1-1. 프레임워크 없이 SPA 만들기#50
Open
realstone2 wants to merge 118 commits intohanghae-plus:mainfrom
Open
[3팀 여진석] Chapter 1-1. 프레임워크 없이 SPA 만들기#50realstone2 wants to merge 118 commits intohanghae-plus:mainfrom
realstone2 wants to merge 118 commits intohanghae-plus:mainfrom
Conversation
1. 카테고리 로딩중일 때는 "카테고리: " 노출 안되도록 수정 2. 카테고리 테스트 코드에서 카테고리: 가 생성되었냐로 카테고리 로딩완료 판단하도록 수정 상품 리스트 컴포넌트와 독립적으로 각각 비동기로 render를 호출하고 있어서 상품 리스트 컴포넌트에 있는 "총 의 상품" 이 생성되었냐로 판단할 수 없어서 수정하였습니다.
- eventId 매개변수 이름을 일관되게 변경 - dispatch 메서드에서 HTMLElement 대신 Element 사용 - 불필요한 조건문 제거로 코드 간결화
- createStore 대신 직접 value와 listeners 관리 - setValue 및 subscribe 메서드 로직 개선
- 장바구니 상태를 관리하는 cartStore 추가 - 헤더 컴포넌트에서 장바구니 아이콘 및 카운트 표시 기능 구현 - 상품 목록 컴포넌트에서 장바구니에 상품 추가 기능 추가 - 라우터에 헤더 컴포넌트 마운트
테스트 코드에서 / 시작하면 테스트 통과가 안되는 문제 발생 했는데, 원인 해결이 안돼서 주석처리
- 상세페이지 로딩 및 로딩 완료 컴포넌트 삭제 - ProductDetail 페이지 삭제
테스트간 간섭으로 인하여 테스트 통과가 안되는 문제가 있었는데, 해결이 되지 않아 하나로 통합 (ㅜ.ㅜ)a
- 상태를 관리하기 위한 _state 프로퍼티 추가 - 상태 접근을 위한 getter와 setter 구현 - unmount 시 상태 초기화 로직 추가
- 장바구니에 상품 추가 기능 구현 - 성공 메시지를 표시하는 토스트 컴포넌트 추가 - 토스트 메시지 상태 관리 기능 구현
- 상품 상세 페이지 컴포넌트 추가 - 상품 정보를 불러오는 로직 구현 - 장바구니 담기 기능 통합 - 헤더에 제목 및 뒤로가기 버튼 추가
- Component 클래스의 생성자에 초기 상태를 설정하는 기능 추가 - ProductDetailPage에서 상태 초기화 방식 변경 - 라우터 함수에서 currentComponentList 관리 방식 개선
- 상품 상세 정보를 표시하는 ProductDetailContent 컴포넌트 추가 - 로딩 상태를 표시하는 ProductDetailLoading 컴포넌트 추가 - 관련 상품 목록을 표시하는 RelatedProductList 컴포넌트 추가 - ProductDetailPage에서 각 컴포넌트를 통합하여 렌더링
- NotFound 컴포넌트를 새로 생성하여 404 페이지를 구현 - 라우터에 NotFound 컴포넌트를 추가하여 잘못된 경로 접근 시 해당 컴포넌트를 렌더링 - searchParamsStore 초기값을 URLSearchParams로 설정하여 검색 파라미터 관리 개선
- EventDelegator의 import 경로를 수정하여 일관성 유지
- 프로덕션 환경에 따라 BASE_PATH를 설정하는 상수 추가
- GitHub Pages에 배포하기 위한 GitHub Actions 워크플로우 추가 - 빌드 및 배포 스크립트 추가 - 404 페이지 및 스타일 추가 - 라우터 경로에 BASE_PATH 적용
- 로딩 중 표시를 위한 기본 콘텐츠 삭제 - 불필요한 스크립트 및 스타일 시트 링크 제거 - 스타일 시트 링크를 올바른 위치에 추가
- 404.html 파일을 새로 생성하여 사용자에게 페이지를 찾을 수 없음을 알림 - Tailwind CSS를 사용하여 스타일링 적용
- 중첩된 div를 제거하여 코드 간결화
- 페이지 로드 시 URL 경로를 변경하는 스크립트 추가
- 상품 상세 페이지로의 경로 변경 시 BASE_PATH를 적용 - 불필요한 코드 제거 및 검색 쿼리 처리 로직 개선
- 기본과제 및 심화과제 내용 포함 - 사용자 피드백 시스템 및 기술적 성장 기록 - 과제 셀프회고 및 학습 효과 분석 추가
- 장바구니 모달 컴포넌트 구현 - 장바구니 아이템 수량 변경, 삭제, 선택 기능 추가 - 장바구니 비어있을 때의 UI 처리 추가 - 라우터에서 모달 핸들링 로직 추가
- 장바구니에 추가할 때 제품 수량에 따라 반복적으로 추가하도록 수정 - 이벤트 위임에서 버튼 요소를 정확히 선택하도록 변경
- 검색 파라미터를 사용하여 장바구니 모달의 가시성 제어 - 장바구니가 비어있을 경우 모달 내용 변경 - 모달 닫기 시 검색 파라미터에서 'cart' 제거 - handle-modal.ts 파일 삭제 및 CartModal 인스턴스 생성
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://realstone2.github.io/front_6th_chapter1-1/
기본과제
상품목록
상품 목록 로딩
상품 목록 조회
한 페이지에 보여질 상품 수 선택
상품 정렬 기능
무한 스크롤 페이지네이션
상품을 장바구니에 담기
상품 검색
카테고리 선택
카테고리 네비게이션
현재 상품 수 표시
장바구니
장바구니 모달
장바구니 수량 조절
장바구니 삭제
장바구니 선택 삭제
장바구니 전체 선택
장바구니 비우기
상품 상세
상품 클릭시 상세 페이지 이동
/product/{productId}형태로 변경된다상품 상세 페이지 기능
상품 상세 - 장바구니 담기
관련 상품 기능
상품 상세 페이지 내 네비게이션
사용자 피드백 시스템
토스트 메시지
심화과제
SPA 네비게이션 및 URL 관리
페이지 이동
상품 목록 - URL 쿼리 반영
상품 목록 - 새로고침 시 상태 유지
장바구니 - 새로고침 시 데이터 유지
상품 상세 - URL에 ID 반영
/product/{productId})상품 상세 - 새로고침시 유지
404 페이지
AI로 한 번 더 구현하기
과제 셀프회고
기능들은 전부 구현했으나 심화과제 테스트가 통과가 안되는 문제까지는 해결 못한 점이 아쉽습니다.
준일 코치님의 블로그글을 보고 결심한 항해 플러스의 첫과제를 준일 코치님의 블로그 글 기반으로 학습할 수 있어서 즐거웠습니다.
처음에는 블로그글에 적혀있던 것을 기반으로 가볍게 render를 하고 mvc 단계로 나눠주는 부분이 포인트가 될 것 같다고 생각하였습니다.
그러나 과제를 시작해보니 많은 기능구현들을 마주하면서 상태관리, mount unmount, event 관리 등 많은 것을 정말 생각보다 많이 라이브러리에 의존하고 있었다는 것을 깨달았습니다.
처음에는 History API 만 구성하면 되겠지 => 리액트의 render 상태관리가 다 필요하겠군 => 이벤트처리하려면 전역으로 하나 관리해야되겠군.. 의 흐름으로 개발 과정이 이뤄졌던 것 같습니다.
기술적 성장
class 문법
class 사용을 java에서는 과거에 많이 다뤄봤었지만 js class를 다룰만한 경험이 별로 없었습니다.
자바스크립트 class를 이번 기회에 많이 익히게 된 것 같습니다.
특히 개발중에 bind 관리를 해주지 않아서 this가 의도된 값을 바라보지 않아서 곤란해하며 버그를 수정했었습니다.
이벤트 위임 방식
리액트에서 이벤트 위임 방식으로 되어있다는 말은 수도 없이 들어봤지만,
왜 최적화가 되고, 관리를 잘 할 수 있냐라는 점을 이번에 구성하면서 많이 깨달았습니다.
history API
항상 리액트에서 제공하는 라이브러리로만 다루다보니 다룰일이 없어서 처음 다뤄본 내용이었습니다.
history API가 복잡한 기능은 아니지만 항상 낯설고 어렵게 느껴졌는데, 한번 다뤄보니 친근해진 것 같습니다.
테스트코드
테스트 코드 자체를 처음 겪어봤습니다.
물론 작성해본건 아니지만 테스트코드가 계속 실패하면서 어떤 함수들로 어떻게 테스트가 진행되는지 가볍게 볼 수는 있었던 것 같습니다.
기간을 지키는 개발
사실 이벤트를 전역으로 등록하지 않아도, component class를 구현하지 않아도 기능자체는 구현할 수 있었음에도,
기능을 하나하나 구현할 때마다 계속 좋은 구조로 리팩토링을 진행하였습니다.
장바구니 기능만 구현을 못했는데, 이런 부분이 아쉬워서 다음부터는 기간을 신경쓰면서 스스로 타협하면서 과제를 진행해야겠다고 느꼈습니다.
리액트에서 해주던 상태관리 생명주기의 필요성
리액트만의 구성단계라고 생각했었는데, 실제로 구현을 하면서 필요한 기능을 넣다보니, 결국 리액트에서 class 컴포넌트로 구성했던 모습과 비슷한 형태로 가게 되었습니다.
meta에서 어떤 고민을 하면서 이런 흐름이 이어졌을까를 느낄 수 있었던 시간이었습니다.
자랑하고 싶은 코드
state를 어떻게 구성할 수 있을까와 rerender를 어떻게 구성하면 좋을까를 많이 고민하면서
subscribe 패턴으로 구성과 크게 다르지 않겠구나를 반영한 코드입니다.
결국에는 리액트 컴포넌트의 형태와 비슷하게 따라가게 될 수 밖에 없던게 인상적이었습니다.
전역 이벤트 등록 함수
EventDelegator 싱글턴 패턴을 사용해서 각 타입마다 전역 event 하나를 구성하도록 하였습니다.
타입적으로도 안전하고 확장성 있게 구성하였습니다.
mount unmount render 컴포넌트 섹션 등이 확실하게 분리되어있어서 바닐라 자바스크립트치고는 가독성이 괜찮지 않나..? 하는 자랑을 해봅니다.
타입스크립트로 마이그레이션..!
별거는 아니지만, 3팀최고갓 준형님이 타입스크립트로 짜면 칭찬해준다고 하셔서 적어봤습니다.
개선이 필요하다고 생각하는 코드
학습 효과 분석
과제 피드백
AI 활용 경험 공유하기
중간 과정에 리팩토링을 많이 진행하였다보니 수정할 코드 양이 많았는데,
큰틀의 설계와 완성된 하나의 시퀀스만 있으면 Copilot Agent가 기존 코드를 80%는 만족스럽게 짜줘서 빠르게 리팩토링을 진행할 수 있었습니다.
내가 생각한 설계 방향이 일반적인지 검증하거나, 아이디어를 얻는 방식으로 사용하였습니다.
기능 list를 명확하게 같이 나열해서 주면서 리팩토링을 시켰을 때, 더 명확하고 확실하게 수정이 되었습니다.
리뷰 받고 싶은 내용
Model은 스토어.
View는 컴포넌트, 모델을 구독하여 render
Controller에서는 API를 핸들링하여 스토어에 저장 등 Model을 다루는 곳
다음과 같은 형태로 설계를 진행하였습니다.
시간이 부족해서 나중에는 깊은 생각은 못하고 컴포넌트쪽에 함수를 다 때려넣은 점이 아쉽긴합니다 ㅜ
EX:
mount unmount를 컴포넌트마다 등록하고 해제하는 보일러 플레이트 코드가 너무 많은데, 어떻게 구성하면 더 깔끔한 코드를 만들 수 있었을지 피드백 받고 싶습니다!
제가 구성해놓은 방식이 정답에 몇퍼센트 가까운 정도일까요?
SPA 기능을 구현하면서 큰 테마는 세가지(Router, 컴포넌트, 이벤트 위임)라고 생각합니다.
해당 부분에 있어서 뭔가 잘못 구현이 된건지 구현은 전부 되었다고 생각했음에도 심화과제 테스트들은 전부실패해서 잘못 구현한걸까 싶은 생각이 들었습니다.
(일부 기능 버그가 있긴하지만 테스트 자체가 다른곳에서 실패해서 점검을 못했습니다 ㅜ)