Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

KDT5 10조 과제 제출 #11

Open
wants to merge 144 commits into
base: main
Choose a base branch
from
Open

KDT5 10조 과제 제출 #11

wants to merge 144 commits into from

Conversation

jinu6262
Copy link

@jinu6262 jinu6262 commented Jul 2, 2023

패스트캠퍼스 FE 5기 10조 👆

프로젝트 소개 👀

저희 10조는 올리브영을 벤치마킹한 팀 프로젝트 입니다.
본 과제는 패스트캠퍼스 측에서 제공한 API를 이용하여 만들어졌습니다.
개발 진행 일정 : 2023.05.31 - 2023.07.02

기술 스택

Environment

Config

Development

Communication


팀원 소개

팀원 남기훈 김진우 김승주 김가은
대표 이미지
깃허브 @BearHumanS @jinu6262 @kimseungju511 @KIMKAEUN
담당 [메인페이지]
- 배너
- 카테고리
[카테고리 페이지]
[상세 페이지]
[결제 페이지]
[API정리]
[마이페이지]
- 계좌관리
[검색 결과 페이지]
<zustand 전역상태관리>
[로그인 페이지]
[회원가입 페이지]
[마이페이지]
- 주문 조회
- 회원정보 수정
[관리자 페이지]
- 유저 리스트
- 제품 등록
- 제품 관리
[장바구니 페이지]
<라우터 설정>
<GitHub 관리>
[메인페이지]
- 헤더
[메인페이지]
- 푸터
<자료조사>

페이지 기능

[메인페이지]

  • Header(헤더)
    • 로고
    • 검색기능
    • 로그인 페이지 이동 및 UI 동적 변화(로그인 시에 로그아웃 가능)
    • 장바구니 페이지 이동
  • Banner(배너)
    • slick-carousel을 사용하여 배너 슬라이드 구성
    • 카테고리 별 기대효과 설명
  • Cartegory 제품 및 Category 페이지 이동
    • slick-carousel을 사용하여 제품 슬라이드 구성
    • 카테고리 클릭 시, 카테고리 별 페이지로 이동
    • 제품 클릭 시, 제품 상세 페이지로 이동
  • Footer(푸터)

[로그인 페이지]

  • 로그인 기능 및 회원 가입 페이지로 이동

[회원가입 페이지]

  • 회원가입 기능

[마이 페이지]

  • 마이 페이지
    • 로그아웃 기능
  • 장바구니
    • 장바구니 이동
  • 결제 정보
    • 계좌 추가 및 삭제, 조회 기능
  • 주문 조회
    • 구매한 제품 조회 및 구매 취소, 승인 기능
  • 회원정보 수정
    • 이름, 프로필, 비밀번호 수정 기능

[카테고리 페이지]

  • 카테고리 별 제품 구성 나열
  • 제품 클릭 시 제품 상세 페이지로 이동
  • 가격 높, 낮이 순으로 조절 기능

[제품 상세 페이지]

  • 클릭 한 제품의 id값을 url파라미터로 가져와서 제품 렌더링 (useParams 사용)
  • 제품 이미지 및 제품 상세 정보 이미지
  • 제품 정보 제공 및 구매 수량 조절 (제품 가격 * 제품 수량 = 합계 금액 출력)
  • 합계 금액이 0이면, 장바구니 및 결제하기 버튼 비활성화
  • 장바구니로 보낼 정보를 localStorage를 이용 (장바구니 페이지로 이동)
  • zustand로 제품 정보 및 제품 수량 전역으로 상태관리

[결제 페이지]

  • 로그인 인증 확인
  • 단일 제품 정보 호출
  • 결제 계좌 조회
  • daum-postcode를 사용 (modal state를 이용해서 사용)
  • zustand로 전역상태관리 중에 새로고침을 하면 state값이 초기화 되어서 경고창 출력
  • 장바구니에서 전역으로 관리하는 products state의 값을 단일 제품 API를 사용하기 전에 productIds라는 변수로 배열을 생성
    • 장바구니에서 products로 전역상태관리를 해서 amount값을 가져옴
    • 기존 엔드포인트 요청 값에는 제품의 갯수는 없음
  • 제품의 id값으로 단일 제품 API 호출 후에 amount값을 포함, products state에 새롭게 값 저장
  • 입력 form에 미입력 시 결제 버튼 비활성화
  • slick-carousel을 사용하여 결제 계좌 슬라이드로 구성
    • 결제 수단이 없을 시에 버튼 UI가 동적으로 변환 (결제 수단 추가 페이지로 이동하는 버튼)
  • 결제 시 제품의 구매 수량 만큼 결제관련 API 호출

[마이 페이지]




<계좌관리>

  • 계좌 관련 API를 이용
    • 은행 목록 조회
    • 계좌 추가
    • 계좌 삭제
    • 계좌 조회
  • modal을 이용해서 계좌 추가 폼
    • 은행 목록 조회 및 계좌 번호 생성, 연락처 입력, 개인정보 동의

<주문 조회>

  • 결제 내역관련 주문 조회 기능

<회원 정보 수정>

  • 사용자 이름, 프로필 및 비밀번호 수정 기능

[관리자 페이지]

  • 관리자로 로그인 시에 관리자 페이지로 이동
    • 도텐브 파일로 관리자 이메일 관리
    • 관리자 페이지에서 관리자 이메일 확인
  • 가입한 사용자 목록 확인
  • 제품 추가 기능 폼
  • 제품 관리 기능

[장바구니 페이지]

  • 로컬스토리지에 저장된 장바구니 관련 key를 확인하고 value값을 가져옴
  • 전역으로 상태관리하여 결제창으로 제품들의 정보와 구매 수량을 확인
메인페이지 모든제품
카테고리별 상품 상품 검색
상품 상세 페이지 장바구니
주문 조회 결제창
계좌 조회 / 해지 계좌 추가
회원 정보 수정 로그인
회원가입 사용자 목록
제품 추가 제품 관리

Copy link
Member

@GyoHeon GyoHeon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

총평

어려운 상황에서 적은 인원으로 프로젝트를 착실히 수행하시느라 수고하셨습니다.

아쉬운 점

배포된 프로덕트의 코드에 console.log가 너무 많이 남아있습니다.
코드 상에서는 console.log가 없도록 하는 것이 좋습니다.
또한, 어떤 컴포넌트에서는 css를 사용하고 어떤 컴포넌트에서는 css in js를 사용하는 것이 아쉽습니다.
프로젝트에서는 컨벤션을 맞추는 것이 아주 중요합니다.

state를 효율적으로 관리하지 못하는 부분이 조금 있습니다.
관리하는 state의 수를 최소화 하는 것이 유지보수 측면에서 유리합니다.

모두 고생하셨습니다.

Comment on lines +13 to +15
onClick={e => {
e.preventDefault()
}}>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

특별한 경우가 아니라면 a 태그에 onClick은 달지 않는 것이 좋습니다.
접근성 측면에서 좋지 않습니다.

참고: https://developer.mozilla.org/ko/docs/Web/HTML/Element/a#onclick_%EC%9D%B4%EB%B2%A4%ED%8A%B8

onClick={e => {
e.preventDefault()
}}>
회사소개 ㅣ 채용안내 ㅣ 상품입점 및 제휴문의 ㅣ 고객센터
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

평행적인 요소는 모두 분리된 li 태그안에 담는 것이 좋습니다.


<div className="footer-sections">
<div className="footer-left">
<div className="footer-logo">
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 태그는 필요없습니다.
어차피 img 하나만 감싸고 있으므로 스타일을 잘 적용하여 DOM depth를 줄이는 것이 좋습니다.

</ul>
</div>

<div className="footer-sections">
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style 적용에 통일성이 부족합니다.
어떤 컴포넌트는 css, 어떤 컴포넌트는 css in js를 사용하는데, 한 프로젝트에서는 스타일을 전부 통일하는 것이 좋습니다.

navigate('/product/search')
return
}
const header_LoginCheck = async () => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

함수는 모두 camel case를 사용합니다.
컨벤션을 지키는 것도 중요합니다.

Comment on lines +22 to +31
onChange={e => {
if (item === 'price') {
const { value } = e.target
const onlyNumber = value.replace(/[^0-9]/g, '')
setTest(onlyNumber)
} else {
setTest(e.target.value)
}
console.log(test)
}}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

함수는 위에서 선언해주세요.
가독성을 크게 해칩니다.

Comment on lines +15 to +16
const [placeholderText, setPlaceholderText] =
useState('추가할 은행을 선택해주세요.')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

능동적으로 사용자의 선택에 의해 바뀌는 데이터가 아닌 경우 상수를 이용하는 것이 오타를 줄이고 재사용성을 높일 수 있습니다.

@@ -0,0 +1,446 @@
import React, { useEffect, useState, useRef } from 'react'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

일단 컴포넌트가 너무 거대합니다.
더 분할할수 있을지 고려해보고 작은 컴포넌트의 조합으로 만드는 작업이 필요해보입니다.

Comment on lines +24 to +34
const [deliveryMessage, setDeliveryMessage] = useState('')
const [postalCode, setPostalCode] = useState('')
const [address, setAddress] = useState('')
const [showPostcodeModal, setShowPostcodeModal] = useState(false)
const [isLoggedIn, setIsLoggedIn] = useState(false)
const [accountList, setAccountList] = useState([])
const [recipientName, setRecipientName] = useState('')
const [phoneNumber, setPhoneNumber] = useState('')
const [addressDetail, setAddressDetail] = useState('')
const [isFormValid, setIsFormValid] = useState(false)
const [selectAccount, setSelectAccount] = useState('')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isFormValid의 경우 다른 데이터에서 계산 가능한 값이고, 다른 state들도 하나의 객체로 관리할 수 있어 보입니다.
관리할 상태의 증가는 유지보수를 어렵게 하고 휴먼에러의 확률을 높입니다.

state는 최소한의 갯수를 유지하도록 고려해보세요.

Comment on lines +151 to +157
const settings = {
dots: true,
infinite: true,
speed: 1000,
slidesToShow: 1,
slidesToScroll: 1
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이런 상수 데이터 역시 굳이 컴포넌트 안에서 선언할 필요가 없습니다.

Copy link
Member

@GyoHeon GyoHeon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

총평

어려운 상황에서 적은 인원으로 프로젝트를 착실히 수행하시느라 수고하셨습니다.

아쉬운 점

배포된 프로덕트의 코드에 console.log가 너무 많이 남아있습니다.
코드 상에서는 console.log가 없도록 하는 것이 좋습니다.
또한, 어떤 컴포넌트에서는 css를 사용하고 어떤 컴포넌트에서는 css in js를 사용하는 것이 아쉽습니다.
프로젝트에서는 컨벤션을 맞추는 것이 아주 중요합니다.

state를 효율적으로 관리하지 못하는 부분이 조금 있습니다.
관리하는 state의 수를 최소화 하는 것이 유지보수 측면에서 유리합니다.

모두 고생하셨습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants