JIGGAG

7월 한달동안 로그

2021년 8월 1일

7/26 ~ 7/31

한마디씩

  • 모듈을 전부 의존성 추가해주고 관리해줘야하니깐 node 버전부터 해서 그 환경을 바로 도커로 관리하면 환상의 짝꿍 node + docker라는데,,,
  • 우리가 제어할 수 없는 로직은 바깥에서 값을 받아서 로직을 분리해서 테스트 가능하도록 최대한 바깥으로 밀어낸다
  • 근데 매주 기록하던 스터디가 끝나니깐 괜히 허전 엘레강트는 언제쯤?

iOS 빌드 실패

  • RealmSwift 추가하고 코코아팟 오류 나길래
  • use_modular_headers! + pod 'RealmSwift', :modular_headers => true
  • 근데도 항상 빌드는 어렵지
  • Import of module 'glog.glog.log_severity' appears within namespace 'google'
  • 참고: 깃허브 RN 이슈
  • 예전에도 본 것 같다
  • 근데 이게 해결방법이 아니였다?
  • The Swift pod 'RealmSwift' depends upon 'Realm', which do not define modules. To opt into those targets generating module maps (which is necessary to import them from Swift when building as static libraries), you may set 'use_modular_headers!' globally in your Podfile, or specify ':modular_headers => true' for particular dependencies.
  • 커맨드로 빌드하면 이런 에러메세지가 뜨길래 위의 header 설정을 해준건데...
  • 그냥 에러메세지를 검색하다보니 버전을 명시했는데 그 버전이 무려 3.17?
  • Realm Swift 최신 버전은 10.5.1인데
  • 그래서 다시 시작하는 마음으로
  •   pod 'RealmSwift', '~> 10.5.1', :modular_headers => true
      pod 'Realm', '~> 10.5.1', :modular_headers => true
    
  • 마저도 안되는구나...
  • "protocol descriptor for Swift.Identifiable", referenced from: protocol requirements base descriptor for RealmSwift.ObjectKeyIdentifiable in libRealmSwift.a(Combine.o)
  • 왜 ㅠㅠㅠ
  • 에러메세지를 다르게 검색해보아도 증상은 나와 똑같은데... 왜 저만 안되는건가요
  • 다른 Starter 프로젝트에 시도해봤더니 이번에는 Flipper 오류
  • 그래도 이번건 희망이 보여서 다시 시도!
  • 기존에 Flipper (~> 0.75.1)이였는데 버전을 명시해서 Flipper (= 0.92.0)로 바꿔보았다
  • 그래도 최종 보스 에러 메세지는 "protocol descriptor for Swift.Identifiable....."
  • Swift Package Manager도 안된다.......
  • cocoapods-user-defined-build-types로 해결
  • pod "RealmSwift", :build_type => :dynamic_framework
  • 플러그인으로 빌드 타입을 각각 설정
  • 기본적으로 코코아팟이 static과 dynamic을 동시에 지원하지 않아서 플러그인을 설치해서 각각 빌드타입을 설정해주었다

7/19 ~ 7/25

엘레강트 오브젝트

  • 다음 스터디로 이 책을 읽어보기로 했다
  • 코틀린 스터디를 하면서 기술적인 내용만 오고 갔다면 이번에는 각자의 의견도 주고 받을 수 있도록 목표하고 있다
  • 물론 이 책을 선택한 계기는 오브젝트랑 고민이 있었는데 마침 개발바닥 유튜브에서 이 책을 그냥 언급했을뿐인데 찾아보니 얇아서!? 선택하게 되었다
  • 가볍게 읽어가자는 의미에서 얇은 책을 선택한 깊은 뜻 없는 그냥 그런 이야기
  • 1장을 읽어보았는데 아직까지는 어려움 없이 OOP에 대해 생각해볼 수 있을것 같다
  • 생각대로 되지는 않겠지만..

iOS swift 적용하기

  • 한번 해보니 java -> kotlin <<<< objc -> swift
  • 그래서 프로젝트마다 적용하고는 있는데
  • 각각 다른 라이브러리를 사용했더니 설정해주는게 너무 다르다

빌드

  • 스테이징으로 디바이스 빌드해서 확인할 수 있는 것을 굳이 코드푸시로 배포했다...
  • 하고 나니 생각나는 아쉬운 선택
  • 왜그랬어!

iOS swift - DEBUG flag

  • DEBUG이면 코드푸시 번들을 가져오도록 조건이 구성되어있었는데 이 로직이 계속 디버그가 아니라고 뜨고 있었다
  • 아니 디버그가 아니면 그럼 뭐지????
  • 설마?
  • #if DEBUG 이 코드가 RN의 __DEV__ 같은 것이라 생각했는데 아니였다...
  • iOS Compilation Conditions - Flag 설정
  • 플래그가 없으니 if DEBUG가 당연히 false인것
  • 근데... 원래 쓰던 DEBUG인데? objc에서도 해당 플래그에 따라 분기를 타고 있었는데 왜 swift로 왔다고 안되는걸까

7/12 ~ 7/18

RN + swift

  • 지난번에 안드로이드는 kotlin으로 바꿨고 이번에는 iOS를 swift로 바꾸기 도전
  • 라이브러리 쓰다보면 swift로 되어있는 경우 Bridging-Header를 추가해서 objc + swift 같이 사용할 수 있도록 해주었는데 이번에도 동일하다
  • 왜냐하면 RN NativeModules을 구현한 RCTBridgeModuled은 objc니까 둘 다 지원해야해서
  • Bridging-Header에는 objc에서 가져와서 사용하려는 것들을 import 시킨다 => 이 친구가 연결고리
  • 기존의 AppDelegate.m을 AppDelegate.swift로 구현
  • 근데 flipper랑 codepush를 swift로 가져오는게 잘 안된다ㅠㅠ
  • flipper는 Bridging-Header에 그대로 남겨두었는데 codepush는 어쩌지
  • 프로덕션인 경우에만 코드푸시 번들을 가져와서 쓰도록 조건을 걸고 싶은데 왜 안된다는거야~~~~~🙀
  • xcode에서는 코드푸시가 자꾸 nil이 떠서 오류나고 있길래 커맨드로 빌드했더니 이번에는 빌드 조차 되지 않는다
  • 아 설마?
  • 전에 빌드가 안되서 react-native patch를 했는데 이번에도?
  • 그러했다

Serialize

  • Serialize => Data를 byte로, json object를 stringify로
  • Deserialize => byte를 Data로, json string를 parser로

activity

  • android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
  • 스터디 프로젝트에 카카오 로그인을 네이티브로 붙이려고 하는데 위와 같은 오류가 발생했다
  • AndroidManifestMainActivity 외에 com.kakao.sdk.auth.AuthCodeHandlerActivity를 추가한 상황
  • 참고: 우선 기존 라이브러리 코드 검색해서 이해하기
  • fragment는 뭐가 다른거지
  • 참고: fragment 라이프사이클

7/5 ~ 7/11

metro.config.js

  • RN을 위한 js bundler
  • RN 개발하다보면 metro server 오류가 뜨면 그냥 치는 --reset-cache 옵션도 metro 캐시를 날리는 것
  • A프로젝트 개발하다가 메트로 서버 안끄고 바로 B프로젝트 앱을 들어가면 메트로 서버가 번들 파일이 이상하니깐 앱이 실행이 안된다
  • 아니면 tsconfig에 import path 바꿔주면 한번씩 캐시를 날려주고 재시작했었는데 이게 다 메트로 번들 영향이였다
  • metro cache
  • 메트로 서버에 캐시를 저장하고 공유하는데 모든 서버를 돌면서 찾아서 가져오고 캐싱 또한 모든 서버를 돌면서 다시 저장한다
  • 로컬이든 원격이든 모든 서버에 캐시를 저장해서 번들러가 캐시를 가져와서 빌드 시간을 빠르게 해준다
  • (+watchman으로 파일 변경을 감지하는데 변경되면 번들을 다시하고 RN reload)

7/1 ~ 7/4

package list

  • MutableList..........!!
  • MainApplication.java -> kotlin 변경하면서 reactPackage 추가하는 부분도 잘 바꿨다고 생각했다
  • 그러나 autolinking이 안되고 있어서 package를 추가하는 react-native link를 수동으로 작업해주었다
  • 지난주에 react-native.config.jsmainFilePath를 설정해주면서 autolinking 문제를 해결했다고 생각했는데
  • 여전히 라이브러리를 찾을 수 없다고 앱을 실행하면 오류가 나고 있었다
  •   override fun getPackages(): List<ReactPackage> {
      	return listOf<ReactPackage>(
        RNScreensPackage(),
        RNGestureHandlerPackage(),
        )
      }
    
  • 이런 식으로 작성을 해주고 직접 라이브러리를 추가해줘야만 정상적으로 패키지를 가져왔다
  • 왜 그럴까? 초기 코드 상태를 보니 살짝 다른게 보였다
  •   List<ReactPackage> packages = new PackageList(this).getPackages();
    
  • 자바에서 List<ReactPackage>로 되어있어서 자연스럽게 코틀린으로 가져왔다
  • 그리고 의심하지 않고 List를 썼는데 여기서 큰 오류를 심었다
  • 자바 List를 들어가보면 분명 add가 있지만 코틀린의 List에는 add가 없다
  •   override fun getPackages(): List<ReactPackage> {
      val packages: MutableList<ReactPackage> = PackageList(this).packages
      return packages
    }
    
  • 조금이 아니고 크게 보인다 MutableList
  • 갑자기 이해가 되려는 듯
  • 패키지를 autolinking으로 추가되어야하는데 내가 사용한 listOf는 mutable이 아니였다

kotlin DSL