Skip to content

0724 ​

Clone Coding ​

issue to project workflow ​

  • 매번 이슈에다가 프로젝트 추가하는게 귀찮아서 워크플로 파일 하나 추가함
  • add-to-project 라는 액션 라이브러리가 있어서 project-url과 github-token 만 설정하면 됨
yml
name: 이슈에 자동으로 프로젝트 추가  
on:  
  issues:  
    types: [opened]

jobs:  
  add-to-project:  
    runs-on: ubuntu-latest  
    steps:  
      - name: Add to project  
        uses: actions/add-to-project@v1.0.2  
        with:  
          project-url: https://github.com/users/dpwls02142/projects/3  
          github-token: ${{ secrets.PERSONAL_TOKEN }}

named export VS default export ​

  • named export는 import할 때 이름을 변경할 수 없음. 여러개를 export 할 수 있음.
  • default는 한 파일당 하나만 export 할 수 있고, export defualt 형태로 사용됨.
  • 해당 방식들은 es6 문법에서 새로 등장함
    • es6가 뭔데?
      • js의 역사에서 가장 큰 변화가 있던 6번째 버전
      • let, const와 import/export 모듈, 화살표 함수, class, promise, 템플릿 리터럴 등이 등장함
    • 그 전엔 어떻게 썼는데?
      • require와 module.export 방식으로
    • 지금은 왜 그 방식(require)을 안 쓰는데?
      • 코드가 실행되기 전까지 오류를 못 잡고 (ide에서 코드를 작성할 때 오류를 못 잡음. 무조건 pnpm run이든, build든 해야 오류를 잡을 수 있음.)
      • 트리 셰이킹이 안 돼서 불필요한 코드까지 번들에 포함됨
      • 그리고 require는 동기식 로딩이라 주로 서버 환경에서 쓰임. 브라우저 환경에 적합하지 못함
    • 그래서 등장한게 import/export임.
  • 그래서 named랑 default 둘 중엔 뭘 쓰는게 좋음?
    • 컴포넌트나 훅에는 named export,
    • 페이지에는 default export.
    • 왜 컴포넌트나 훅에는 named export?
      • 에디터에서 자동 완성 기능이 잘 동작함.
      • default로 export하면 협업시에 컴포넌트명을 지멋대로 바꿔서 쓸 수 있기에 헷갈릴 수 있음. 이를 방지해줌.
    • 왜 페이지에는 default export?
      • next.js는 page 파일을 자동으로 라우트로 매핑함. 근데 이 때
        1. named export 방식을 사용하고 있으며
        2. 여러개의 컴포넌트가 한 파일에 있다면
      • next.js 입장에선 어떤걸 써야 할 지 명확하지 않기에
      • 보통 page에선 default export를 쓰는게 권장됨.
  • 참고 자료

named export로 통일하며 생긴 고민 ​

  • gemini가 AddToCartQuantity를 cart 페이지에서도 사용하고 있다보니 해당 이름은 적절치 않아서 _shared 폴더로 이동하는게 더 나을 것 같다고 리뷰를 달아줌.
  • 근데 내 생각에 _shared 폴더에는 좀 더 범용적인, 정말 모든 컴포넌트에서 공유되는게 들어가는게 맞다고 생각했음. 확장가능성을 고려하더라도 어쨌든 option과 quanity는 product라는 도메인에 종속적인 컴포넌트라고 생각했음.
  • 그래서 더 생각해보니 애초에 product components로 옮기는게 좋을 것 같다고 판단해서 위치를 거기로 수정함.
  • 관련 PR: https://github.com/dpwls02142/shopping-app/pull/66

Git branch 오류 ​

bash
error: cannot lock ref 'refs/remotes/origin/refactor/directory/product-quantity':  
'refs/remotes/origin/refactor/directory' exists; cannot create 'refs/remotes/origin/refactor/directory/product-quantity'
  • 내 로컬 .git 폴더 안에 refactor/directory라는 파일이 존재해서 발생한 오류임
  • Git은 브랜치를 디렉토리 구조처럼 관리하기 때문에, 내가 현재 사용하고 있는 브랜치 컨벤션 (기능/단위/범위)의 형태를 사용하면 git에선 이미 있는 브랜치라고 인식해버림. 왜냐면 이미 같은 이름의 파일이 존재하고 있으니까.
  • 근데 내가 원격에선 메인에 병합되는 즉시 브랜치를 지우고 있었으니까 purne 으로 리모트에 존재하지 않는 브랜치를 로컬에서도 삭제하고
  • 다시 git fetch 하면 브랜치 구조가 정상화됨
bash
git remote prune origin  
git fetch

AddToCartForm의 책임 ​

  1. AddToCart라고 적혀있지만 product의 purchase까지 담당하고 있음. 장바구니에 담기만 있으면 모를까..
  2. 그래서 컴포넌트와 훅명을 ProductAction으로 수정함. add to cart랑 purchase 둘 다 담당한다는 의미에서.
  3. 근데 gemini 리뷰를 받아보니까 action에서는 purchase와 add to cart에 대한 입력과 선택만 담당하고 실제 action은 부모 컴포넌트에 위임하는게 좋을 것 같다는 리뷰를 받음
  4. 이건 좀 더 생각해봐야될 듯

그 외 ​

  • 그리고 가만 생각하니까 치명적인 로직 오류가 있음.
  • 유저가 장바구니에 max purchase quantity만큼 상품을 담았는데, 해당 옵션과 같은걸 구매하면 지금은 그냥 넘어가진단말임?
  • 근데 이게 말이됨? 이러면 장바구니에 최대 구매 가능 수량 담아놓고, 최대 구매 가능 수량까지 구매 한 다음에 다시 장바구니 가서 결제를 할 수 있잖음.
  • 이러면 안되니까 구매했는데 이미 그 상품이 장바구니에 존재한다면 장바구니에서 max purhcase quantity를 구매한 수량만큼 삭감하는 형태를 해야될 것 같음
  • 관련 이슈: https://github.com/dpwls02142/shopping-app/issues/68