- 원하는 상품(키워드) 혹은 카테고리 기반 쿠팡 상품 정보 및 경쟁률을 파악할 수 있는 플랫폼
- 구매대행 시장 내 점유율 및 동향을 파악하기 위한 플랫폼
사용자가 상품 키워드 혹은 카테고리 검색 시 쿠팡 크롤링을 통해 상품 경쟁력을 분석한 후 데이터를 제공하는 플랫폼
기간 : 2024-04 ~ 2024-05 (약 2개월)
인원 : 프론트엔드(1명) : 변재정 / 백엔드(1명) : 오찬솔
React
- 데이터 조회기능이 주된 역할인 본 프로젝트에서 Virtual Dom은 효율적으로 변경사항를 업데이트 해줍니다.
- 방대한 생태계 기반 다양한 정보와 라이브러리 활용 가능
- 라이브러리에 최적화된 개발 인터페이스를 제공
- 손쉬운 컴포넌트 재사용성 및 라이브러리 자체 유연성, 호환성 뛰어납니다.
Typescript
- 안정적인 개발과 높은 수준의 코드 품질을 유지
- 손쉽운 버그 예방
- 강력한 타입 시스템 기반 컴파일, 버그 예방 및 손쉬운 디버깅
- 높은 생산성과 호환성
Styled Components
- CSS 파일을 별도 관리할 필요없는 CSS-in-JS 방법
- CSS 컴포넌트화로 CSS 모델을 문서 레벨이 아닌 컴포넌트 레벨로 추상화. (모듈성 이점)
- JavaScript와 CSS 사이의 상수와 함수를 쉽게 공유 가능
- 유니크한 클래스를 자동으로 생성하기 때문에 코드 경량화 및 클래스 작명 고충 해소
Vite
- ES build를 사용해서 종속성을 미리 묶어 번들링 속도가 매우 빠릅니다.
- HMR(Hot Module Replacement)을 이용해 애플리케이션을 다시 시작하지 않고도 일부 컨텐츠만을 갱신.
- 즉 소스코드 수정 시 번들링과정을 다시 거치는 것이 아닌 수정된 모듈 관련 부분만 교체 이후, 브라우저에서 해당 모듈을 요청하면 교체된 모듈을 전달.
- HTTP 헤더를 활용하여 전체 페이지의 로드 속도 향상 + 캐시 기능 제공
Redux
- 코드의 유지보수성 향상
- 액션에 따른 모든 변경을 추적 가능
- 작업효율 극대화
- 편리하고 강력한 개발자도구 지원
- 매우 가볍습니다. (의존 라이브러리 포함 2kB)
react-hook-form
- 제어 컴포넌트에서만 다룰 수 있는 실시간 유효성 검사 및 동기화를 비제어 컴포넌트 형식으로 제공.
- 제어 컴포넌트를 사용할 때 보다 훨씬 적은 코드로 더 나은 성능 제공.
- 비제어 컴포넌트 기반 리렌더링을 최소화 -> 마운팅 속도 향상.
- 종속성이 없는 경량 사이즈 라이브러리.
- 타입스크립트 기본 제공
- 공식문서가 정말 친절하게 설명되어있습니다.
- 지속적인 업데이트
React-Query
- 타 라이브러리 대비 적은 양의 BoilerPlate -> 간편, 유지 보수 용이
- React Hooks과 유사한 인터페이스 제공
- 비동기 과정을 선언적으로 관리 가능
- 오래된 데이터 상태 파악 후 업데이트 가능 (캐싱 기능)
- 캐싱을 통해 애플리케이션 속도 향상 및 중복 데이터 요청 제거
Vercel
- 정말 간편한 배포과정
- 빌트인 CI/CD, Live Preview, Analytics, 사이트 성능 측정 제공
- 홈 화면 : 키워드 기반 검색, 카테고리 기반 검색 분류
- 상품조회 : 사용자가 선택한 상품 필터링 후 출력
- 상품조회 필터링 : Query-String 기반 날짜, 상품개수, 상품 가격 필더링 기능 구현
- 상품페이지 접속 : 조회된 상품 상세페이지 접속 가능
- 카테고리 리스트 렌더링 : 1차, 2차, 3차 카테고리별 동적 렌더링 구현
- 조회 데이터 엑셀다운로드 : 불러온 상품 관련 데이터를 엑셀파일로 저장 가능
- 1차, 2차, 3차 카테고리 컴포넌트 구현
- 상위 카테고리 값에 따라 하위 카테고리 컴포넌트 목록이 동적으로 달라지도록 구현
- 상위 -> 하위 카테고리 이동 시 해당 카테고리 값 화살표 아이콘 고정 표시
- 1차 카테고리 컴포넌트 hover -> 2차 카테고리 컴포넌트 렌더링, 2차 카테고리 컴포넌트 hover -> 3차 카테고리 컴포넌트 hover
- 2차 -> 1차 카테고리 hover 시 3차 카테고리 컴포넌트 unmount
- 카테고리 컨포넌트 영역 이탈 시 모든 컴포넌트 unmount
- 카테고리 값 선택 시 상위 카테고리 값 같이 렌더링
- 정규표현식을 활용해 숫자 외 값 입력시 공백으로 즉시 변환
- 자연수 외 값을 입력 후 데이터 조회 시 에러를 발생시키므로 에러 사전 차단
- transition, transform 속성을 이용한 애니메이션 적용
- pseudo-element 를 활용해 툴팁 content 제작
- content를 props로 전달해 동적 메시지 구현
- React Hook Form 을 통해 비제어 컴포넌트 형식으로 실시간 유효성 검증
- register, watch 함수를 이용해 실시간 input값 감시
- CSVLink 라이브러리 활용 엑셀 다운로드 기능 구현
- createPortal을 이용해 Modal 창을 DOM의 다른 위치에서 렌더링 되도록 구현
- 부모 컴포넌트의 DOM 구조를 벗어나 특정 DOM 엘리먼트에 직접 렌더링
- Modal content값을 props로 넘겨 동적 메시지 렌더링
- 카테고리 미선택 시 알림창 렌더링
- 최소가격이 최대가격보다 클 경우 알림창 렌더링
- 최소가격 미입력, 최대가격이 10000보다 작을 경우 알림창 렌더링
- 키워드 미입력시 알림창 렌더링
- 최소가격이 최대가격보다 클 경우 알림창 렌더링
- 최소가격 미입력, 최대가격이 10000보다 작을 경우 알림창 렌더링
- 버튼 클릭 시 물파장 애니메이션 구현
- keyframes, pseudo-element 를 활용해 클릭 이벤트 발생 시 동적 애니메이션 구현
- 드롭박스 -> 컴포넌트 hover 방식 (reference : 쿠팡 )
- 드롭박스는 별도로 클릭해야하기에 번거롭다는 클라이언트의 요청이 있어 hover 방식으로 리팩토링을 진행했습니다.
- onMouseOver, onMouseLeavee 등 커서 이벤트 관련 함수를 공부하며 새로운 기술적 도전을 이룩할 수 있었습니다.
문제점
- 쿼리스트링으로 데이터조회필터링값이 전달되지만 해당 url을 복사 후 새창에서 열면 데이터를 불러오지않는 문제 발생
- 필터링값들을 쿼리스트링으로 전달하기만 할뿐 데이터를 불러오는 컴포넌트가 Result가 아닌 것이 문제
- 부모컴포넌트에서 데이터를 조회 한 후 props 로 전달하는 방식이라 생긴 문제
해결방법
- 상품조회 버튼 클릭시 필터링 값을 쿼리스트링으로 전달
- url파라미터 값이 변경되면 Result 컴포넌트가 재렌더링되도록 useEffect 의존성 배열에 쿼리스트링값을 넣어줬습니다.
- spinner 컴포넌트 -> skeleton UI 변경
- BootStrap에서 가져온
spinner
컴포넌트를 로딩창으로 사용하다 너무 단조롭다 생각해 동적이미지인skeleton UI
를 도입하기로 했습니다. - 불러오는 데이터를 Table 형식으로 보여주는 것에 맞춰 커스터마이징한
skeleton UI
를 제작하면서 가상요소에 대한 기술적 도전 및 학습하는 시간을 가졌습니다.