3/29 - 4/4
어쩌다 오픈소스
rn 0.62.0
업데이트 이후 어디선가 경고가 찍히기 시작했다- 따라가보니
react-native-ui-lib
에서deprecated
된 내용을 사용하고 있었다 - rn 문서를 보니 해당 api는 이미 deprecate되었고 이번 버전부터 경고가 찍히게 업데이트 되었다
- 그래서 우연한 기회로
react-native-ui-lib
에 해당 코드를 수정하였고 pr 보냈다 - 그런데 가만 보니 경고 메세지에서 해당 api 대신 사용하라는 api가 잘못 표기되어있음을 알게 되었고 정말 우연하게도 ㅋㅋ
react-native
에 pr 기회를 얻게 되었으며 다음날 바로 merge 되었다!console.warn
내용을 수정한 것 뿐이지만 이런 기회를 얻게 되다니
TDD?
- 재사용할 목적으로 컴포넌트를 만들었다 -> 나혼자 개발하는게 아니다 -> 내 의도대로 작동하는지 확인하고 싶다
- 내 코드가 잘 있나 보살피고자 테스트 코드를 작성해둬야겠다고 생각이 들었다
- 내가 작성해둔 컴포넌트는 언제든 재사용 될 것이고 코드는 변경될 수 있다
- 그리고 변경된 컴포넌트는 기존에 사용되고 있던 곳에서도 기존과 동일하게 적용되는지 최소한 확인 장치로 테스트 코드를 작성하려고 한다
- TDD라고 테스트를 먼저 작성하고 개발을 하는 방법론이 있다
- 그러나 나는 지금 그 방법론에 정반대로 진행하고 있다
- 그러나 목적은 같지 않을까
의도대로 작동하는가
그냥 고민
- 데이터를 가공하고 그려주고 변경하는 작업 중 갑자기 드는 생각
- 반복문을 사용하는게 너무 많지 않나? 그냥 key-value로 담아두면 안될까
- 그래서 key-value로 했더니 데이터를 그리고 변경하는데에는 괜찮았다
- 그런데 특정 값을 조건으로 필터링하고자 할때 반복문을 돌기위해 Object.keys를 한번 거쳐야하는 일이 발생한다
- 다른 방법은 없을까
- 두가지 형태의 데이터를 다 들고 있다면? 리스트 형태는 필터링을 위해서만 사용하고 값을 찾기 위해서는 key-value에서 작업하면 어떨까
깊은 복사
- saga에서 값을 변경해서 reducer에 보내려고 한다
- 근데 그냥 바꾸면 redux에 있는 값이 바로 변경된다 -> 내가 원하는 시점이 아니다
- 그래서 깊은 복사를 통해 새로운 객체를 생성하고 이 객체의 값을 변경한 뒤 reducer로 보냈다
- 그럼 이 깊은 복사는 과연 꼭 필요한 것일까?
- 깊은 복사는 겹겹 쌓여있는 객체 저 깊은 곳까지 전부 복사를 하기 위해 키값을 돌고 돌고 돌아서 복사를 해야한다 -> 이런 돌고도는 과정이 불필요한 일은 아닐까
- immer를 사용하면 특정 부분만 값을 변경할 수 있다 -> saga에서 reducer로 immer를 사용해 전달할 수 있을까?
3/22 - 3/28
django
-
user = UserViewSet.as_view({ 'get': ‘list', 'post': 'create' })
- urls에서 method 별로 연결해준 view에 매핑되어 호출 -> serializers는?
- get list에서는 사용자의 이름만 request, response에 담으면 되지만 post create에서는 request는 전체 필드를, response는 이름만 담으면 된다
- 하나의 serializers로 요청, 응답 필드를 필터링 하여 보여줄 수 있을까?
bugsnag
- 앱이 종료된다는 사용자
- 이유를 찾을 수 없다
- 서버 응답은 정상적으로 내려갔고 클라이언트 오류
- 에러트래킹 툴의 필요성
정규식
- 친해질 수 없는 정규식 -> 유니코드? 아스키코드?
- 해외 사용자들을 위해 다국어 허용하면서 특수문자는 허용하지 않는 규식이를 만들어야한다
- 내가 보기엔 전부 특수문자같은데...
- a 위에 점 하나 찍은 à, â 에라이
- es2018에서 나온 정규식(
\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Join_Control}
) -> 안타깝게도 es6에서 읽지 못한다 - 바벨에서 변경이 될까 찾아봤는데 실패했다ㅜㅠ
- 그렇게 반반나절이 지나고 es6로 정규식을 변경해주는 사이트를 운좋게 발견하였다
\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Join_Control}
: 다국어 + 숫자\u3002\u318D\u119E\u11A2\u2022\u2025\u00B7\uFE55
: 천지인 키보드 문자- 참고: 마켓컬리
Jest
- 정확하게 무엇을 어떻게 테스트 코드를 작성해야 하는지
- 자바 개발 시 해당 서비스의 응답값을 테스트 했었다
- 리액트도 동일한 방법일까? -> 함수의 응답값을 테스트해보았다
- 그러나 state에 따라 변화되는 화면은?
- 테스트 코드에서 state를 변경할 수 있을까?
- 함수형 컴포넌트에서는 instance가 생성되지 않아 state에 접근이 불가능한것같다
3/15 - 3/21
sentry
- Error tracking
- 그동안 에러로그를 디비에 저장했는데 API 호출 로그와 같은 형태로 저장되어있어서 찾아보기도 힘들고 사실 찾아보지도 않았다...
- 이번 기회에 툴 사용
- 앱 + 서버 에러로그
eslint
react-hooks/exhaustive-deps
- 훅스 디펜던시를 추가하지 않으면 자동 추가해버리는 eslint rule -> 깃허브 이슈에는 개발자들의 아우성
- react native 공식 문서에서는 사용하는걸 권장하고 있는데 개발 의도와는 다르게 수정되버리는건 오류일까?
- eslint에 걸리지 않으며 디펜던시에 추가하지 않고 처음에 의도했던대로 해당 값을 사용하려고 고민한 결과 ->
setState
를 사용하여prevState
로 값을 가져오면 디펜던시에 추가하지 않아도된다 -
setValue(prev => { // 이렇게 여기서 prev값을 가져와서 사용하면 deps에 넣지 않아도 사용할 수 있다 console.log(prev); return prev; });
- 그러나 redux state인 경우 어떻게 컨트롤할지 방법을 또 고민하던중...
eslint에서 자동 추가되는걸 막아버린 업데이트를 해버렸다
- react 깃허브 이슈에서 eslint rule 이야기
OMF
- 파이썬 dlib
- 사진 저장은 서버가 필요하니깐 저장 없이 촬영된 사진을 분석만 하고 끝
- 사진 -> 얼굴 인식 -> 색상 배열 계산 -> 붉은 정도를 반환
코틀린
- 자바 + 타입스크립트 느낌 물씬
깃허브 + 슬랙봇
- GitHub api로 이벤트 발생 내역 가져와서 오늘 내역 없으면 슬랙봇 알림
- 그러나 특정 이벤트만 골라서 가져오는게 아니며 공개된 이벤트만 조회됨
- Private 커밋을 한 경우에도 이벤트 조회가 되지 않아 계속 알림봇(귀찮)
- 서버에 스케줄러로 특정 시간마다 호출하도록 했는데, 24시가 넘어가면 스케줄러가 리셋되버린다 이유가 뭐지
3/8 - 3/14
react navigation v5
react-native-router-flux
를react-navigation
로 변경하고자 스터디
OMF
- Redux hooks로 변경
cocoapod
- 특정 버전 코코아팟 설치
sudo gem install cocoa pods -v {version}
- 스택오버플로어
npm
- 첫 모듈(그냥 코드) 배포
- 내가 쓰려고 만든 컴포넌트
- react-native-highlight-underline-text
eslint
- eslint 플러그인 옵션 설명과 나의 사용의도
eslit
- no-var: var를 사용하지 않고 let, const를 사용
- prefer-destructuring: 구조 분해
- no-lonely-if: else문 안에 if문만 존재하는 경우 else if를 사용하도록
- no-else-return: else문에는 return이 필요하지 않음
eslint-plugin-react
- react/jsx-no-bind: jsx 파일에서 bind로 바인딩하는 경우 허용하지 않음
- react/no-array-index-key: 리스트를 그리는 경우 인덱스 key 필요
- react/no-multi-comp: 여러개 컴포넌트 선언 허용하지 않음
- react/jsx-closing-bracket-location: 닫는 괄호 줄바꿈, 탭키 위치 체크
- react/jsx-filename-extension: jsx 허용하는 파일 확장자 나열
- react/no-unused-state: 사용하지 않는 state값 확인
- react/style-prop-object: props로 style을 주는 경우 객체 형식만 가능하도록
- react/sort-comp: 파일 내 선언된 컴포넌트, 라이프사이클 순서 정렬
eslint-plugin-react-native
- react-native/no-inline-styles: 리액트 인라인 스타일 허용하지 않음
- react-native/no-unused-styles: 선언된 스타일 중 사용하지 않는 것 지우도록
- react-native/sort-styles: 스타일 또는 나열된 스타일 객체들을 알파벳 순으로 정렬
eslint-plugin-react-hooks
- react-hooks/rules-of-hooks: 리액ㅌ 훅스 사용 규칙을 지키도록
- react-hooks/exhaustive-deps: 리액트 훅스 함수에서 사용된 값들을 의존성 선언하도록
@typescript-eslint/parser
- typescript에서 eslint를 사용할 수 있도록 파싱
@typescript-eslint/eslint-plugin
- typescript에 eslint 설정 적용
3/1 - 3/7
React native dimension
- 앱 실행 시 처음 dimension을 가져와서 저장해두었고 orientation에 따라 width, height값 설정 -> 디바이스의 width, height은 고정되어있고 화면 회전에 따라 두 값을 맞바꿈
- 가로화면에서 현재 바라보고 있는 layout width와 스크롤 페이징 적용되어있는 게 갑자기 이상해졌다 -> 스크롤이 가능한 화면의 크기와 스크롤 위치값을 비교하는 조건이 있는데 우연하게도 테스트한 디바이스에서 이 값들이 정수로 반환되어 조건문이 실행되었지만 이슈를 발견한 디바이스에서는 123.45와 123.44 같은 실수를 반환하여 해당 조건이 의도와 다르게 적용되었다
- dimension을 전역으로 설정해서 생긴 이슈가 아닌 전역으로 설정하고 테스트하면서 발견할 수 있었던 숨겨진 보물찾기
redux-toolkit
- 기존 redux + saga 구조
- Action, type, reducer 분리되어있던걸 다시 하나로 합치는 ducks pattern
- 구분해서 사용하던걸 다시 합치는 이유는?
AWS Amplify
- 서버 아니고
서버리스
- 기존에 구현되어있는 REST API를 가져와서 사용할 수 있을까
인증, 호스팅, API
이런걸 다 지원해주는데 이것들을 필요로하지 않는다면/이미 구현되어 있다면 amplify를 사용하면서 얻을 수 있는 건?