Repository navigation
[13팀 강신규] Chapter 2-2. 디자인 패턴과 함수형 프로그래밍 - #21
Open
singyuKang wants to merge 49 commits into
Open
singyuKang wants to merge 49 commits into
singyuKang wants to merge 49 commits into
Conversation
…updateCartItemQuantity 순수함수 사용
…ut, Navbar 컴포넌트 추가
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
배포링크
origin : https://singyukang.github.io/front_5th_chapter2-2/index.origin.html
refactoring : https://singyukang.github.io/front_5th_chapter2-2/index.refactoring.html
과제의 핵심취지
과제에서 꼭 알아가길 바라는 점
기본과제
Component에서 비즈니스 로직을 분리하기
비즈니스 로직에서 특정 엔티티만 다루는 계산을 분리하기
뷰데이터와 엔티티데이터의 분리에 대한 이해
entities -> features -> UI 계층에 대한 이해
Component에서 사용되는 Data가 아닌 로직들은 hook으로 옮겨졌나요?
주어진 hook의 책임에 맞도록 코드가 분리가 되었나요?
계산함수는 순수함수로 작성이 되었나요?
특정 Entitiy만 다루는 함수는 분리되어 있나요?
특정 Entitiy만 다루는 Component와 UI를 다루는 Component는 분리되어 있나요?
데이터 흐름에 맞는 계층구조를 이루고 의존성이 맞게 작성이 되었나요?
심화과제
재사용 가능한 Custom UI 컴포넌트를 만들어 보기
재사용 가능한 Custom 라이브러리 Hook을 만들어 보기
재사용 가능한 Custom 유틸 함수를 만들어 보기
그래서 엔티티와는 어떤 다른 계층적 특징을 가지는지 이해하기
UI 컴포넌트 계층과 엔티티 컴포넌트의 계층의 성격이 다르다는 것을 이해하고 적용했는가?
엔티티 Hook과 라이브러리 훅과의 계층의 성격이 다르다는 것을 이해하고 적용했는가?
엔티티 순수함수와 유틸리티 함수의 계층의 성격이 다르다는 것을 이해하고 적용했는가?
과제 셀프회고
(1) 순수함수를 도대체 왜 써야하지
지난 토요일 과제 발제시간에
순수함수를 써야합니다순수함수를 쓰면은 테스트 코드가 편해져요액션과 순수함수를 구분하면은 좋아요이야기를 들었지만은 사실 크게 와닿지 않는 부분이었습니다.전역적으로 상태를 왜 건들이면은 안되지?순수함수로 굳이 짜야하는 이유가 뭘까? 기존에는 순수함수없이상태만 변경해오는걸로 충분히 다 구현이 가능했는데.. 등 의문점을 가진채 과제를 시작했습니다.제일먼저
CartPage의useCart리팩토링을 진행하였습니다.위의 코드형태로
useCart를 리팩토링을 진행하였으며CartPage에는 getRemainingStock가 선언되어있고 이를하위 컴포넌트에 넘겨 계산하도록 하였습니다.여기서 저는
CartPage내부 안에 cart라는 state를 가지고 있고getRemainingStock에 cart가 의존되어 있는 상황인거는 알겠는데,안좋은 형태가 맞나?에 의문점이 들었습니다.그래서 지난 토요일발제시간에 진행했던
안좋은 코드에 대한 테스트코드 작성을 진행을 해보았습니다.단순 함수하나
테스트 코드 작성을 위해서전체 컴포넌트와 관련 상태 렌더링을 시킨후,useCart훅을 선언하여 넣어준다음에 필요한props 설정.. 벌써부터 너무신경써야 할게 많다.반면에
순수함수의 테스트코드는 위와 같이 짧은 형태이며테스트하기 정말 편하다라는 생각이 들었습니다.외부에서 넣어주는 값과리턴 받는 값이 정해져있다보니다른 상황을 고려하지 않고 테스트 진행이 가능했습니다.회사프로젝트를 진행하다보면은
계산을 하는 함수가 많을것입니다. 그렇다면은 첫번째 형태처럼 테스트 코드를 진행하다보면은외부요인으로 인해 실패하는 케이스가 발생할 것이며작성하는 시간이 엄청 오래걸릴 것입니다.제가 이해한 바로는
액션 함수 테스트 코드는 작성하는데 시간이 엄청 오래 걸리고테스트하는데 외부 요인이 따라온다. 따라서 처음과 끝의 액션함수에 대한 테스트 코드 진행이 오래 걸리는 것은 어쩔수 없으니,계산하는 쪽은 최대한 순수함수로 빼내어 작성하는 것이 좋은 형태라고 느꼈습니다.따라서 위와 같이 작성이 되어있다면은 판단을 해야합니다. → 과연
cart라는 상태를 꼭!! 해당하는 컴포넌트에서 가져와야하는것일까?단순히
cart Array에product id가 같은 요소를 꺼내오는 거면은cart상태를 주입받아 사용하는 상태로 바꿔도 괜찮겠네?의존성이 없는 함수로 변환후 순수함수 로직이 있는cart.ts에 추가 하는 식으로 해야겠다 라고 느꼈습니다.CartPage를 예시로버튼을 클릭하는 이벤트 발생으로onAddToCart함수를 실행하게 됩니다.(액션)onAddToCart는 Product를 전달해주어서해당 Product와 이전 상태 Cart를 비교를 진행하여카트 아이템을 업데이트를 시켜 반환을 시켜줍니다.(계산)반환된 값을
setCart를 통해 변경하여 사용자에게 변화된 값을 보여줍니다.(액션)(2) 공통 컴포넌트 고민
공통 컴포넌트를 설계하면서 가장 많이한 고민은"어떻게 하면 다양한 상황에서 유연하게 사용할 수 있는 컴포넌트를 만들 수 있을까?"였습니다.Heading을 예시로기존에는 다음과 같이
각 헤딩 태그마다개별적으로 스타일을 적용했습니다:이 문제를 해결하기 위해
TypeScript의 동적 태그 기능을 활용하여모든 헤딩 레벨을 지원하는 재사용 가능한 Heading 컴포넌트를 구현했습니다(3) validate 검증 기능
상품, 쿠폰, 수정 시에
입력폼 validate가 안되어 있어잘못된값(0원짜리 쿠폰)이 들어가도 되는것 개선해당 기능을 추가하면서
클린코드가 정말 중요하구나라고 느꼈습니다.할인 정보를 추가해줄때새로운 할인 정보가 0이 섞여있으면은 안된다는 문제를 파악 -> 자연스럽게마지막 액션에서 문제가 있으니계산쪽에서 처리해주면 가능하다고 판단 ->hook을 찾아마지막 액션(handleAddDiscount)을 찾은후에 여기에계산하는 함수를 작성하면 되겠다고 생각 ->model validateDiscount함수생성후 연결 -> 테스트 코드 작성클린코드를 하니
기능 위치를 찾는 속도+테스트코드 작성 속도가 진짜 빨라졌습니다액션 -> 계산 -> 액션 으로 끝나는 구조가 정말 편하다라고 느낌
(4) props drilling
App 컴포넌트에서관리자 페이지와카트 페이지를 분리시에product에 대한 정보가 서로 필요하여App에 useProduct를 선언하고하위 컴포넌트에 뿌려주는 방식으로 진행하지만
컴포넌트를 통해 값을 넘겨주다 보니products를 사용하지 않는데products를 가지고있는 이상한 현상->단순히 넘겨주는 역할또한 함수의 이름을 변경해야하는 경우가 있었는데
연결되어있는 모든 컴포넌트를 변경해주어야한다는 불편함을 겪었습니다.이래서
Context API나다른 상태 관리 라이브러리를 사용한다는 것을 알았습니다.리뷰 받고 싶은 내용이나 궁금한 것에 대한 질문
컴포넌트에 대한 폴더 구조를 common, domain, layout으로 나누었는데 domain에서 기능별로 컴포넌트를 나누다 보니 양이 너무 커지는거같다는 생각이 듭니다. 이 구조가 좋은구조인지 아니면 다른 구조로하는게 나은지 궁금합니다!
hooks 와 models의 폴더 구조를 기능별로 나누는게 좋을까요?! 컴포넌트, hook, model 에 대한 좋은 폴더구조가 궁금합니다!