Skip to content

Commit 5e62bbd

Browse files
committed
feat: 기본 코드 추가
1 parent 7509a9c commit 5e62bbd

23 files changed

Lines changed: 5690 additions & 369 deletions

.github/pull_request_template.md

Lines changed: 207 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -4,111 +4,256 @@
44

55
<!--
66
배포 링크를 적어주세요
7-
예시: https://<username>.github.io/front-5th-chapter1-1/
7+
예시: https://<username>.github.io/front-7th-chapter2-1/
88
99
배포가 완료되지 않으면 과제를 통과할 수 없습니다.
1010
배포 후에 정상 작동하는지 확인해주세요.
1111
-->
1212

13-
1413
### 기본과제
1514

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)
64154

65155
### 심화과제
66156

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로 직접 접근 시 해당 상품의 상세 페이지가 자동으로 로드된다
76190

77-
#### 3) 이벤트 위임
191+
**상품 상세 - 새로고침시 유지**
78192

79-
- [ ] 이벤트 위임 방식으로 이벤트를 관리하고 있다.
193+
- [ ] 새로고침 후에도 URL의 상품 ID를 읽어서 해당 상품 상세 페이지가 유지된다
194+
195+
**404 페이지**
196+
197+
- [ ] 존재하지 않는 경로 접근 시 404 에러 페이지가 표시된다
198+
- [ ] 홈으로 돌아가기 버튼이 제공된다
199+
200+
#### AI로 한 번 더 구현하기
201+
202+
- [ ] 기존에 구현한 기능을 AI로 다시 구현한다.
203+
- [ ] 이 과정에서 직접 가공하는 것은 최대한 지양한다.
80204

81205
## 과제 셀프회고
82206

83207
<!-- 과제에 대한 회고를 작성해주세요 -->
84208

85209
### 기술적 성장
210+
86211
<!-- 예시
87212
- 새로 학습한 개념
88213
- 기존 지식의 재발견/심화
89214
- 구현 과정에서의 기술적 도전과 해결
90215
-->
91216

92-
### 코드 품질
217+
### 자랑하고 싶은 코드
218+
219+
<!-- 예시
220+
- 특히 만족스러운 구현
221+
- 리팩토링이 필요한 부분
222+
- 코드 설계 관련 고민과 결정
223+
-->
224+
225+
### 개선이 필요하다고 생각하는 코드
226+
93227
<!-- 예시
94228
- 특히 만족스러운 구현
95229
- 리팩토링이 필요한 부분
96230
- 코드 설계 관련 고민과 결정
97231
-->
98232

99233
### 학습 효과 분석
234+
100235
<!-- 예시
101236
- 가장 큰 배움이 있었던 부분
102237
- 추가 학습이 필요한 영역
103238
- 실무 적용 가능성
104239
-->
105240

106241
### 과제 피드백
242+
107243
<!-- 예시
108244
- 과제에서 모호하거나 애매했던 부분
109245
- 과제에서 좋았던 부분
110246
-->
111247

248+
### AI 활용 경험 공유하기
249+
250+
<!-- 예시
251+
- 사용한 AI 도구 (예: ChatGPT, Copilot, Claude, Cursor, ...)
252+
- 프롬프트를 작성한 과정
253+
- AI가 일을 더 잘 하게 만든 방법
254+
- 내가 작성한 코드와 비교하기
255+
-->
256+
112257
## 리뷰 받고 싶은 내용
113258

114259
<!--

.github/workflows/ci.yml

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,6 @@ on:
1111

1212
jobs:
1313
basic:
14-
runs-on: ubuntu-latest
15-
steps:
16-
- uses: actions/checkout@v3
17-
with:
18-
fetch-depth: 0
19-
ref: ${{ github.event.pull_request.head.sha }}
20-
- name: test basic
21-
run: |
22-
npm install
23-
npm run test:basic
24-
advacned:
2514
runs-on: ubuntu-latest
2615
steps:
2716
- uses: actions/checkout@v3
@@ -33,13 +22,13 @@ jobs:
3322
version: latest
3423
- uses: actions/setup-node@v4
3524
with:
36-
node-version: 20
25+
node-version: 22
3726
cache: 'pnpm'
38-
- name: advanced-test
39-
run: |
27+
- run: |
4028
pnpm install
41-
pnpm run test:advanced
42-
e2e:
29+
pnpm exec playwright install
30+
pnpm run test:e2e:basic
31+
advanced:
4332
timeout-minutes: 60
4433
runs-on: ubuntu-latest
4534
steps:
@@ -52,10 +41,10 @@ jobs:
5241
version: latest
5342
- uses: actions/setup-node@v4
5443
with:
55-
node-version: 20
44+
node-version: 22
5645
cache: 'pnpm'
5746
- name: Install dependencies
5847
run: |
5948
pnpm install
60-
npx playwright install --with-deps
61-
pnpm run test:e2e
49+
pnpm exec playwright install
50+
pnpm run test:e2e:advanced

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,5 @@ dist-ssr
2424
*.sw?
2525
/test-results/
2626
/playwright-report/
27+
coverage
28+
.coverage

.prettierrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"tabWidth": 2,
33
"semi": true,
4-
"singleQuote": false
4+
"singleQuote": false,
5+
"printWidth": 120
56
}

0 commit comments

Comments
 (0)