Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
caecb93
feat: 기본 코드 추가
JunilHwang Sep 26, 2025
2ce5f31
feat: 컴포넌트 분리 1차 (상품 목록)
Jihoon-Yoon96 Nov 9, 2025
2c5fa33
fix: setupTests.js 수정
Jihoon-Yoon96 Nov 10, 2025
be02ae2
feat: 컴포넌트 분리 2차 (상품 목록)
Jihoon-Yoon96 Nov 10, 2025
e1504cb
feat: 스토어 구현 + 옵저버 패턴(상품 전역 관리)
Jihoon-Yoon96 Nov 10, 2025
3f9dcab
feat: 레이아웃 + 렌더링 구조 설계
Jihoon-Yoon96 Nov 11, 2025
0c0c9c7
fix: ProductListPage.js 구조 수정
Jihoon-Yoon96 Nov 11, 2025
39a2ae2
feat: 컴포넌트 분리 1차 (상품 목록)
Jihoon-Yoon96 Nov 9, 2025
9f11ea0
feat: 컴포넌트 분리 2차 (상품 목록)
Jihoon-Yoon96 Nov 10, 2025
e6ad20c
feat: 스토어 구현 + 옵저버 패턴(상품 전역 관리)
Jihoon-Yoon96 Nov 10, 2025
400367b
feat: 레이아웃 + 렌더링 구조 설계
Jihoon-Yoon96 Nov 11, 2025
50cd376
fix: ProductListPage.js 구조 수정
Jihoon-Yoon96 Nov 11, 2025
1af609a
Merge remote-tracking branch 'origin/main'
Jihoon-Yoon96 Nov 11, 2025
04497de
refactor: 카테고리 받아오기
Jihoon-Yoon96 Nov 11, 2025
d449a37
refactor: searchForm.js 컴포넌트 분리 (검색 / 브레드크럼 / 카테고리 / 옵션)
Jihoon-Yoon96 Nov 11, 2025
5c8bd82
refactor: 이벤트 별 쿼리 업데이트 로직 추가 (검색 / 브레드크럼 / 카테고리 / 옵션)
Jihoon-Yoon96 Nov 11, 2025
0c44238
refactor: 쿼리에 맞춰 상품 목록 그리기 (앞으로가기, 뒤로가기 적용 X)
Jihoon-Yoon96 Nov 11, 2025
ddd59f1
fix: 상품 목록 조회 API payload 갱신 안됨 이슈 해결
Jihoon-Yoon96 Nov 12, 2025
8ba7135
refactor: 라이프싸이클 구조 + intersectionObserver 구현(무한스크롤)
Jihoon-Yoon96 Nov 12, 2025
e79f384
docs: 과제 명세 템플릿 수정
Jihoon-Yoon96 Nov 12, 2025
e45d380
docs: 과제 명세 진행상황 업데이트
Jihoon-Yoon96 Nov 12, 2025
dc9955a
docs: 과제 명세 진행상황 PR 템플릿 업데이트
Jihoon-Yoon96 Nov 12, 2025
99dc770
feat: 상품 목록 에러케이스 추가
Jihoon-Yoon96 Nov 12, 2025
9e06397
feat: 장바구니 기능 초안 (UI + 스토어)
Jihoon-Yoon96 Nov 12, 2025
0dfe23c
feat: 장바구니 기능 유틸 함수
Jihoon-Yoon96 Nov 12, 2025
537fa6a
feat: 장바구니 기능 연동
Jihoon-Yoon96 Nov 12, 2025
b1c64a7
docs: 설명 추가
Jihoon-Yoon96 Nov 12, 2025
e12b625
feat: 장바구니 담기
Jihoon-Yoon96 Nov 12, 2025
90fbc1b
refactor: 장바구니 데이터 포맷 정리
Jihoon-Yoon96 Nov 12, 2025
01dd6ea
docs: "장바구니 담기" 이벤트 리스너 사라지는 원인 찾기
Jihoon-Yoon96 Nov 13, 2025
e70fc23
refactor: "장바구니 담기" 이벤트 리스너 오류 해결 1 (레이아웃 구조 분리)
Jihoon-Yoon96 Nov 13, 2025
ad6081f
refactor: "장바구니 담기" 이벤트 리스너 오류 해결 2 (장바구니 이벤트 유리 함수 분리)
Jihoon-Yoon96 Nov 13, 2025
bc19e38
refactor: "장바구니 담기" 버튼 클릭 시, 내부 이벤트로직 오류 수정 (새 상품을 등록해도 반영이 제대로 안되고 있었음)
Jihoon-Yoon96 Nov 13, 2025
33ec57a
refactor: cart.js 데이터 포멧 통일 (price -> lprice / id -> productId)
Jihoon-Yoon96 Nov 13, 2025
802faa4
refactor: 장바구니 리렌더링 시 모달창 닫힘 이슈 수정(hidden 클래스를 넣을지 말지를 isCartOpen sta…
Jihoon-Yoon96 Nov 13, 2025
7c8fa4b
feat: 장바구니 내부에서 수량 증감 기능 추가
Jihoon-Yoon96 Nov 14, 2025
2d3963a
refactor: 장바구니 비우기 모달 닫힘 이슈 해결
Jihoon-Yoon96 Nov 14, 2025
38a3a18
refactor: 장바구니 "전체 선택/해제" 기능 수정
Jihoon-Yoon96 Nov 14, 2025
0edc87a
docs: 과제 명세 완료사항 업데이트
Jihoon-Yoon96 Nov 14, 2025
92f6669
feat: 장바구니 데이터 영속성 부여 (로컬스토리지에 저장/가져오기)
Jihoon-Yoon96 Nov 14, 2025
162b5b5
docs: 과제 명세 완료사항 업데이트
Jihoon-Yoon96 Nov 14, 2025
2a89e51
feat: toast 메세지 구조 설계 (toast 스토어, 렌더링함수, UI구조 수정)
Jihoon-Yoon96 Nov 14, 2025
f9415a6
feat: toast 메세지 기능 + 스토어데이터 연동
Jihoon-Yoon96 Nov 14, 2025
5666954
refactor: 장바구니 총 갯수 표기 수정
Jihoon-Yoon96 Nov 14, 2025
e4de3e5
docs: 과제명세 완료 항목 업데이트
Jihoon-Yoon96 Nov 14, 2025
1c2eec6
feat: 상품상세 레이아웃 초안
Jihoon-Yoon96 Nov 14, 2025
b98be0c
refactor: router.js - handlePathChange 내부 로직 변경안 반영
Jihoon-Yoon96 Nov 14, 2025
16f410f
refactor: 상품 상세 컴포넌트 분리
Jihoon-Yoon96 Nov 14, 2025
e9e2528
refactor: 상품목록 <--> 상품상세 라우터 연결
Jihoon-Yoon96 Nov 14, 2025
0ebcc3e
refactor: 관련 상품 목록 그리기
Jihoon-Yoon96 Nov 14, 2025
edddc66
refactor: 상품상세 -> 목록 돌아가기
Jihoon-Yoon96 Nov 14, 2025
c9e03f9
fix: ProductDetailPage.js 리렌더링 함수 리턴값 수정(async/await 때문에 Promise객체를 리…
Jihoon-Yoon96 Nov 14, 2025
0353149
docs: 과제 명세 완료 현황 업데이트 (마무리)
Jihoon-Yoon96 Nov 14, 2025
6477a03
refactor: 경로에 따라 헤더 문구 변경
Jihoon-Yoon96 Nov 14, 2025
65a7986
refactor: 기본 과제 테스트 통과
Jihoon-Yoon96 Nov 14, 2025
d760f4b
refactor: 404 페이지 문구 수정
Jihoon-Yoon96 Nov 14, 2025
5be4af8
refactor: 심화 과제 테스트 통과
Jihoon-Yoon96 Nov 14, 2025
f5d5ded
feat: 배포 설정
Jihoon-Yoon96 Nov 14, 2025
d2c2d27
fix: baseUrl설정 (배포 경로 맞추기)
Jihoon-Yoon96 Nov 14, 2025
8db9b2f
fix: baseUrl설정 (msw 경로 수정)
Jihoon-Yoon96 Nov 14, 2025
80b9c80
fix: baseUrl설정 (헤더 리렌더링 시 "쇼핑몰" or "상품 상세" 결정)
Jihoon-Yoon96 Nov 14, 2025
b906c26
fix: baseUrl설정 (심화과제 테스트 소스 반영)
Jihoon-Yoon96 Nov 14, 2025
b64e089
진짜 끝git push origin main 고생했다~
Jihoon-Yoon96 Nov 14, 2025
323c49e
fix: pnpm 버전 지정 삭제 (CI 실패뜸)
Jihoon-Yoon96 Nov 14, 2025
47c54ce
fix: pnpm 버전 지정 복구 (이번엔 배포 실패..)
Jihoon-Yoon96 Nov 14, 2025
21e073e
fix: pnpm 버전 지정 복구
Jihoon-Yoon96 Nov 14, 2025
559adbc
fix: pnpm 버전 통일 (yml, package.json)
Jihoon-Yoon96 Nov 14, 2025
c626793
fix: pnpm 버전 통일 (제발 좀 되라..)
Jihoon-Yoon96 Nov 14, 2025
d871a09
fix: pnpm 버전 통일 (ci에 버전 지정 삭제)
Jihoon-Yoon96 Nov 14, 2025
c8cbb9d
fix: pnpm 버전 특정 삭제
Jihoon-Yoon96 Nov 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
175 changes: 88 additions & 87 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,190 +16,191 @@

**상품 목록 로딩**

- [ ] 페이지 접속 시 로딩 상태가 표시된다
- [ ] 데이터 로드 완료 후 상품 목록이 렌더링된다
- [ ] 로딩 실패 시 에러 상태가 표시된다
- [ ] 에러 발생 시 재시도 버튼이 제공된다
- [x] 페이지 접속 시 로딩 상태가 표시된다
- [x] 데이터 로드 완료 후 상품 목록이 렌더링된다
- [x] 로딩 실패 시 에러 상태가 표시된다
- [x] 에러 발생 시 재시도 버튼이 제공된다

**상품 목록 조회**

- [ ] 각 상품의 기본 정보(이미지, 상품명, 가격)가 카드 형태로 표시된다
- [x] 각 상품의 기본 정보(이미지, 상품명, 가격)가 카드 형태로 표시된다

**한 페이지에 보여질 상품 수 선택**

- [ ] 드롭다운에서 10, 20, 50, 100개 중 선택할 수 있으며 기본 값은 20개 이다.
- [ ] 선택 변경 시 즉시 목록에 반영된다
- [x] 드롭다운에서 10, 20, 50, 100개 중 선택할 수 있으며 기본 값은 20개 이다.
- [x] 선택 변경 시 즉시 목록에 반영된다

**상품 정렬 기능**

- [ ] 상품을 가격순/이름순으로 오름차순/내림차순 정렬을 할 수 있다.
- [ ] 드롭다운을 통해 정렬 기준을 선택할 수 있다
- [ ] 정렬 변경 시 즉시 목록에 반영된다
- [x] 상품을 가격순/인기순으로 오름차순/내림차순 정렬을 할 수 있다.
- [x] 드롭다운을 통해 정렬 기준을 선택할 수 있다
- [x] 정렬 변경 시 즉시 목록에 반영된다

**무한 스크롤 페이지네이션**

- [ ] 페이지 하단 근처 도달 시 다음 페이지 데이터가 자동 로드된다
- [ ] 스크롤에 따라 계속해서 새로운 상품들이 목록에 추가된다
- [ ] 새 데이터 로드 중일 때 로딩 인디케이터와 스켈레톤 UI가 표시된다
- [ ] 홈 페이지에서만 무한 스크롤이 활성화된다
- [x] 페이지 하단 근처 도달 시 다음 페이지 데이터가 자동 로드된다
- [x] 스크롤에 따라 계속해서 새로운 상품들이 목록에 추가된다
- [x] 새 데이터 로드 중일 때 로딩 인디케이터와 스켈레톤 UI가 표시된다
- [x] 홈 페이지에서만 무한 스크롤이 활성화된다

**상품을 장바구니에 담기**

- [ ] 각 상품에 장바구니 추가 버튼이 있다
- [ ] 버튼 클릭 시 해당 상품이 장바구니에 추가된다
- [ ] 추가 완료 시 사용자에게 알림이 표시된다
- [x] 각 상품에 장바구니 추가 버튼이 있다
- [x] 버튼 클릭 시 해당 상품이 장바구니에 추가된다
- [x] 추가 완료 시 사용자에게 알림이 표시된다

**상품 검색**

- [ ] 상품명 기반 검색을 위한 텍스트 입력 필드가 있다
- [ ] Enter 키로 검색이 수행된다
- [ ] 검색어와 일치하는 상품들만 목록에 표시된다
- [x] 상품명 기반 검색을 위한 텍스트 입력 필드가 있다
- [x] 검색 버튼 클릭으로 검색이 수행된다
- [x] Enter 키로 검색이 수행된다
- [x] 검색어와 일치하는 상품들만 목록에 표시된다

**카테고리 선택**

- [ ] 사용 가능한 카테고리들을 선택할 수 있는 UI가 제공된다
- [ ] 선택된 카테고리에 해당하는 상품들만 표시된다
- [ ] 전체 상품 보기로 돌아갈 수 있다
- [ ] 2단계 카테고리 구조를 지원한다 (1depth, 2depth)
- [x] 사용 가능한 카테고리들을 선택할 수 있는 UI가 제공된다
- [x] 선택된 카테고리에 해당하는 상품들만 표시된다
- [x] 전체 상품 보기로 돌아갈 수 있다
- [x] 2단계 카테고리 구조를 지원한다 (1depth, 2depth)

**카테고리 네비게이션**

- [ ] 현재 선택된 카테고리 경로가 브레드크럼으로 표시된다
- [ ] 브레드크럼의 각 단계를 클릭하여 상위 카테고리로 이동할 수 있다
- [ ] "전체" > "1depth 카테고리" > "2depth 카테고리" 형태로 표시된다
- [x] 현재 선택된 카테고리 경로가 브레드크럼으로 표시된다
- [x] 브레드크럼의 각 단계를 클릭하여 상위 카테고리로 이동할 수 있다
- [x] "전체" > "1depth 카테고리" > "2depth 카테고리" 형태로 표시된다

**현재 상품 수 표시**

- [ ] 현재 조건에서 조회된 총 상품 수가 화면에 표시된다
- [ ] 검색이나 필터 적용 시 상품 수가 실시간으로 업데이트된다
- [x] 현재 조건에서 조회된 총 상품 수가 화면에 표시된다
- [x] 검색이나 필터 적용 시 상품 수가 실시간으로 업데이트된다

#### 장바구니

**장바구니 모달**

- [ ] 장바구니 아이콘 클릭 시 모달 형태로 장바구니가 열린다
- [ ] X 버튼이나 배경 클릭으로 모달을 닫을 수 있다
- [ ] ESC 키로 모달을 닫을 수 있다
- [ ] 모달에서 장바구니의 모든 기능을 사용할 수 있다
- [x] 장바구니 아이콘 클릭 시 모달 형태로 장바구니가 열린다
- [x] X 버튼이나 배경 클릭으로 모달을 닫을 수 있다
- [x] ESC 키로 모달을 닫을 수 있다
- [x] 모달에서 장바구니의 모든 기능을 사용할 수 있다

**장바구니 수량 조절**

- [ ] 각 장바구니 상품의 수량을 증가할 수 있다
- [ ] 각 장바구니 상품의 수량을 감소할 수 있다
- [ ] 수량 변경 시 총 금액이 실시간으로 업데이트된다
- [x] 각 장바구니 상품의 수량을 증가할 수 있다
- [x] 각 장바구니 상품의 수량을 감소할 수 있다
- [x] 수량 변경 시 총 금액이 실시간으로 업데이트된다

**장바구니 삭제**

- [ ] 각 상품에 삭제 버튼이 배치되어 있다
- [ ] 삭제 버튼 클릭 시 해당 상품이 장바구니에서 제거된다
- [x] 각 상품에 삭제 버튼이 배치되어 있다
- [x] 삭제 버튼 클릭 시 해당 상품이 장바구니에서 제거된다

**장바구니 선택 삭제**

- [ ] 각 상품에 선택을 위한 체크박스가 제공된다
- [ ] 선택 삭제 버튼이 있다
- [ ] 체크된 상품들만 일괄 삭제된다
- [x] 각 상품에 선택을 위한 체크박스가 제공된다
- [x] 선택 삭제 버튼이 있다
- [x] 체크된 상품들만 일괄 삭제된다

**장바구니 전체 선택**

- [ ] 모든 상품을 한 번에 선택할 수 있는 마스터 체크박스가 있다
- [ ] 전체 선택 시 모든 상품의 체크박스가 선택된다
- [ ] 전체 해제 시 모든 상품의 체크박스가 해제된다
- [x] 모든 상품을 한 번에 선택할 수 있는 마스터 체크박스가 있다
- [x] 전체 선택 시 모든 상품의 체크박스가 선택된다
- [x] 전체 해제 시 모든 상품의 체크박스가 해제된다

**장바구니 비우기**

- [ ] 장바구니에 있는 모든 상품을 한 번에 삭제할 수 있다
- [x] 장바구니에 있는 모든 상품을 한 번에 삭제할 수 있다

#### 상품 상세

**상품 클릭시 상세 페이지 이동**

- [ ] 상품 목록에서 상품 이미지나 상품 정보 클릭 시 상세 페이지로 이동한다
- [ ] URL이 `/product/{productId}` 형태로 변경된다
- [ ] 상품의 자세한 정보가 전용 페이지에서 표시된다
- [x] 상품 목록에서 상품 이미지나 상품 정보 클릭 시 상세 페이지로 이동한다
- [x] URL이 `/product/{productId}` 형태로 변경된다
- [x] 상품의 자세한 정보가 전용 페이지에서 표시된다

**상품 상세 페이지 기능**

- [ ] 상품 이미지, 설명, 가격 등의 상세 정보가 표시된다
- [ ] 전체 화면을 활용한 상세 정보 레이아웃이 제공된다
- [x] 상품 이미지, 설명, 가격 등의 상세 정보가 표시된다
- [x] 전체 화면을 활용한 상세 정보 레이아웃이 제공된다

**상품 상세 - 장바구니 담기**

- [ ] 상품 상세 페이지에서 해당 상품을 장바구니에 추가할 수 있다
- [ ] 페이지 내에서 수량을 선택하여 장바구니에 추가할 수 있다
- [ ] 수량 증가/감소 버튼이 제공된다
- [x] 상품 상세 페이지에서 해당 상품을 장바구니에 추가할 수 있다
- [x] 페이지 내에서 수량을 선택하여 장바구니에 추가할 수 있다
- [x] 수량 증가/감소 버튼이 제공된다

**관련 상품 기능**

- [ ] 상품 상세 페이지에서 관련 상품들이 표시된다
- [ ] 같은 카테고리(category2)의 다른 상품들이 관련 상품으로 표시된다
- [ ] 관련 상품 클릭 시 해당 상품의 상세 페이지로 이동한다
- [ ] 현재 보고 있는 상품은 관련 상품에서 제외된다
- [x] 상품 상세 페이지에서 관련 상품들이 표시된다
- [x] 같은 카테고리(category2)의 다른 상품들이 관련 상품으로 표시된다
- [x] 관련 상품 클릭 시 해당 상품의 상세 페이지로 이동한다
- [x] 현재 보고 있는 상품은 관련 상품에서 제외된다

**상품 상세 페이지 내 네비게이션**

- [ ] 상품 상세에서 상품 목록으로 돌아가는 버튼이 제공된다
- [ ] 브레드크럼을 통해 카테고리별 상품 목록으로 이동할 수 있다
- [ ] SPA 방식으로 페이지 간 이동이 부드럽게 처리된다
- [x] 상품 상세에서 상품 목록으로 돌아가는 버튼이 제공된다
- [x] 브레드크럼을 통해 카테고리별 상품 목록으로 이동할 수 있다
- [x] SPA 방식으로 페이지 간 이동이 부드럽게 처리된다

#### 사용자 피드백 시스템

**토스트 메시지**

- [ ] 장바구니 추가 시 성공 메시지가 토스트로 표시된다
- [ ] 장바구니 삭제, 선택 삭제, 전체 삭제 시 알림 메시지가 표시된다
- [ ] 토스트는 3초 후 자동으로 사라진다
- [ ] 토스트에 닫기 버튼이 제공된다
- [ ] 토스트 타입별로 다른 스타일이 적용된다 (success, info, error)
- [x] 장바구니 추가 시 성공 메시지가 토스트로 표시된다
- [x] 장바구니 삭제, 선택 삭제, 전체 삭제 시 알림 메시지가 표시된다
- [x] 토스트는 3초 후 자동으로 사라진다
- [x] 토스트에 닫기 버튼이 제공된다
- [x] 토스트 타입별로 다른 스타일이 적용된다 (success, info, error)

### 심화과제

#### SPA 네비게이션 및 URL 관리

**페이지 이동**

- [ ] 어플리케이션 내의 모든 페이지 이동(뒤로가기/앞으로가기를 포함)은 하여 새로고침이 발생하지 않아야 한다.
- [x] 어플리케이션 내의 모든 페이지 이동(뒤로가기/앞으로가기를 포함)은 하여 새로고침이 발생하지 않아야 한다.

**상품 목록 - URL 쿼리 반영**

- [ ] 검색어가 URL 쿼리 파라미터에 저장된다
- [ ] 카테고리 선택이 URL 쿼리 파라미터에 저장된다
- [ ] 상품 옵션이 URL 쿼리 파라미터에 저장된다
- [ ] 정렬 조건이 URL 쿼리 파라미터에 저장된다
- [ ] 조건 변경 시 URL이 자동으로 업데이트된다
- [ ] URL을 통해 현재 검색/필터 상태를 공유할 수 있다
- [x] 검색어가 URL 쿼리 파라미터에 저장된다
- [x] 카테고리 선택이 URL 쿼리 파라미터에 저장된다
- [x] 상품 옵션이 URL 쿼리 파라미터에 저장된다
- [x] 정렬 조건이 URL 쿼리 파라미터에 저장된다
- [x] 조건 변경 시 URL이 자동으로 업데이트된다
- [x] URL을 통해 현재 검색/필터 상태를 공유할 수 있다

**상품 목록 - 새로고침 시 상태 유지**

- [ ] 새로고침 후 URL 쿼리에서 검색어가 복원된다
- [ ] 새로고침 후 URL 쿼리에서 카테고리가 복원된다
- [ ] 새로고침 후 URL 쿼리에서 옵션 설정이 복원된다
- [ ] 새로고침 후 URL 쿼리에서 정렬 조건이 복원된다
- [ ] 복원된 조건에 맞는 상품 데이터가 다시 로드된다
- [x] 새로고침 후 URL 쿼리에서 검색어가 복원된다
- [x] 새로고침 후 URL 쿼리에서 카테고리가 복원된다
- [x] 새로고침 후 URL 쿼리에서 옵션 설정이 복원된다
- [x] 새로고침 후 URL 쿼리에서 정렬 조건이 복원된다
- [x] 복원된 조건에 맞는 상품 데이터가 다시 로드된다

**장바구니 - 새로고침 시 데이터 유지**

- [ ] 장바구니 내용이 브라우저에 저장된다
- [ ] 새로고침 후에도 이전 장바구니 내용이 유지된다
- [ ] 장바구니의 선택 상태도 함께 유지된다
- [x] 장바구니 내용이 브라우저에 저장된다
- [x] 새로고침 후에도 이전 장바구니 내용이 유지된다
- [x] 장바구니의 선택 상태도 함께 유지된다

**상품 상세 - URL에 ID 반영**

- [ ] 상품 상세 페이지 이동 시 상품 ID가 URL 경로에 포함된다 (`/product/{productId}`)
- [ ] URL로 직접 접근 시 해당 상품의 상세 페이지가 자동으로 로드된다
- [x] 상품 상세 페이지 이동 시 상품 ID가 URL 경로에 포함된다 (`/product/{productId}`)
- [x] URL로 직접 접근 시 해당 상품의 상세 페이지가 자동으로 로드된다

**상품 상세 - 새로고침시 유지**

- [ ] 새로고침 후에도 URL의 상품 ID를 읽어서 해당 상품 상세 페이지가 유지된다
- [x] 새로고침 후에도 URL의 상품 ID를 읽어서 해당 상품 상세 페이지가 유지된다

**404 페이지**

- [ ] 존재하지 않는 경로 접근 시 404 에러 페이지가 표시된다
- [ ] 홈으로 돌아가기 버튼이 제공된다
- [x] 존재하지 않는 경로 접근 시 404 에러 페이지가 표시된다
- [x] 홈으로 돌아가기 버튼이 제공된다

#### AI로 한 번 더 구현하기

- [ ] 기존에 구현한 기능을 AI로 다시 구현한다.
- [ ] 이 과정에서 직접 가공하는 것은 최대한 지양한다.
- [x] 기존에 구현한 기능을 AI로 다시 구현한다.
- [x] 이 과정에서 직접 가공하는 것은 최대한 지양한다.

## 과제 셀프회고

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,4 @@ jobs:
run: |
pnpm install
pnpm exec playwright install
pnpm run test:e2e:advanced
pnpm run test:e2e:advanced
51 changes: 51 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Deploy to GitHub Pages

on:
push: # push trigger
branches:
- main
- feature-* # Feature 브랜치도 배포

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: "pages"
cancel-in-progress: true

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.0.0

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "pnpm"

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build
run: pnpm run build

- name: Setup Pages
uses: actions/configure-pages@v4

- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: "./dist"

- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
4 changes: 3 additions & 1 deletion e2e/E2EHelpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@ export class E2EHelpers {

// 상품을 장바구니에 추가
async addProductToCart(productName) {
await this.page.waitForTimeout(500);
await this.page.click(
`text=${productName} >> xpath=ancestor::*[contains(@class, 'product-card')] >> .add-to-cart-btn`,
);
await this.page.waitForSelector("text=장바구니에 추가되었습니다", { timeout: 5000 });
await this.page.waitForTimeout(500);
await this.page.waitForSelector("text=장바구니에 상품이 추가되었습니다", { timeout: 5000 });
}

// 장바구니 모달 열기
Expand Down
Loading