파펨 클론 1차 프로젝트
1차프로젝트의 목표
프로젝트 시작전 나의 목표는 다음과 같았다. 특히 전체적으로 결과물에 대한 기대보다는 실제로 동료랑 협업하면서 개발하는건 어떨까? 가장 대표적인 웹사이트인 쇼핑몰의 사이클은 어떨까? 라는 궁금증이 컸었다.
- 이때까지 배운부분에서 조금이라도 나은 결과물을 만들것
- 개발에서의 협업이랑 어떤것일지 느껴보기
- 특정 업무/기능을 받았을때 어떻게 헤쳐나갈지 깊게 고민 해보기
프로젝트 내 역할 / 목표
Main Page, Detail, Navigation을 구현하면서 이때까지 배웠던 기능을 총 복습하고 Props,State를 완벽 숙지하는것을 목표로 했고, 백엔드와의 전체 흐름을 파악하려고 노력하였다.
BASENOTE Front-end/Back-end 소개
Find Your Scent, 가장 나다운 향을 찾아드립니다.
- 향수 판매 사이트 파펨 클론 프로젝트
💁♀️💁♂️ 팀원
📆 프로젝트 기간
2021.07.05 ~ 2021.07.23 (19일)
🔑 Skills
FrontEnd : React, ReactRouter, SASS, Javascript
BackEnd : Node.js, Nodemon, Express, Prisma, Bcrypt, JSWONWebTokens, Babel, MySQL
공통 : GIT, ESLint, Prettier
🛠 Tool
Working Tools : Trello, Slack, GitHub, Postman
💎 필수 구현 사항
■ 공통
- 네비게이션
- Footer
■ 메인 페이지
- 메인 페이지에 나타나는 동영상
- 메인 비주얼 이미지 슬라이드 기능
■ 상품 리스트 페이지
- 상품 리스트의 상품 필터링 기능
- 상품 리스트의 상품 카테고리 탭 기능
■ 상품 상세 페이지
- 상품 이미지 슬라이더 기능
- 상품 상세정보 출력
- 상품 수량 변경
- 장바구니에 담기 기능
■ 장바구니 관련
- 장바구니에 담은 상품 조회
- 장바구니 내 상품 수량 변경 기능
- 장바구니 내 상품 삭제 기능
- 장바구니 내 상품이 3만원 이상일 때, 배송비를 0원으로 출력
■ 로그인/회원가입 관련
- 로그인 기능
- 회원가입 기능
구현 기능 상세
1. 메인페이지 구현 사항
-
메인 레이아웃
사진보다 직관적으로 원하는 바를 전달할 수 있는 동영상을 이용한 UI에 항상 관심이 많아 구현할수 있어 기뻤다. 보다 다채롭게 브랜드의 이미지를 보여줄 수 있어 파펨에 가장 맞는 상쾌하고 감각적인 영상을 삽입했다.- 동영상 삽입
- Review - 상품 연동
-
네비게이션바
마우스 Hover시 메뉴별로 다르게 썸네일을 나오게 하기위해 배열로 데이터를 담아 State를 이용하여 구현하였다. State기능에 대해 한층 깊게 이해할 수 있어 좋았다.
또한, 용량별로 다른 end-point를 주기위해 동적 라우팅 기능을 사용하였다.- 카테고리 hover시, 썸네일이 나오는 기능
- react-Router을 사용한 동적 라우팅 구현
2. 상세페이지
백엔드와 어떠한 방식으로 연결되는지 알게 된 좋은 기회였다. 시간이 촉박해 백엔드 작업에는 참여하지못한것이 아쉽지만, 프론트엔드도 백에서 어떻게 값을 받아와야할지 알아야한다는 점에서 백엔드도 놓아서는 안될것 같다. 차차 백엔드도 공부해 나가야지.
- 수량을 변경할 시 가격도 동시에 변경
- 드랍다운을 이용한 추가 옵션 선택
- react-router를 사용해 상품 용량에 따른 동적 라우팅 구현
기억에 남기고 싶은 Code
-
코딩을 하는 기본이유 : 중복하는 일을 줄이기 위해
-> 기본적인 이유를 망각한채 기능 구현에만 매달려 함수를 중복해서 사용하였다. 리팩토링 기간을 가지면서 더욱 효율적인 코드로 변모 시키기 위해 같은 기능을 하는 함수들을 하나로 묶어 중복을 없앴다. -
2D --> 3D코드로 변신
-> 단순히 State-> Set state라는 관점에서 벗어나 인덱스를 활용해 중복되는 함수를 줄일 수 있었다.
class TopNavHiddenMenu extends Component { constructor() { super(); this.state = { index: -1, }; } showThumbnail = index => { this.setState({ index, }); }; //Index를 인자로 이용하여 콜백함수에 접근 hideThumbnail = () => { this.setState({ index: -1, }); }; render() { const { hiddenCard, index } = this.state; return ( <> <div className={hiddenCard ? 'hiddenCard cardInactive' : 'hiddenCard'}> {index >= 0 && ( <> <img className="hiddenCardImage" src={sideMenuImageTitles.images[index]} alt="참고사진" /> <span className="hiddenCardDescription"> {sideMenuImageTitles.titles[index]} </span> </> )} </div> </> ); } } export default TopNavHiddenMenu;
느낀점
--> Nav구현시 Nav레이아웃 부터 장바구니 아이콘 연결/ 썸네일 표시 추가구현 기능까지 한호흡에 끝까지 완성하려고하니 다른 팀원들과의 업무와 병목현상도 생기고, 데드라인에 쫓기는 와중에 일을 빨리빨리 쳐내기가 힘들었다.
- Agile의 필요성을 절실히 느꼈다. 마음은 모든 기능을 구현하고싶지만, 많은 기능을 구현하기보다 빨리 구현하고 보완하고 아니면 버리고 다시 시작할수 있는 Agile의 힘을 느꼈다.
- Agile하게 진행하면서도 전체적인 그림을 잘그려 나가야 중간에 숨어있는 Blocker들을 피할 수 있다는 점. 이부분은 경험이 쌓여가면서 채워질것이라 믿는다.
- 다른 팀원들의 진행사항도 파악을 잘해야 중간에 발생할 수 있는 병목현상을 막을수 있다.
다음 프로젝트에 반영하고 싶은점
- 처음이라 조금 쫄아서 진행했던점이 있어 더 즐거울수 있었던 부분들을 놓친 것 같다. 책임을 다하는 한도내에 즐기면서 진행하자 :)
- 팀원과 진행사항에 대한 소통을 더 늘리자.
- 막연히 기능구현을 하는건 의미가 없는것 같다. 더욱 이쁜 코드로 내가, 남이 잘알아 볼수있게 더욱 명확하고 깔끔한 코드를 짜보고 싶다.
- Style-Component, Hook을 이용해 더욱 발전된 코드를 짜고싶다.
*GitHub Link
Frontend : https://github.com/wecode-bootcamp-korea/fullstack1-1st-BaseNote-frontend
Backend : https://github.com/wecode-bootcamp-korea/fullstack1-1st-BaseNote-backend
Author And Source
이 문제에 관하여(파펨 클론 1차 프로젝트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kms0206/파펨향수-클론-1차-프로젝트저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)