저번 프로젝트 때는 개발자가 구현해야 하는 필수적이고 기본적인 기능들 - (장바구니 기능, 캐러셀, 로그인, 상세페이지 등)을 구현해보면서 연습하기 위해 커머스 사이트의 구조를 가져와 프로젝트를 진행했다.
2주간의 짧은 프로젝트 기간동안 기획과 디자인까지 할 수는 없었기 때문에, 사이트 레이아웃/기획/디자인은 기존에 존재하는 커머스 사이트 하나를 선정해 유사하게 본따오기로 결정했고, 마켓컬리의 디자인을 필요한 부분만 가져와 커머스 사이트를 구현했다.
두번째 프로젝트는 조금 더 난이도를 높여 진행해보고 싶었다.
개발자로서 도전해볼 사항들이 조금 더 많은 서비스의 유형에는 어떤 것이 있을까? 이에 대해 다음과 같은 기준으로 생각해보았다.
에어비앤비, 마이리얼트립과 같은 숙박업체 중개 플랫폼 사이트는 상품을 필터링하고 다루기 위한 추가적인 기능들을 포함하고 있었다. 예를 들면,
백엔드 요청사항과 관리할 상탯값의 종류가 많아지는 만큼 간결하고 효율적인 코드와 util함수, 공통 컴포넌트 사용 등 프론트엔드 개발자로서 질 좋은 코드에 대한 고민을 많이 해볼 수 있을 것이라고 생각했다.
생필품을 주로 구매하는 커머스 사이트와 달리, 호캉스, 가족여행, 커플여행 등 다양한 목적으로 원하는 상품의 형태가 크게 달라지는 고관여 상품이기 때문에 UX 측면에서 고민해볼 여지가 더 많을 것이라고 느꼈다.
이전에는 라이브러리를 한번도 사용해본 적이 없었다.
순수 자바스크립트로 구현하며 실력을 키우고 싶었고, 단순히 쉽게 구현하기 위한 라이브러리 사용은 지양하고 싶었다.
그럼 왜 이번에는 라이브러리를 사용해보려 했을까?
실무에서는 라이브러리를 사용할 날이 당연히 오게 될텐데,
그 사용과 접근 방법에 대해 스스로 경험해보고 나름대로 고민해보고 싶었다.
이전에 리덕스의 개념과 사용법에 대해 조금은 공부해보았지만 제대로 알고 사용하지는 못했다. 리덕스 뿐 아니라 Recoil에 대해서도 궁금했는데,
알고 싶었고, Redux를 사용한다면 단순히 강의를 보고 따라치는 것이 아닌 직접 판단해 코드를 작성하면서 제대로 익혀보고 싶었다.
이러한 이유로, 숙박업체 중개 사이트를 선정해 만들어보기로 했다.
첫번째 프로젝트와 마찬가지로
2주간의 짧은 프로젝트 기간동안 기획과 디자인까지 시간을 할애하기는 어려웠기 때문에,
기존에 존재하는 사이트를 골라 구성과 디자인을 참고해 만들기로 했다.
에어비앤비와 마이리얼 트립이 가장 유명하긴 했지만, 단순히 참고할 레이아웃을 가져오기에 상대적으로 간결하고 깔끔한 스테이폴리오라는 사이트가 더 적합하다고 판단했다.
Recoil을 선택했던 이유는 다음과 같다.
전역상태관리를 도입할 필요성을 느꼈을 때는 프로젝트 기간이 1주일 남았던 시점이었다. 기초 세팅이 복잡하지 않았고, 프론트엔드 팀원들이 전역 상태관리에 대해 전혀 알지 못했기 때문에 이후에 함께 작업할 때 필요하다면 조금이라도 간편하게 배워 사용할 수 있어야 했다. 무엇보다 필요한 상태관리의 종류가 복잡하지 않았기 때문에 Recoil을 사용할 이유가 충분하다고 생각했다.
Recoil은 왜 '리액트스러운' 상태관리 라이브러리라고 불리는 것일까? 직접 사용해보면서 조금이나마 사용해보았던 Redux와 그 차이점을 비교해보고 싶었다.
Recoil은 각각의 atom에 전역으로 관리할 상탯값 하나를 포함하고, 필요한 곳에서 이를 구독하여 업데이트 하거나 값을 읽어 사용한다. 단순히 모달창을 끌지, 켤지, 어떤 모달창을 표시할지 등등의 상탯값을 관리하기에 적합하다고 생각했다.
처음에는 전혀 예상하지 못했던 부분인데, 스테이폴리오는 쿼리 스트링을 매우 적극적으로 사용하고 있었다. 쿼리 스트링이 결국 이 사이트의 핵심이었다.
스테이폴리오는 디자인과 기획만 가져올 예정이었기 때문에 똑같이 만들 필요는 없었다. 하지만 선택한 기간정보를 이동한 페이지에 넘겨주거나 많은 검색 항목이 모두 적용된 값을 관리하며 백엔드에 요청하는 부분에서 로직에 대한 고민이 필요했는데, 이 과정에서 기존 사이트에서는 어떻게 현업개발자들이 구현했는지 참고해보았다. 그리고 스테이폴리오와 같이 쿼리스트링을 적극적으로 사용해보기로 결정했다.
이전 프로젝트에서 팀의 성과를 높이는데 긍정적인 영향을 주었다고 생각한 부분을 이번 프로젝트 팀원들과 공유하고, 동일하게 틀을 잡았다.
백엔드 API 개발일정이 조금 늦춰지고, 담당하는 페이지의 비중이 많아지면서 한번에 많은 페이지를 구현하게 되었다. 이후에는 백엔드 통신과 전체 플로우를 맞춰보아야 했기 때문에 우선적으로 할 수 있는 개인적인 페이지 구현을 최대한 빠르게 진행했다. 그러다 보니 동시다발적으로 여러 브랜치에서 작업을 하게 되었다.
깃 충돌이 나지 않도록 잘 관리하려면
브랜치 병합 > master 브랜치 최신화
> 새로운 브랜치 작업 후 병합 > master 브랜치 최신화 ....
의 과정을 거치는 것이 가장 이상적일 것이라고 생각하는데, 약간의 시점 차이를 두고 동시에 작업한 브랜치는 머지할 때마다 충돌이 날 수 있으므로 한 브랜치에서 작업할 영역을 명확히 구분하고, 그 시점차이를 잘 정리해 작업하는 것이 중요했다.
개인적으로 생각하는 '좋은 회고'는, 이후에 팀원들이 아쉬웠던 점을 개선해 더 나은 팀워크를 발휘할 수 있도록 하는 시간이라고 생각한다.
잘한 점, 아쉬웠던 점, 앞으로 변화/시도할 점 3가지를 기준으로 회고를 진행했다. 팀원들 모두 적극적으로 참여해주었고 잘 진행되었다.
그리고 이번 프로젝트에서 진행한 회고미팅을 통해 회고를 어떻게 더 구체적이고 발전적인 시간으로 만들 수 있을지에 대한 고민도 하게 되었다.
'나 이번에 열심히 했던 것 같아'라는 느낌도 잘한점이 될 수 있고, '이번엔 많이 기여를 못한 것 같아'라는 생각도 아쉬운점이 될수 있다.
여기에 더해 보다 객관적이고 구체적인 지표로 개선점을 도출할 수 있는 회고가 되었으면 좋겠다!
촉박한 시간과 여러가지 변수로 인해 페이지 구현 자체에 급급했던 시간의 비중이 크다고 느껴 많이 아쉬웠다. 팀원들과 정말 핵심적인 부분의 코드는 조금이라도 함께 고민하고, util함수로 사용할 수 있는 여지는 있는지, 어떻게 함께 이 부분을 관리할지에 대해 적극적으로 고민해보고 싶어 나름대로 제안도 많이 했지만, 여러가지 여건 상 원하는 바를 이루지는 못했다.
이전에는 라이브러리보다 필요한 기능을 가능한 직접 구현해 실력을 키우고자 했는데, 이번에 라이브러리를 사용해보면서 시행착오를 거쳐 배운점들이 있었다.
특히, 달력 컴포넌트를 만들면서 여러 기능들을 커스터마이징하는데 어려움이 있었다. 기존에 사용했던 라이브러리는 hyper-server/react-date-range였는데, 달력의 형태나 사용할 수 있는 props들이 다음과 같은 로직을 구현하는데 충분하지 않았다.
- 예약 불가 날짜는 선택할 수 없도록 비활성화 처리
- 이미 지난 날짜까지는 선택할 수 없도록 비활성화 처리
- 선택한 기간에 예약 불가 날짜가 포함될 경우 기간 선택 초기화
- 현재 렌더된 월에 맞춰 예약 불가능한 날짜를 요청할 수 있도록 현재 표시된 월에 대한 정보 받아오기
라이브러리를 사용한다면, 다음과 같은 기준으로 충분히 탐색해보고 선택하려 한다.
이 기준에 부합하는 새로운 라이브러리를 찾아보았는데, airbnb에서 만든 react-dates 라이브러리가 적합해보였다. 시간이 된다면 이 라이브러리로 교체해 리팩토링을 진행해보려 한다.
한 달간 아래에서 언급할 새로운 공부들을 해내면서, 틈틈히 리팩토링을 진행해보고 싶다.
이 회고에서 언급한 부분들 부터 우선순위를 정해 진행해볼 예정이다.
프론트/ 백엔드가 함께 해결해야 하는 부분 (로그인 에러, 상세페이지 비활성화 날짜 요청 에러, 어드민 페이지 데이터 업데이트 요청 에러 등)은 그 날 조금 더 남아서 우선순위 순으로 함께 해결했다.
프론트 혹은 백엔드에서 각자 수정할 수 있는 부분 (날짜 타임존 수정, 어드민페이지 응답값에서 누락된 가격정보 추가, 잘못된 요청 수정 등) 은 따로 정리해둔 뒤 각자 이후에 수정해 반영하기로 결정했고, 우선순위와 담당자를 정해두었다.
즉, 내가 맡은 부분에 대한 수정사항은 가장 먼저 확인하고 반영해둘 예정이다.
(그 외)