[6팀 소수지] [Chapter 1-3] React, Beyond the Basics #50
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.
과제 체크포인트
기본과제
심화 과제
과제 셀프회고
기술적 성장
참조 동일성
shallowEquals
true
를 반환 (=== 연산자로 비교)null
이 포함된 경우false
를 반환 (객체인지 확인)false
를 반환false
를 반환deepEquals
true
를 반환 (=== 연산자로 비교)null
이 포함된 경우false
를 반환 (객체인지 확인)false
반환deepEquals
함수로 재귀적 비교false
를 반환deepEquals
함수로 비교=> 깊은 비교는 재귀적 호출을 사용하여 중첩 구조를 비교하고,
이를 통해 중첩된 객체, 배열까지 포함한 모든 깊이를 비교할 수 있습니다.
useRef
useRef(initialValue)
initialValue
: ref 객체의current
프로퍼티의 초기 설정값으로 어떤 유형의 값이든 지정할 수 있으며, 이 인자는 초기 렌더링 이후부터 무시됩니다.current
: useRef의 단일 프로퍼티로 다른 값으로 변경할 수 있습니다.useMemo
useMemo(calculateValue, dependencies)
calculateValue
: 계산 함수, 순수해야 하며 인자를 받지 않고 모든 타입의 값을 반환할 수 있어야 합니다.dependencies
: 계산 함수 내에서 참조된 모든 반응형 값의 목록useCallback
useCallback(fn, dependencies)
fn
: 캐싱할 함수값dependencies
: 함수 내에서 참조된 모든 반응형 값의 목록타입스크립트 사용이 익숙치 않아
shallowEquals
와deepEquals
함수를 구현할 때 타입 오류가 많이 났습니다. (objA와 objB 인자)처음에는
deepEquals
의 함수 타입을 아래와 같이 줬습니다.<T extends Record<string, unknown>>(objA: T, objB: T): boolean
그러자 재귀적으로 배열의 키를 비교하는 과정에서 타입 오류가 발생했습니다.
'unknown' 형식의 인수는 'Record<string, unknown>' 형식의 매개 변수에 할당될 수 없습니다
그래서
deepEquals
함수의 매개변수 타입을 더 일반화해서unknown
값을 받을 수 있도록 수정하였습니다.코드 품질
memo
심화과제를 수행할 때 context로 관심사를 분리해 봤는데,
기본적인 부분만 구현하여서 기능이나 성능 측면에서 좀 더 고민해보고 코드를 더 디벨롭 해보고 싶습니다.
학습 효과 분석
useContext
useContext(someContext)
someContext
:createContext
로 생성한 context로 컴포넌트에서 제공하거나 읽을 수 있는 정보의 종류를 나타냅니다.타입 스크립트
1. 타입스크립트의 역할
2. 타입 시스템
잉여 속성 체크(excess property check)
어떤 경우에 구조적 서브 타이핑이 적용 되지 않고, 잉여 속성 체크가 수행하는가?
Type A is not assignable to Type B
any
any
가 아닌unknown
을 사용하는 것이 적절하다.3. 타입 스크립트를 더 잘 쓰는 방법
실무에서는 대부분 유지보수를 하는 프로젝트에서 타입스크립트를 사용했기에 타입 선언 및 지정 등 간단하고 기본적인 것만 알고 있었고,
타입 유틸리티나 타입 단언, 추론 등 심화 부분은 아직 숙지가 안된 상태입니다.
이번 과제를 통해 다양한 유틸리티 타입들을 접하고 사용해 볼 수 있어서 타입스크립트에 조금 가까워졌다는 느낌도 받았고,
타입스크립트를 좀 더 공부해야겠다는 깨달음을 얻은 계기가 되었습니다.
과제 피드백
평소에 실무에서 React Hooks를 자주 사용하고 있지만 100% 이해하고 사용하는건 아니였습니다.
이번 과제가 useRef, useMemo, useCallBack 등 리액트에서 제공해주는 Hooks를 직접 커스텀 훅으로 구현하는 것이기 때문에
기존 Hooks 개념 등 기본기의 중요성을 한번 더 깨달았습니다.
더 나아가 리액트의 참조 동일성 방법, 불변성을 사용하는 방식, 메모이제이션 기법 등 좀 더 깊이 있는 학습 필요성을 얻게된 계기가 되었습니다.
리뷰 받고 싶은 내용
1. 성능 프로파일링 확인 방법
이번 과제 때 성능 프로파일링, 렌더링 비용 등의 개념을 배우고 혼자 확인해 보기 위해 실행 해보았습니다.
어떤 컴포넌트가 렌더링 되고 렌더링 순서나 단계는 직관적으로 확인할 수 있었지만,
정확히 어떤 컴포넌트에서 렌더링 비용이 많이 발생하는 건지,
어떤 식으로 그래프가 떠야 비용이 많이 발생해 성능에 이슈가 있는 건지,
성능 최적화 후 실행 했을 때 어떠한 렌더링 변화가 생기는 지 등
정확한 성능 프로파일링을 확인하고 사용하는 방법을 잘 모르겠습니다.
이에 관련하여 자세히 설명된 자료나 영상 등이 있으면 추천 부탁드립니다!
2. Context Provider 선언 순서
현재 App에 각 Context Provider를 아래와 같은 순서대로 감쌌습니다.
NotificationProvider
>ThemeProvider
>UserProvider
컴포넌트의 순서를 조금 다르게 구성하면 오류가 나서 위와 같은 순서로 하니 정상 작동이 되었습니다.
감싸는 순서가 단순히 UI적으로 보여지는 측면일까요?
아니면 어떤 이유로 위와 같이 구현해야지만 정상 작동하는지 궁금합니다.