5/24 ~ 5/31
reduce
map + filter = reduce
- 이런 상황이면 다 reduce로 한번에 처리하도록 신경을 써보았다
- 나름 루프 한번으로 해결해보고자 했는데
- 오히려 내부 변수 수두룩
- push, set, get
- 그러다보면 읽기 어려운, 다시 보기 힘든 코드가 되어버린다
좋은 의도를 가지고 시도해보았는데
- 결과는 좋기만 하지는 않다
- 비슷한? 그런 고민거리 또 하나
- 컴포넌트에 padding을 시안에 명시된 수치값을 정확하게 주고 다른 레이아웃을 맞추는게 좋을까
- 레이아웃에 해당하는 수치를 나눠서 최대한 컴포넌트를 동일하게 만드는게 좋을까
- 결국 디자인 시안과 다른 수치값이 들어가 있으면 나중에 관리하기 더 힘들다
- 그리고 공통컴포넌트라고 만들었지만 그 내부에는 수많은 조건 처리가 되어갈뿐
최대한 기본만 갖고 있도록
그리고 수치는 작게 쪼개지 말아야겠다
노션
- 잘못눌러서 5월동안 기록이 날아가버렸다
- 까아아아암짝 놀래서 실행취소했지만 핸드폰으로는 이미 돌이킬수없었다
- 망했다 생각하고 와이파이 끄고 맥북으로 열었지만 어찌나 동기화가 잘 되어있던지...
- 여기도 날아가버렸다
- 정말 다행스럽게도.. 업데이트 기록이 남아있어서 날려버린 데이터 다시 긁어와서 살릴 수 있었다
- 프로 요금제를 쓰라는 의미인가
realm
- 마이그레이션하면서 기존에 사용하던 필드 삭제
- 근데 해당 필드가 없는 버전에서 오류가 발생하였다
- 없는 필든데 삭제하라고 하니 오류가 발생한다고?!
- 이해는 되는데 그냥 유연하게 삭제해주면 좋을텐데
- 안전하지 않은가보다
js bundle
- 토스 컨퍼런스: js 번들 사이즈 줄이기
- node_modules가 종종 거대해져서 프로젝트 폴더가 처음 받았을때보다 엄청 커진 것을 볼 수 있다
- 프로젝트에서 사용하고 있는 dependency가 또 다른 dependency를 그리고 또 다른 dependency를 바라보면서 많이 본 블랙홀 보다 빠져나올 수 없는 node_module이 되어버린다
- 같은 A라는 라이브러리를 의존하고 있더라도 semver가 다른 경우 각각의 라이브러리가 자신의 node_modules에 원하는 버전을 받아서 사용하게 된다
yarn dedupelicate
으로 중복된 버전의 라이브러리를 최소화해본다- 그리고 꼭 필요한 부분만
import
한다 (import * as all from 'lodash' 이런 형태를 지양한다) lodash
를 정말 잘 쓰고 있었는데라이브러리의 사이즈가 크고 js 기본 함수로 구현이 가능한 것을 외부 라이브러리를 사용해서까지 할 필요가 없다
라는 의견- 당연하지만 편리함에 고민하지 않은 부분들
- 번들 사이즈를 이야기하다보니 ts를 js로 컴파일 했을떄 enum이 떠오른다
- enum은 tree-shaking이 되지 않아 항상 js 번들에 포함된다
- 이 또한 편리함이였는데 고민을 해봐야지
5/17 ~ 5/23
RN Timers
- 일반적으로 알고 있는 setTimeout과 RN의 setTimeout이 다르다고? 왜!
- 참고: setImmedate와 이벤트 루프
- 애니메이션과 네이티브 이벤트가 얽혀있는 하나의 액션에서 setTimeout으로 지연시키고자하였다
- 렌더 후 네이티브 이벤트가 발생하고 그 이벤트에서 애니메이션을 주고 이 작업이 mount/unmount 연속해서 발생한다
- 당연히 이전 페이지의 unmount가 되면서 다음 페이지의 mount가 되면 좋겠지만 unmount가 fadeout으로 mount보다 더 늦게 발생하면서 문제가 생겼다
- RN 내부 구현되어 있는 setTimeout
- 따라가보니 setTimeout을 NativeTiming.createTimer에 있고 이건 BatchedBridge로 나아가는데..??
- 왜 이게 이렇게 연결이 되는거지
- RN Timers
setImmediate
가 현재 실행되고 있는js에서 native로 넘어가기 직전
에 호출된다- 왜 native 넘어간다는 내용이 있을까?
- 참고: RN thread
JS 스레드의 각 이벤트 루프 끝에서 네이티브 뷰 업데이트가 전달되며 마지막에 UI 스레드에서 실행된다
- 그럼 우리가 마주했던 문제
js 이벤트 -> 네이티브 뷰 업데이트
- setTimeout으로 보냈다면 js 렌더링이 끝나고 네이티브 뷰 업데이트까지 완료된 다음 이벤트 루프가 돌면서 처리되었을것이다
- 이걸 setImmediate로 변경해서 네이티브 뷰 업데이트로 넘어가기 전에 코드를 실행해주는 것
그냥 그렇다
- 자식같은 마음으로 듬뿍 애정 담아 시작한 프로젝트
- 그것이 무슨 이유가 있어서 밀리게 되거나 중지 되거나 엎어지는 경우
- 이유가 정말 이해는 가는데 그냥 마음이 슬프다
- 공허한 느낌이랄까
- 최근 어쩌다보니 겪었고 보았다
- 그냥 마음 한편 애정을 쏟은 무언가가 떠나버리는 것 같아 아쉬울뿐
- 있을때잘해줄걸
- 다시하지뭐
5/10 ~ 5/16
iOS 인증서
- 갑자기 질문을 받았는데 말끔한 대답을 못하는게 역시나 모르는게 분명하다
키체인에 iOS Developer 인증서가 신뢰할 수 없다고 뜨는데 왜 그런거에요?
- 분명 그런 메세지를 나도 전에 본 적이 있었다
- 그러나 정리해두지 않았는지 결국 또 잊어버렸다
- 인증서를 생성하고 등록하고 다운 받고 키체인에 던졌는데....
- 그래서 돌아보는 나의 인증서
- 애플 개발자 센터에는
Membership
과Certificates, Identifiers & Profiles
을 보는데(내가 그렇게 본다) - Membership에는 개발자 계정 1년마다 등록하는 그것에 관련한 내용이 있다
- 그리고 여기서 발급받은 나의 Team ID가 앱 빌드하고 배포하는데 따라다닌다
- 가장 어려운.. 문제의
Certificates, Identifiers & Profiles
에는Certificates, Identifiers, Devices, Profiles, Keys, More
탭이 있다 - Profiles에는 하나의 Provisioning Profile이 있는데 아마도 애플 로그인 기능을 사용하려고 만든 것 같다
- Identifiers에서 앱의 기능을 추가하거나 변경하면? Profiles에서 Provisioning을 다시 만들고 다운받아서 xcode에 던진다!??? (기억이 안난다)
- 참고: iOS 인증서
네이밍
- 혼자 알아봐서 뭐하니!!!!!!!!!
- 네이티브 하기 전에 네이밍 좀
5/3 ~ 5/9
rn kakao + fbsdk + flipper
-
package.json
"@react-native-seoul/kakao-login": "^3.0.6", "react-native-fbsdk-next": "^4.0.0",
-
각자 자기 주장하느라 빌드 실패!
-
kakao 버전을 올리고 fbsdk를 붙였더니 시작된 오류
- 안드로이드는 무사함
-
kakao → podfile platform minimum version 11.0 요구
[!] The platform of the target `omf` (iOS 10.0) may not be compatible with `KakaoSDK (2.4.1)` which has a minimum requirement of iOS 11.0.
-
platform version 11.0 flipper에서 오류나길래 버전업 시도해봄
"react-native-flipper": "^0.87.0",
-
-
그래도 해결되지 않아서 차분하게 모든걸 정리해가면서 시도하고자함!
- 모든 테스트는 Podfile.lock을 지우고 yarn pod + clean build
-
[v1]
platform :ios, '11.0'
+pod 'Alamofire'
require_relative '../node_modules/react-native/scripts/react_native_pods' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' platform :ios, '11.0' target 'omf' do config = use_native_modules! use_react_native!( :path => config[:reactNativePath], :hermes_enabled => false ) pod 'Alamofire' target 'omfTests' do inherit! :complete end use_flipper!() post_install do |installer| react_native_post_install(installer) end end
Compile FlipperRSocketResponder.cpp Typedef redefinition with different types ('uint8_t' (aka 'unsigned char') vs 'enum clockid_t')
- platform 10.0에서 해결하려고 했더니 Alamofire가 pod install이 안되서 직접 추가해주었으나 결국 kakao minimum verion으로 해결이 되지 않아서 11.0으로 올리고 재시도
-
[v2]
platform :ios, '11.0'
require_relative '../node_modules/react-native/scripts/react_native_pods' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' platform :ios, '11.0' target 'omf' do config = use_native_modules! use_react_native!( :path => config[:reactNativePath], :hermes_enabled => false ) target 'omfTests' do inherit! :complete end use_flipper!() post_install do |installer| react_native_post_install(installer) end end
Compile FlipperRSocketResponder.cpp Typedef redefinition with different types ('uint8_t' (aka 'unsigned char') vs 'enum clockid_t')
- platform 11.0에서는 Alamofire가 잘 설치되니깐 직접 추가하지 않아도 된다고 생각해서 지우고 다시 시도
-
[v3]
platform :ios, '11.0'
+use_flipper
- 계속 동일하게 flipper에서 오류가 나길래 찾아보니 최근 등록되어있는 깃헙 이슈 참고해서 flipper 버전을 명시하고 시도
- flipper 오류 깃헙 이슈
- flipper version 명시
- 엥!?
- build 성공하는가 싶더니!
- AppDelegate 문법 오류를 뱉어낸다
- 드디어.... 코드를 읽긴했구나 하는 기쁜마음으로 수정하고 다시 돌리니 성공!!!!
-
kakao 라이브러리를 업데이트하고 fbsdk를 추가하겠다고 처음 커밋한 2021-03-27...
-
한달이 충분히 지나고 나서야 드디어 빌드 성공
-
단순하게 platform 버전이 문제라고 생각했는데 범인은 flipper
- 처음엔 오류메세지가 저게 아니였는데...
react-native-flipper
를 업데이트해서 그런가!?- 어쨌든 최종 오류는 flipper!
클린코드
- 클린코드 != 짧은코드
- 원하는 목적을 빠르게 찾을 수 있도록
- 목적에 따라 하나의 기능만 하도록 분리
- 동일한 목적에 따른 상세 기능이 흩뿌려지지 않도록 응집
- 핵심 정보를 뭉쳐서 hook으로 숨기면 다시 찾아야해서 오히려 안티패턴
선언적 프로그래밍
=> 이미 구현된 함수에무엇
을 해야하는지만 전달- 선언적 프로그래밍 내부는 결국 명령형으로 하나하나 전달하고 있긴한데...
- 하나의 목적을 갖는
- 이름만으로도 주요 목적을 알 수 있는 네이밍🙈
- 중요 코드만 남기고 추상화
- 동일한 레벨의 추상화 처리
- 토스 slash21 클린코드
5/1 ~ 5/2
테스트 커버리지
- 함수 하나를 여러 조건에 대해 모든 테스트를 작성했던적이 있다
- 그리고 그 테스트 파일은 수천줄이 되었었다
- 리팩터링을 통해 중복을 줄이고 조건들을 모두 플래그 값으로 반복시켜서 처리했던 기억이 있다
- 이 테스트 코드는 이후 나의 든든한 지원군이 되어주었다
- 운영하다가 추가되는 기능에 대해 사용자에게는 아주 사소한 변화이지만 내부적으로는 수많은 조건에 따른 영향이 있었다
- 그럴때 이 테스트 코드가 나에게 안정감을 주면서 기능개발을 할 수 있도록 해주었다
- 아마 테스트 코드가 없었다면 모든 조건을 전부 하나씩 테스트해야만 했을 것이다!
- 지금 생각해보면 이게 단위테스트를 하고 TDD가 자연스럽게 이뤄진게 아닐까
- 그 당시의 한달동안
- 그리고 최근에 토스 slash21 테스트 커버리지 100% 를 정말 관심있게 보았다
- 테스트 커버리지를 높여보고자 시도했지만 컴포넌트를 조건별로 테스트하기가 너무 까다로웠기에 100%를 원한다기보다는 중요한 함수에 대한 처리를 하고자하였다
- 해당 내용에서는 테스트 커버리지가 낮아지는 경우 빌드 실패하도록 하여 항상 커버리지가 높아지도록 하였다고 한다
- 멋진걸!
- 그리고 테스트는 빨라야한다고 한다!
- push hook으로 테스트를 실행하고 있는데 수천줄이 되는 테스트를 실행하는 것은 너무 느렸다...
- 이걸 빌드 실패하도록?(더 후반부로 옮기기에는) 이미 테스트에 실패한 코드가 푸시가 되어버리는게 마음이 좋지 않다...
- 어떻게 하면 코드가 안정적으로 유지되고 테스트가 빠르게 실행될 수 있을까
- 변경된 파일에 연관된 테스트만 실행한다면?