10/27 - 11/2
Memoization
- React.memo
- Memoization
- Component
React.memo(({ value }) => { /* value가 변경되면 render */ })
- React.useMemo
- Memoization
- Value
React.useMemo(() => { /* value가 변경되면 render */ }, [value])
- React.useCallback
- Memoization
- Function
React.callback(() => { /* value가 변경되면 호출 */ }, [value])
- 메모이제이션하는 대상, 목표가 다른듯 목적은 동일해 보인다. 그렇다면 과연 재사용하는 모든 값, 컴포넌트, 함수에 메모이제이션을 적용하는게 좋을까? 번역: 언제 useMemo와 useCallback을 사용하는가 해당 블로그를 읽고 고민이 생겼고 작성해둔 코드를 지웠다가 다시 그려보며 생각해본다. 과연 이게 꼭 필요한 메모이제이션일까.
Redux saga
- Action type
Request
Success
Failure
- 액션 타입별로 3가지 종류 선언 > 반복 > createAction 함수 사용
- Effect
take
-fork
: while 계속 take 해둔 액션을 대기하다가 들어오면 fork 집어둔 내용 실행take
: 해당 액션 호출 대기fork
: 해당 액션 실행 대기takeEvery
: 모든 액션 실행takeLatest
: 마지막 액션만 실행put
: 액션 함수 실행call
: api 실행select
: saga state 호출
Redux vs Mobx
10/20 - 10/26
Container Presenter Pattern
- Container와 Presenter로 분리하여 작업(index, container, presenter, style)
- Container: redux state를 제어하는 컴포넌트(smart component)
- Component: 단순 props로 제어하는 컴포넌트(dumb component)
- Container -> Component -> Presenter -> Action -> Container 반복
- 참고: Container와 Component
Ducks Pattern
- Redux Action, Action Creator를 한 파일로 관리
- action, creator, reducer 각각 나눠서 작업하면 USER 관련된 리덕스를 수정하려면 3파일을 전부 수정해야하는 불편
- 기능별로 묶어서 관리하자
-
// action const EX_ACTION_LIST = ‘ex_action_list’; // action creator const getList = () => { return { type: EX_ACTION_LIST }; }
- 참고: Ducks Pattern
React Native: Flatlist
- 스크롤이 자동 생성되며 뷰 밖에 있는 것은 lazy
- 인스타나 페이스북처럼 무한 로드 페이징에 효과적
- scrollview 안에서 사용하면 flatlist의 기능을 이용하지 못함
FE 성능 최적화
- 네이버테크콘서트 유튜브
- 측정 > 분석 > 최적화 반복
- 어디를? 유저가 가장 많이 사용하는 화면, 가장 가치 있는 화면
- 무엇을? Loading and Interaction
- 어떻게? waterfall의 높이, 폭, 간격 개선
- request 수 줄이기 - 불필요한 자원 호출 삭제
- request 시간 줄이기 - 파일 경량, 난독, 압축
- request 중첩 - 파일 로드 우선순위
- 참고: http 캐시
Server Side Rendering / Client Side Rendering
- SSR (ex. jsp): 요청마다 서버에서 내려줘야함
- CSR (ex. spa): 초기 접속 시 파일 전부 가져와서 보여주기만
Was(web application server) / Web Server
- Apache, tomcat, nginx
- 동적 vs 정적
- ~/getList vs ~/list.js
- 특정 URL로 요청 할 경우 웹서버에서 확인 후 WAS로 보낸다
- User(~/example.do) > Web Server(해당 URL을 어디로 보낼지 확인) > WAS(해당 URL 호출) > Web Server(WAS에서 데이터 리턴) > User(데이터 확인)
- 사용자 요청 > 아파치가 톰캣에 보내야 하는 요청인지 확인 > 톰캣 요청 > 톰캣이 아파치에게 데이터 리턴 > 아파치가 사용자에게 데이터 리턴
- WAS vs Web Server
- Request에 따라 WAS 또는 Web Server
10/13 - 10/19
Functional-Javascript
- 지난주 스터디를 진행하며 궁금했던 Call과 curry의 차이점
- Curry: 인자로 받은 function에 args를 하나씩 함수 인자로 분리하여 반환
- Call: 인자로 받은 function에 args를 넣은 Curry 함수를 실행
- function의 args 갯수가 맞지 않는 경우 curry는 해당 함수를 반환하지만 call은 해당 인자를 Undefined로 인식하여 실행됨
- 유인동님의 함수형 프로그래밍
유사배열
- 유사배열에서 Array.prototype을 사용하려면 call, bind, apply
- call(this, 1, 2), apply(this, [1, 2]) = bind(this)(1, 2)
- call, apply는 실행까지, bind는 반환만
- 제로초님의 call, bind, apply
- 제로초님의 유사배열
10/6 - 10/12
TDD?
- 참고 영상 - 우아한테크
- 내 능력을 살짝 넘어가는 작업을 구체적인 목표를 가지고 지속적으로 시도
- Test 코드 작성 > 리팩토링 > 테스트 실패 > 재작성
SPA에서 구글 애널리틱스(ga)를 route url 별로 자동 구현한 라이브러리 오픈소스가 있는지 찾아보고 없다면 만들면 좋을것 같다.
- 이미
history
라이브러리에서history.listen
으로 응답에 따라ga
를 보낼 수 있도록 되어있다. - 내가 생각한 것은 react-router-dom의 link가 호출되어 url이 변경되는 순간 해당 url로 ga가 보내지는 것… 라이브러리 내장 지원
- 이게 nextjs일까