[4팀 이유진] Chapter 1-1. 프레임워크 없이 SPA 만들기#71
Open
Elli-Lee wants to merge 34 commits intohanghae-plus:mainfrom
Open
[4팀 이유진] Chapter 1-1. 프레임워크 없이 SPA 만들기#71Elli-Lee wants to merge 34 commits intohanghae-plus:mainfrom
Elli-Lee wants to merge 34 commits intohanghae-plus:mainfrom
Conversation
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://elli-lee.github.io/front_6th_chapter1-1/
기본과제
상품목록
상품 목록 로딩
상품 목록 조회
한 페이지에 보여질 상품 수 선택
상품 정렬 기능
무한 스크롤 페이지네이션
상품을 장바구니에 담기
상품 검색
카테고리 선택
카테고리 네비게이션
현재 상품 수 표시
장바구니
장바구니 모달
장바구니 수량 조절
장바구니 삭제
장바구니 선택 삭제
장바구니 전체 선택
장바구니 비우기
상품 상세
상품 클릭시 상세 페이지 이동
/product/{productId}형태로 변경된다상품 상세 페이지 기능
상품 상세 - 장바구니 담기
관련 상품 기능
상품 상세 페이지 내 네비게이션
사용자 피드백 시스템
토스트 메시지
심화과제
SPA 네비게이션 및 URL 관리
페이지 이동
상품 목록 - URL 쿼리 반영
상품 목록 - 새로고침 시 상태 유지
장바구니 - 새로고침 시 데이터 유지
상품 상세 - URL에 ID 반영
/product/{productId})상품 상세 - 새로고침시 유지
404 페이지
AI로 한 번 더 구현하기
과제 셀프회고
SPA 프레임워크들이 어떤 역할을 해주고 있었는지, 어떤 원리로 돌아가는지 조금 더 깊게 이해하게 되었습니다.
이번 과제를 진행하면서 가장 어려웠던 점은 형편없는 스스로의 실력을 다시한번 깨닫고 견디는 일이었습니다.
엉망진창 코드임은 분명하지만, 그래도 주어진 시간동안 제 실력에서는 최선을 다했다는 점 만큼은 뿌듯합니다.
3주차 쯤 지나서 조금 더 실력이 오르면 그때 다시한번 해당 과제를 개인적으로 도전해보고 싶습니다.
클래스형으로 프론트엔드 코드를 작성해 본적이 없어서 이번에 도전을 못했는데 다음에 도전할 때는 클래스형으로도 작성해보고 싶습니다.
기술적 성장
이번 프로젝트를 통해 바닐라 JavaScript로 SPA를 구현하는 전체 과정을 경험할 수 있었습니다.
사실 SPA 프레임워크(혹은 라이브러리)의 동작 원리를 크게 생각하지 않고 편하게 사용만 했었습니다.
미숙하고 엉망진창이지만, 그래도 바닐라 자바스크립트로 SPA를 개발하려고 시도하는 과정에서 프레임워크들이 어떤 역할을 하고 있었는지,
또 어떤 문제들을 해결하고 있었는지 알 수 있었고, SPA의 동작 원리를 더 깊이 이해할 수 있게 되었습니다.
구체적으로는
상태 관리 시스템: createStore.js를 구현하여 상태 관리의 원리
라우터 시스템: 동적 라우팅을 지원하는 SPA 라우터를 직접 구현하여 클라이언트 사이드 라우팅 원리
이벤트 위임: 전역 이벤트 위임 방식으로 효율적인 이벤트 처리 시스템
비동기 처리: 무한 스크롤, API 호출 등 복잡한 비동기 로직 처리
에 대해 알 수 있었습니다.
자랑하고 싶은 코드
라우터, 스토어 등을 구현하면서 이게 맞는 방법인지 알 수가 없어서 사실 자랑 하고 싶을 만한 코드는 아니지만,
고민했던 부분을 해결했다는 점에서는 스스로 뿌듯함을 느낀 부분을 작성하였습니다.
createStore.js
export function createStore(initialState) {
let state = initialState;
let listeners = [];
return {
getState: () => state,
setState: (newState) => {
const prevState = state;
state = typeof newState === "function" ? newState(prevState) : { ...prevState, ...newState };
listeners.forEach((listener) => listener(state, prevState));
},
subscribe: (listener) => {
listeners.push(listener);
return () => {
listeners = listeners.filter((l) => l !== listener);
};
},
};
}
프레임워크/라이브러리에서 제공하는 상태관리와 그래도 비슷하게(?) 동작하는 것 같습니다.
개선이 필요하다고 생각하는 코드
우선 컴포넌트와 함수들을 단일책임원칙에 맞게 잘 분리해서 블록처럼 조립하는 형태의 깔끔한 SPA를 구현하고 싶었으나..
그걸 판단하고 적절한 위치에 옮기고 모듈화하기에는 아직 제 실력이 많이 부족합니다.
여기저기 흩어져 있고 섞여있는 로직들과 분리가 한참 덜 된 컴포넌트들의 개선이 필요합니다.
학습 효과 분석
React/Vue 없이도 SPA 구현 가능함을 체험했습니다.
이 과제를 진행하면서 vue나 react 오픈소스를 대략적으로라도 공부하면 좋겠다는 생각이 들었습니다.
또한 각 모듈이 담당하는 명확한 역할만을 수행하도록 분리하는것이 얼마나 어려운 것인지 알게되었습니다.
한번도 생각해보지 않았던 Vue, React의 반응형 상태 관리의 원리에 대해 이해할 수 있었습니다.
과제 피드백
하나씩 도전 과제를 해결해나가는 것이 정말 어렵긴 했지만 체크리스트를 하나씩 체크하며 구현해나가는 과정이 즐거웠습니다.
저의 실력 부족 이슈와 회사 업무로 인해 개인적으로는 시간이 조금 부족했던 점이 아쉽습니다.
과제를 잘 수행하지 못했음에도 엉망진창으로라도 구현하는 과정에서 SPA의 원리와 자바스크립트로 DOM을 조작하는 과정들에 대해서 알게되어 정말 의미있었습니다.
오랜만에 이렇게 몰입할 수 있는 경험을 하게 되어 체력적으로는 피곤했지만 뿌듯했습니다.
AI 활용 경험 공유하기
Claude와 함께 전체 구조 설계: 폴더 구조, 모듈 분리 방향성 논의
상태 관리 패턴 선택: Redux vs 커스텀 Store 구현의 장단점 분석
라우터 구현 방향성: History API 활용 방법 학습
복잡한 로직 구현: 무한 스크롤, 동적 라우팅 등 핵심 기능 구현 지원
디버깅 지원: 이벤트 위임 관련 버그 해결
코드 리팩토링: 가독성 향상을 위한 함수 분리 및 네이밍 개선
AI로부터 어떤 순서로 진행해야 할지, 어떤 패턴으로 작성해야 할지 도움을 받아 그나마 여기까지 과제를 수행했습니다.
주도권을 AI에게 뺏기는 순간부터 이 코드에 대해 제가 직접 이해하고 수정하기 힘들다는 것을 많이 느꼈습니다.