우리가 사용할 API는 사용자가 제품 구매, 결제를 하고 관리자는 제품 등록, 관리를 할 수 있게 만들어져있다. 그리고 디자인보다는 우리가 공부하고있는 개발에만 집중하기 위해 디자인이 완성되어있는 크림 사이트를 클론하기로 했다.
나를 포함한 총 4명
나는 사용자 검색 및 구매를 담당했다.
사용자 검색과 구매는 API만 보면 데이터 응답받아서 그냥 출력시켜주고 전송해주고 큰 어려움은 없어보였다. 그런데 우리는 완성된 디자인을 클론 하고있었다. 같은 디자인과 동일한 기능을 구현해야했다.
검색 기능 구현 중 가장 힘들었던 건 하나의 버튼이 여러 컴포넌트와 연동되어있는 것이다.
신발 x 신발 x 신발이 보인다. 그리고 숫자가 보인다.
카테고리는 중복이 안되고 한가지만 선택이 가능하다. 만약 사용자가 다른 카테고리를 선택하고서 버튼을 클릭했다면? 사용자 입장에서 기존에 선택했던 카테고리는 자동으로 꺼졌으면 할거다. 근데 카테고리는 너~무 많다..대분류, 중분류까지 있는데 전부 API에 전송해여할 갔이다. 모두 데이터화하기 난잡할거 같아 정리된 코딩을 하기위해 정말 오래 고민했다.
만족스럽지 못한 방법으로 모든 카테고리를 하나하나 데이터화 했다. 다뤄야하는 데이터가 많아서 조건문도 길고 for문도 적지않게 쓰인거같다. 그래서 머리아팠다...왠지 아직도 이 기능을 구현하는 간결한 코드가 존재할거라 믿는다.
크림을 따라하기 때문에 정말 똑같이 따라하지 않으면 퀄리티가 떨어져보여서 이런 UX는 놓치기 싫었다. 사용하는 API를 최대한 사용해서 따라해보려했고 카테고리 코드 양은 아쉽지만 결과는 만족스럽다.
필터 버튼 동작과 함께 데이터 요청도 보내서 응답 값을 화면에 출력했다. 응답 데이터 양도 꽤 되기 때문에 스토어에서 바로 가져와서 코드양을 줄였다.
데이터 타입에러가 지속적으로 발생했다. 돔이 형성 전에 미리 데이터를 응답 받아놓고 돔에서 데이터 바인딩을 통해 값을 출력하는 구조인데 데이터를 부르는 시기를 보면 에러가 발생하는 원인이 감도 안잡혔다. 왜냐면 타입에러가 떠도 값이 잘 불러졌다. 그러면 돔이 형성되고 바인딩된 데이터를 가져올때 에러가 한번 뜨고 다시 가져올때에 값이 나오는 경우니까 에러가 안뜨게 더 빨리 불러야하나? 싶었지만 created에서 불러오고 있어서 beforeCreate가 해법이 될 수 없었다.
타입에러는 언디파인드를 뱉고 있어서 불만이였다. 그래서 타입스크립트 타입 명시같이 데이터 초기화 값을 할당해줬다.
productInfo: {
title: '',
description: '',
price: '',
tags: []
}
바인딩되는 시기가 아니라 인내심이 문제였다. element에서 출력될 수 있는 데이터가 와야하는데 언디파인드가 뜨니까 참지못하고 "언디파인드가 오면 안돼!"라고 한거다. 그래서 언디파인드가 아니고 이런 타입이라고 알려줘서 인내심을 기르게 해줬다.😂
상세 페이지에는 완전히 따라하지는 못했다. 마감일이 다가오고있었고 우리의 목표는 API를 활용해 사용자가 주요 서비스를 사용할 수 있어야 했다. API가 제공하는 제품 데이터만 출력하고 디자인 구조를 위해 몇몇 요소를 더 추가하는 방식으로 진행했다. 그러면서 UX를 해치지 않도록 기존 크림에서처럼 필요한 UX, UI도 반영했다.
구매에서는 내가 짜놓은 구조에서 API로는 라우터 인증을 사용할 수 없었다. 그래서 직접 조건문을 넣어줬다. 사용자가 구매하기 위해서 계좌 데이터가 있어야한다. 그래서 계좌 데이터로 로그인 상태 검사를 했다. 로그인 계정만 있고 계좌를 만들지 않아도 빈 배열이 생성되기 때문에 null값의 조건을 걸었다. 제품 구매를 위해서는 3가지 검사를 통과해야 한다.
만들고 보니 살짝 구매 인증 단계가 부실한거 같기도 하다. 다음에는 더 탄탄하게 구조를 짜봐야겠다는 생각이 든다. 연결된 계좌가 없을 때에 더 뚜렷한 안내라던가 구매가 이뤄지지 않을때 어떤 문제인지 분류해 안내해주는 방식도 생각해볼 수 있다.
검색어는 헤더에서 출발해서 검색페이지를 이루는 2개의 컴포넌트로 전달되어야 했다. 그래서 로컬스토리지를 활용했다. 세션스토리지를 쓰지 않은 이유는 1개 데이터를 부르는 한가지 방식으로 두가지 활용을 하고싶었다.
사용자 입장에서는 다음에 들어왔을 때도 최근 검색어가 필요한 경우가 있을테니까 로컬스토리지가 좋겠다는 생각을 했다. 잘 구현하고 동작 시켜보니 헤더로 검색하지 않고 바로 검색페이지로 접근해도 최근 검색어로 검색된 제품들을 보여줬다. 그래서 세션스토리지를 활용해서 헤더 검색에서 왔는지를 검사하는 코드도 짰다.
이렇게 해서 내가 담당한 파트는 완성이 됐다. 더 많은 어려움들이 새롭게 겪었고 내 부족함이 많이 느껴졌던 프로젝트이다. 완전하지 않은 API를 쓰면서 백엔드와 협업도 생각해보고 팀 프로젝트하면서 git-flow를 꽤 좋게 사용하기도했다. 예상보다 깃플로우가 팀 협업을 많이 편하게 해줬다. 서로 소통하며 빌드하는 과정도 좋았고 팀플이라는 용어에 좋은 기억이 덮어진거 같아 팀원분들께 고맙다.