|
4 | 4 |
|
5 | 5 | <!-- |
6 | 6 | 배포 링크를 적어주세요 |
7 | | -예시: https://<username>.github.io/front-5th-chapter1-1/ |
| 7 | +예시: https://<username>.github.io/front-7th-chapter2-1/ |
8 | 8 |
|
9 | 9 | 배포가 완료되지 않으면 과제를 통과할 수 없습니다. |
10 | 10 | 배포 후에 정상 작동하는지 확인해주세요. |
11 | 11 | --> |
12 | 12 |
|
13 | | - |
14 | 13 | ### 기본과제 |
15 | 14 |
|
16 | | -#### 1) 라우팅 구현: |
17 | | -- [ ] History API를 사용하여 SPA 라우터 구현 |
18 | | - - [ ] '/' (홈 페이지) |
19 | | - - [ ] '/login' (로그인 페이지) |
20 | | - - [ ] '/profile' (프로필 페이지) |
21 | | -- [ ] 각 라우트에 해당하는 컴포넌트 렌더링 함수 작성 |
22 | | -- [ ] 네비게이션 이벤트 처리 (링크 클릭 시 페이지 전환) |
23 | | -- [ ] 주소가 변경되어도 새로고침이 발생하지 않아야 한다. |
24 | | - |
25 | | -#### 2) 사용자 관리 기능: |
26 | | -- [ ] LocalStorage를 사용한 간단한 사용자 데이터 관리 |
27 | | - - [ ] 사용자 정보 저장 (이름, 간단한 소개) |
28 | | - - [ ] 로그인 상태 관리 (로그인/로그아웃 토글) |
29 | | -- [ ] 로그인 폼 구현 |
30 | | - - [ ] 사용자 이름 입력 및 검증 |
31 | | - - [ ] 로그인 버튼 클릭 시 LocalStorage에 사용자 정보 저장 |
32 | | -- [ ] 로그아웃 기능 구현 |
33 | | - - [ ] 로그아웃 버튼 클릭 시 LocalStorage에서 사용자 정보 제거 |
34 | | - |
35 | | -#### 3) 프로필 페이지 구현: |
36 | | -- [ ] 현재 로그인한 사용자의 정보 표시 |
37 | | - - [ ] 사용자 이름 |
38 | | - - [ ] 간단한 소개 |
39 | | -- [ ] 프로필 수정 기능 |
40 | | - - [ ] 사용자 소개 텍스트 수정 가능 |
41 | | - - [ ] 수정된 정보 LocalStorage에 저장 |
42 | | - |
43 | | -#### 4) 컴포넌트 기반 구조 설계: |
44 | | -- [ ] 재사용 가능한 컴포넌트 작성 |
45 | | - - [ ] Header 컴포넌트 |
46 | | - - [ ] Footer 컴포넌트 |
47 | | -- [ ] 페이지별 컴포넌트 작성 |
48 | | - - [ ] HomePage 컴포넌트 |
49 | | - - [ ] ProfilePage 컴포넌트 |
50 | | - - [ ] NotFoundPage 컴포넌트 |
51 | | - |
52 | | -#### 5) 상태 관리 초기 구현: |
53 | | -- [ ] 간단한 상태 관리 시스템 설계 |
54 | | - - [ ] 전역 상태 객체 생성 (예: 현재 로그인한 사용자 정보) |
55 | | -- [ ] 상태 변경 함수 구현 |
56 | | - - [ ] 상태 업데이트 시 관련 컴포넌트 리렌더링 |
57 | | - |
58 | | -#### 6) 이벤트 처리 및 DOM 조작: |
59 | | -- [ ] 사용자 입력 처리 (로그인 폼, 프로필 수정 등) |
60 | | -- [ ] 동적 컨텐츠 렌더링 (사용자 정보 표시, 페이지 전환 등) |
61 | | - |
62 | | -#### 7) 라우팅 예외 처리: |
63 | | -- [ ] 잘못된 라우트 접근 시 404 페이지 표시 |
| 15 | +#### 상품목록 |
| 16 | + |
| 17 | +**상품 목록 로딩** |
| 18 | + |
| 19 | +- [ ] 페이지 접속 시 로딩 상태가 표시된다 |
| 20 | +- [ ] 데이터 로드 완료 후 상품 목록이 렌더링된다 |
| 21 | +- [ ] 로딩 실패 시 에러 상태가 표시된다 |
| 22 | +- [ ] 에러 발생 시 재시도 버튼이 제공된다 |
| 23 | + |
| 24 | +**상품 목록 조회** |
| 25 | + |
| 26 | +- [ ] 각 상품의 기본 정보(이미지, 상품명, 가격)가 카드 형태로 표시된다 |
| 27 | + |
| 28 | +**한 페이지에 보여질 상품 수 선택** |
| 29 | + |
| 30 | +- [ ] 드롭다운에서 10, 20, 50, 100개 중 선택할 수 있으며 기본 값은 20개 이다. |
| 31 | +- [ ] 선택 변경 시 즉시 목록에 반영된다 |
| 32 | + |
| 33 | +**상품 정렬 기능** |
| 34 | + |
| 35 | +- [ ] 상품을 가격순/이름순으로 오름차순/내림차순 정렬을 할 수 있다. |
| 36 | +- [ ] 드롭다운을 통해 정렬 기준을 선택할 수 있다 |
| 37 | +- [ ] 정렬 변경 시 즉시 목록에 반영된다 |
| 38 | + |
| 39 | +**무한 스크롤 페이지네이션** |
| 40 | + |
| 41 | +- [ ] 페이지 하단 근처 도달 시 다음 페이지 데이터가 자동 로드된다 |
| 42 | +- [ ] 스크롤에 따라 계속해서 새로운 상품들이 목록에 추가된다 |
| 43 | +- [ ] 새 데이터 로드 중일 때 로딩 인디케이터와 스켈레톤 UI가 표시된다 |
| 44 | +- [ ] 홈 페이지에서만 무한 스크롤이 활성화된다 |
| 45 | + |
| 46 | +**상품을 장바구니에 담기** |
| 47 | + |
| 48 | +- [ ] 각 상품에 장바구니 추가 버튼이 있다 |
| 49 | +- [ ] 버튼 클릭 시 해당 상품이 장바구니에 추가된다 |
| 50 | +- [ ] 추가 완료 시 사용자에게 알림이 표시된다 |
| 51 | + |
| 52 | +**상품 검색** |
| 53 | + |
| 54 | +- [ ] 상품명 기반 검색을 위한 텍스트 입력 필드가 있다 |
| 55 | +- [ ] 검색 버튼 클릭으로 검색이 수행된다 |
| 56 | +- [ ] Enter 키로 검색이 수행된다 |
| 57 | +- [ ] 검색어와 일치하는 상품들만 목록에 표시된다 |
| 58 | + |
| 59 | +**카테고리 선택** |
| 60 | + |
| 61 | +- [ ] 사용 가능한 카테고리들을 선택할 수 있는 UI가 제공된다 |
| 62 | +- [ ] 선택된 카테고리에 해당하는 상품들만 표시된다 |
| 63 | +- [ ] 전체 상품 보기로 돌아갈 수 있다 |
| 64 | +- [ ] 2단계 카테고리 구조를 지원한다 (1depth, 2depth) |
| 65 | + |
| 66 | +**카테고리 네비게이션** |
| 67 | + |
| 68 | +- [ ] 현재 선택된 카테고리 경로가 브레드크럼으로 표시된다 |
| 69 | +- [ ] 브레드크럼의 각 단계를 클릭하여 상위 카테고리로 이동할 수 있다 |
| 70 | +- [ ] "전체" > "1depth 카테고리" > "2depth 카테고리" 형태로 표시된다 |
| 71 | + |
| 72 | +**현재 상품 수 표시** |
| 73 | + |
| 74 | +- [ ] 현재 조건에서 조회된 총 상품 수가 화면에 표시된다 |
| 75 | +- [ ] 검색이나 필터 적용 시 상품 수가 실시간으로 업데이트된다 |
| 76 | + |
| 77 | +#### 장바구니 |
| 78 | + |
| 79 | +**장바구니 모달** |
| 80 | + |
| 81 | +- [ ] 장바구니 아이콘 클릭 시 모달 형태로 장바구니가 열린다 |
| 82 | +- [ ] X 버튼이나 배경 클릭으로 모달을 닫을 수 있다 |
| 83 | +- [ ] ESC 키로 모달을 닫을 수 있다 |
| 84 | +- [ ] 모달에서 장바구니의 모든 기능을 사용할 수 있다 |
| 85 | + |
| 86 | +**장바구니 수량 조절** |
| 87 | + |
| 88 | +- [ ] 각 장바구니 상품의 수량을 증가할 수 있다 |
| 89 | +- [ ] 각 장바구니 상품의 수량을 감소할 수 있다 |
| 90 | +- [ ] 수량 변경 시 총 금액이 실시간으로 업데이트된다 |
| 91 | + |
| 92 | +**장바구니 삭제** |
| 93 | + |
| 94 | +- [ ] 각 상품에 삭제 버튼이 배치되어 있다 |
| 95 | +- [ ] 삭제 버튼 클릭 시 해당 상품이 장바구니에서 제거된다 |
| 96 | + |
| 97 | +**장바구니 선택 삭제** |
| 98 | + |
| 99 | +- [ ] 각 상품에 선택을 위한 체크박스가 제공된다 |
| 100 | +- [ ] 선택 삭제 버튼이 있다 |
| 101 | +- [ ] 체크된 상품들만 일괄 삭제된다 |
| 102 | + |
| 103 | +**장바구니 전체 선택** |
| 104 | + |
| 105 | +- [ ] 모든 상품을 한 번에 선택할 수 있는 마스터 체크박스가 있다 |
| 106 | +- [ ] 전체 선택 시 모든 상품의 체크박스가 선택된다 |
| 107 | +- [ ] 전체 해제 시 모든 상품의 체크박스가 해제된다 |
| 108 | + |
| 109 | +**장바구니 비우기** |
| 110 | + |
| 111 | +- [ ] 장바구니에 있는 모든 상품을 한 번에 삭제할 수 있다 |
| 112 | + |
| 113 | +#### 상품 상세 |
| 114 | + |
| 115 | +**상품 클릭시 상세 페이지 이동** |
| 116 | + |
| 117 | +- [ ] 상품 목록에서 상품 이미지나 상품 정보 클릭 시 상세 페이지로 이동한다 |
| 118 | +- [ ] URL이 `/product/{productId}` 형태로 변경된다 |
| 119 | +- [ ] 상품의 자세한 정보가 전용 페이지에서 표시된다 |
| 120 | + |
| 121 | +**상품 상세 페이지 기능** |
| 122 | + |
| 123 | +- [ ] 상품 이미지, 설명, 가격 등의 상세 정보가 표시된다 |
| 124 | +- [ ] 전체 화면을 활용한 상세 정보 레이아웃이 제공된다 |
| 125 | + |
| 126 | +**상품 상세 - 장바구니 담기** |
| 127 | + |
| 128 | +- [ ] 상품 상세 페이지에서 해당 상품을 장바구니에 추가할 수 있다 |
| 129 | +- [ ] 페이지 내에서 수량을 선택하여 장바구니에 추가할 수 있다 |
| 130 | +- [ ] 수량 증가/감소 버튼이 제공된다 |
| 131 | + |
| 132 | +**관련 상품 기능** |
| 133 | + |
| 134 | +- [ ] 상품 상세 페이지에서 관련 상품들이 표시된다 |
| 135 | +- [ ] 같은 카테고리(category2)의 다른 상품들이 관련 상품으로 표시된다 |
| 136 | +- [ ] 관련 상품 클릭 시 해당 상품의 상세 페이지로 이동한다 |
| 137 | +- [ ] 현재 보고 있는 상품은 관련 상품에서 제외된다 |
| 138 | + |
| 139 | +**상품 상세 페이지 내 네비게이션** |
| 140 | + |
| 141 | +- [ ] 상품 상세에서 상품 목록으로 돌아가는 버튼이 제공된다 |
| 142 | +- [ ] 브레드크럼을 통해 카테고리별 상품 목록으로 이동할 수 있다 |
| 143 | +- [ ] SPA 방식으로 페이지 간 이동이 부드럽게 처리된다 |
| 144 | + |
| 145 | +#### 사용자 피드백 시스템 |
| 146 | + |
| 147 | +**토스트 메시지** |
| 148 | + |
| 149 | +- [ ] 장바구니 추가 시 성공 메시지가 토스트로 표시된다 |
| 150 | +- [ ] 장바구니 삭제, 선택 삭제, 전체 삭제 시 알림 메시지가 표시된다 |
| 151 | +- [ ] 토스트는 3초 후 자동으로 사라진다 |
| 152 | +- [ ] 토스트에 닫기 버튼이 제공된다 |
| 153 | +- [ ] 토스트 타입별로 다른 스타일이 적용된다 (success, info, error) |
64 | 154 |
|
65 | 155 | ### 심화과제 |
66 | 156 |
|
67 | | -#### 1) 해시 라우터 구현 |
68 | | -- [ ] location.hash를 이용하여 SPA 라우터 구현 |
69 | | - - [ ] '/#/' (홈 페이지) |
70 | | - - [ ] '/#/login' (로그인 페이지) |
71 | | - - [ ] '/#/profile' (프로필 페이지) |
72 | | - |
73 | | -#### 2) 라우트 가드 구현 |
74 | | -- [ ] 로그인 상태에 따른 접근 제어 |
75 | | -- [ ] 비로그인 사용자의 특정 페이지 접근 시 로그인 페이지로 리다이렉션 |
| 157 | +#### SPA 네비게이션 및 URL 관리 |
| 158 | + |
| 159 | +**페이지 이동** |
| 160 | + |
| 161 | +- [ ] 어플리케이션 내의 모든 페이지 이동(뒤로가기/앞으로가기를 포함)은 하여 새로고침이 발생하지 않아야 한다. |
| 162 | + |
| 163 | +**상품 목록 - URL 쿼리 반영** |
| 164 | + |
| 165 | +- [ ] 검색어가 URL 쿼리 파라미터에 저장된다 |
| 166 | +- [ ] 카테고리 선택이 URL 쿼리 파라미터에 저장된다 |
| 167 | +- [ ] 상품 옵션이 URL 쿼리 파라미터에 저장된다 |
| 168 | +- [ ] 정렬 조건이 URL 쿼리 파라미터에 저장된다 |
| 169 | +- [ ] 조건 변경 시 URL이 자동으로 업데이트된다 |
| 170 | +- [ ] URL을 통해 현재 검색/필터 상태를 공유할 수 있다 |
| 171 | + |
| 172 | +**상품 목록 - 새로고침 시 상태 유지** |
| 173 | + |
| 174 | +- [ ] 새로고침 후 URL 쿼리에서 검색어가 복원된다 |
| 175 | +- [ ] 새로고침 후 URL 쿼리에서 카테고리가 복원된다 |
| 176 | +- [ ] 새로고침 후 URL 쿼리에서 옵션 설정이 복원된다 |
| 177 | +- [ ] 새로고침 후 URL 쿼리에서 정렬 조건이 복원된다 |
| 178 | +- [ ] 복원된 조건에 맞는 상품 데이터가 다시 로드된다 |
| 179 | + |
| 180 | +**장바구니 - 새로고침 시 데이터 유지** |
| 181 | + |
| 182 | +- [ ] 장바구니 내용이 브라우저에 저장된다 |
| 183 | +- [ ] 새로고침 후에도 이전 장바구니 내용이 유지된다 |
| 184 | +- [ ] 장바구니의 선택 상태도 함께 유지된다 |
| 185 | + |
| 186 | +**상품 상세 - URL에 ID 반영** |
| 187 | + |
| 188 | +- [ ] 상품 상세 페이지 이동 시 상품 ID가 URL 경로에 포함된다 (`/product/{productId}`) |
| 189 | +- [ ] URL로 직접 접근 시 해당 상품의 상세 페이지가 자동으로 로드된다 |
76 | 190 |
|
77 | | -#### 3) 이벤트 위임 |
| 191 | +**상품 상세 - 새로고침시 유지** |
78 | 192 |
|
79 | | -- [ ] 이벤트 위임 방식으로 이벤트를 관리하고 있다. |
| 193 | +- [ ] 새로고침 후에도 URL의 상품 ID를 읽어서 해당 상품 상세 페이지가 유지된다 |
| 194 | + |
| 195 | +**404 페이지** |
| 196 | + |
| 197 | +- [ ] 존재하지 않는 경로 접근 시 404 에러 페이지가 표시된다 |
| 198 | +- [ ] 홈으로 돌아가기 버튼이 제공된다 |
| 199 | + |
| 200 | +#### AI로 한 번 더 구현하기 |
| 201 | + |
| 202 | +- [ ] 기존에 구현한 기능을 AI로 다시 구현한다. |
| 203 | +- [ ] 이 과정에서 직접 가공하는 것은 최대한 지양한다. |
80 | 204 |
|
81 | 205 | ## 과제 셀프회고 |
82 | 206 |
|
83 | 207 | <!-- 과제에 대한 회고를 작성해주세요 --> |
84 | 208 |
|
85 | 209 | ### 기술적 성장 |
| 210 | + |
86 | 211 | <!-- 예시 |
87 | 212 | - 새로 학습한 개념 |
88 | 213 | - 기존 지식의 재발견/심화 |
89 | 214 | - 구현 과정에서의 기술적 도전과 해결 |
90 | 215 | --> |
91 | 216 |
|
92 | | -### 코드 품질 |
| 217 | +### 자랑하고 싶은 코드 |
| 218 | + |
| 219 | +<!-- 예시 |
| 220 | +- 특히 만족스러운 구현 |
| 221 | +- 리팩토링이 필요한 부분 |
| 222 | +- 코드 설계 관련 고민과 결정 |
| 223 | +--> |
| 224 | + |
| 225 | +### 개선이 필요하다고 생각하는 코드 |
| 226 | + |
93 | 227 | <!-- 예시 |
94 | 228 | - 특히 만족스러운 구현 |
95 | 229 | - 리팩토링이 필요한 부분 |
96 | 230 | - 코드 설계 관련 고민과 결정 |
97 | 231 | --> |
98 | 232 |
|
99 | 233 | ### 학습 효과 분석 |
| 234 | + |
100 | 235 | <!-- 예시 |
101 | 236 | - 가장 큰 배움이 있었던 부분 |
102 | 237 | - 추가 학습이 필요한 영역 |
103 | 238 | - 실무 적용 가능성 |
104 | 239 | --> |
105 | 240 |
|
106 | 241 | ### 과제 피드백 |
| 242 | + |
107 | 243 | <!-- 예시 |
108 | 244 | - 과제에서 모호하거나 애매했던 부분 |
109 | 245 | - 과제에서 좋았던 부분 |
110 | 246 | --> |
111 | 247 |
|
| 248 | +### AI 활용 경험 공유하기 |
| 249 | + |
| 250 | +<!-- 예시 |
| 251 | +- 사용한 AI 도구 (예: ChatGPT, Copilot, Claude, Cursor, ...) |
| 252 | +- 프롬프트를 작성한 과정 |
| 253 | +- AI가 일을 더 잘 하게 만든 방법 |
| 254 | +- 내가 작성한 코드와 비교하기 |
| 255 | +--> |
| 256 | + |
112 | 257 | ## 리뷰 받고 싶은 내용 |
113 | 258 |
|
114 | 259 | <!-- |
|
0 commit comments