- react native는 두가지 방식으로 프로젝트를 만들 수 있음
-
Expo CLI
- Expo SDK에서 지원하지 않으면 -> bare workflow로 eject 해야했음
- 변경하더라도 expo에 관련된 모듈이 남아있는 이상 expo에 모듈이 있는 채로 build -> 앱의 빌드가 커짐 -> 앱을 받을 때 시간이 많이 걸림
-
React-Native CLI
- react-native만 설치되어 있으면 됨
- 초기에 구성시 여러가지를 설치해야하기 때문에 난이도가 있는 편
- 대신 원하는 네이티브 모듈 추가 가능
- React-Native에 필요한 모듈만 탑재
npx react-native init 프로젝트 이름- 최초 프로젝트 생성 커맨드
react-native run-ios,react-native run-android- 앱을 실행 시켜주는 커맨드
react-native start,react-native start -- --reset-cache(캐시가 남아있는 경우에)- Metro Bundler를 실행 시켜주는 커맨드
- webpack과 비슷하게 javascript를 하나의 파일로 만들기 위한 역할
react-native log-android,react-native log-ios- android/ios native log를 보기 위한 것
yarn start --reset-cache- metro server 초기화 및 재시작
- Gradle
- android dependency manager
- android 폴더 하위에 build.gradle이라는 이름으로 존재
- android/build.gradle : 전체 라이브러리에서 사용하는 디펜던시의 버전을 종합적으로 관리(ex:: kotlin maven version), 디펜더시 별로 각자 다른 버전을 가지고 있지 않게 하는 역할
- android/app/build.gradle : 작성하는 app module의 dependency들을 관리
- cocoapods
- ios 프로젝트 내부에서 Dependency 관리를 위한 tool
- ios 폴더 하위 Podfile
- React-Native 0.60.0 버전부터 가능
- 별도로 설정하지 않더라도 build time에 라이브러리를 Link할 수 있는 기능
- cocoapod이나 build.gradle 파일을 많이 열어보지 않아도 됨
- 2020년도에 발표된 모바일 디버깅 툴
- React-Native 0.62버전부터 기본으로 내장되어 사용
- Layout Inspector
- Layout Inspector를 통해 현재 View의 상태를 바로 알수 있는 기능 제공
- React Dev Tools
- Layout Inspector에서 제공하는 기능에 state를 더해 볼 수 있음
- Images
- 현재 화면에 보이고 있는 이미지가 나열 됨(Android제공)
- Databases
- Mobile 환경에서의 Database가 어떻게 구성되어 있는지 제공
- Setup Doctor
- 동작을 제대로 안하는 경우에는 Setup Doctor Tool로 점검 가능
-
Android
- Application
- 안드로이드 Application에서 전체 앱 상태를 관리하는 class
- Event를 전달하기 위한 함수를 제공
- onCreate : 어플리케이션이 실행될 때 최초에 호출
- onTerminate : 어플리케이션이 종료될 때 호출
- Manifest
- Android 앱의 메타 정보를 요약해서 선언해둔 것
- 권한, 이름, 패키지명 등 앱의 전반적인 내용들을 담고 있음
- Activity
- 안드로이드에서 화면을 구성하는 요소
- 유저가 직접 보고, 누르는 등의 액션이 발생됨
- 안드로이드의 4구성 요소(activity, service, receiver, content provider)
- Intent
- 어떤 Activity를 호출할 때 사용하는 것
- 매개변수와 함께 보내는 것
- navigation을 이동했던것과 비슷한 형태
- Activity Life-cycle
- onCreate -> onResume -> onPause -> onDestroy
- Application
-
Ios
-
IOS App Status
-
AppDelegate
- Android에서 activity처럼 화면을 구성하는 단위
- 각각 앱의 상태에 따라 불려지게 되는 함수가 있음
- didFinishLaunchingWithOptions : 앱이 최초 실행될때 호출되는 함수 (Android의 onCreate와 비슷)
- info.plist : 권한 앱의 이름, 실행시 주로 필요한 값들을 관리 해주는 파일, SDK API Key값, 권한 요청시 텍스트 등 값을 관리
-
안드로이드와의 추가적인 차이점
- ios의 에디터가 더 많은 것을 지원
- Build Phase : 앱을 실행 시킴에 있어 필요한 값들을 자동으로 설정하도록 Command로 모두 선언해둔 것
-
- 사진 관련
- ios : NSPhotoLibraryUsageDescription
- android : READ_EXTERNAL_STORAGE
- 카메라 관련
- ios : NSCameraUsageDescription
- android : WRITE_EXTERNAL_STORAGE
- 위치 관련
- ios
- NSLocatijonAlways
- WhenInUseUsageDescription
- android
- ACCESS_FINE_LOCATION<>
- ACCESS_COARSE_LOCATION
- ANDROID_BACKGROUND_LOCATION
- ios
- App Tracking Transparency
- IDFA를 읽어오는 권한
- iOS앱 심사시 필수로 보고 있는 정보
- 외부에서 우리 앱을 호출하거나, 우리 앱이 외부앱을 호출하는 수단(ex: 앱 결제)
test://path/to/screen
test:// 가 scheme, path/to/screen이 path - android
- intent-filter를 통해서 정의
- iOS
- info.plist > URL Types에 저장
- Thread란?
- 실행되는 프로세스 내에서 실제로 작업을 실행하는 주체
- 명령어를 실행하여 처리하는 주체
- Main Thread or UI Thread
- Native 영역에 레이아웃을 그려주는 역할
- JavaScript Thread
- 작성한 JS가 실행되는 곳
- Shadow Thread
- virtual Dom으로부터 새로운 Layout으로 변환하도록 계산해주는 역할
- Native Module Thread
- Native Module을 다룰 때 사용하게 되는 Thread
- 특정 리소스등을 요청하고자 할 때 사용
- 앱에 진입하면 MainThread가 JS Bundle을 load > JS Thread로 전송
- JS Thread에서 Diffing 작업 수행 후 완료시점에 Shadow Thread로 이동
- Diffing이란?
- virtual DOM과 실제 DOM element를 비교하며 변경되었는지 체크
- Diffing이란?
- Shadow Thread에서 Diffing이 끝난 후에 반영할 Layout을 계산 하고 Main Thread에 계산된 Layout을 전달 > Main Thread는 계산된 Layout 반영
- 그 후 이미 JS를 load해왔기 때문에 diffing 작업 수행 (반복)
- 그것은 바로 React-Native Bridge
- Bridge는 Javascript와 Native가 서로 소통하게 할 수 있도록 돕는 역할
- 변수들을 JSON형태로 변경하는데 이 과정에서 많은 리소스 생김
- Native API를 사용하기 위한 것
- 주로 현재 위치, wifi 상태 등 native 영역에서만 알고 있는 정보에 접근하는 것
- 또는, image processing처럼 연산이 native의 높은 performance가 필요할 때 사용
- 두 가지를 다룸
- Native UI Component
1-1. View에 대한 Native Module
1-2. 주로 카메라 등 연산이 많은 View에 대해서 작성 - Native Module
2-1. 로직/연산에 대한 Native Module
2-2. 어떤 Native Library의 함수를 호출할 때 사용
- Native UI Component
-
왜 새로운 아키텍처?
- Bridge가 가지고 있는 본질적인 문제를 해결하기 위함
-
Bridte가 가진 제한점
- 비동기 처리
1-1. JS Thread가 Native에 특정 리소스를 요청하면 결과값은 비동기(Promise)로 처리되기 때문에 기다려야 함 - 싱글 스레드
2-1. JS가 싱글스레드에서 동작하기 때문에 Bridge도 싱글 스레드로 동작 - 변환시 드는 과도한 비용
3-1. Bridge로 이동하게 될 때 JSON Object 변환하는 비용이 큼
-
이러한 이유 때문에 기존에 있던 Bridge를 버리고, JSI가 해당 역할을 대신 하도록 수정
- JSI(Javascript Interface) : C++ 객체에 대한 참조를 할 수 있게 해주는 역할
-
새로운 아키텍처 도입 후 얻은 것
- 동기 실행이 가능하게 됨
- C++ 모듈로 직접 접근을 할 수 있다보니 비동기 통신이 아니어도 됨
- 동시성
- Js에서 다른 스레드에 있는 함수를 호출 할 수 있게 됨
- Overhead 감소
- JSON Object로 변환하지 않고 C++ 언어로 통신하게 되었기 때문
- iOS, Android간 내부 네이티브 모듈 코드 공유 가능
- C++이 추가됨으로 인하여 플랫폼이 다르더라도 한 개의 코드로 관리 가능
- 타입의 안정성
- 자동으로 생성되는 코드 레이어에 의해서 자동으로 타입을 생성하도록 되어있음
- 동기 실행이 가능하게 됨
- 기존에는 Bridge를 통해 JS와 Native를 연결하던 방식이 Bridge를 제거하고 Fabric과 JSI가 도입됨.
- 이는 RN 0.7 버전에서 시작되었고(아키텍처 전환 시작)
- 0.75 버전에서 BridgeLess모드가 기본으로 설정됨.
- 추가
- 0.60 버전은 네이티브 모듈의 Auto Link 기능과 CocoaPods 기본 지원
- New Architecture의 새로운 rendering system
- 이전 Architecture에서는 UI Manager가 담당하던 부분
- Shadow Thread에서 새로운 Shadow Tree를 계산하던 로직을 C++로직으로 변환 가능하도록 수정
- onLayout, onMeasure 등 View의 위치, 사이즈등을 계산하던 로직을 비동기에서 동기함수로 변환했기 때문에 많은 퍼포먼스 이득
- 기존 Architecture에서는 Native Module로 사용되던 것
- Bridge가 사라지게 되면서 추가 됨
- 장점
- Platform 전반적으로 Typecheck가 잘됨
- 플랫폼 별 코드 공유가 쉬움(C++로 작성된 코드를 공유)
- Native Module Lazy Loading이 적용됨
- 3rd-party libarary에서 제공되는 코드를 인터페이스에 맞게 작성하면 JSI관련 코드들을 만들어 주는 것
- 프로젝트를 빌드 할 때 자동으로 실행(빌드시간에 영향)
-
Facebook에서 만든 javascript Engine
-
Bytecode 형태로 미리 컴파일 하여 저장 해 둔 뒤 사용
-
즉, 앱이 최초 로딩시 js bundle 파일을 읽어와 동작 가능한 javascript로 compile 하게되는데
-
Hermes는 앱 빌드 시간에 parse와 compile등 필요한 작업을 빌드 할 때 하도록 함
-
Bytecode 형태로 미리 컴파일 해두면 실행만 시키면 되기 때문
-
이렇게 Bytecode로 되어있는 bundle을 읽어올 경우 추가적인 장점은(relase build Type으로 확인)
- 사용하는 Memory의 감소
- AAB / APK 크기 감소 .
- React-Native에서 Animation을 Frame drop 없이 사용가능 하도록 만든 패키지
- React-Native Animated가 가지고 있는 단점을 해결
- 위와 같은 단점이 있어 react-native-reanimated는 animation 관련된 작업을 모두 Main Thread에서 실행
- worklet을 이용하여 JS Thread로 전달
- wroklet react-native-reanimated V2에 생김
- 작은 조각의 javascript조각
- 뷰 속성을 업데이트 하거나, 이벤트에 반응할 때 UI Thread에서 바로 실행시킬 수 있는 JS 조각
- 사용법
const value = 50; const funcA = () => { "worklet" //함수 외부에 있는 값을 사용하더라도 함께 가져감 ... logic }
- JS Thread와 Main Thread 모두에서 읽기 또는 수정이 가능한 값
- Main Thread에서는 값이 변경됨을 바로 감지할 수 있어 읽기에 특화 됨
- 핸드폰의 움직임을 감지하기 위해 사용하는 센서
- x,y,z로 좌표를 만들고 핸드폰이 움직임에 따라 변경된 값이 나옴
- 자이로스코프 센서와 함께 사용되는 편
Gyro: 회전하는 것
- 핸드폰의 회전동작을 감지하고, 어느 방향인지 감지해서 어느정도로 회전 되어있는지를 감지하기 위한 것
- 라이브러리가 잘못되었을 경우에 패치 하는 방법
- Github에 fork를 통해 내 소유의 Repo로 전환이후 잘못된 부분에 대한 commit을 통한 수정. 이후 원래 repo에서 해당 내용을 patch하게 되는 경우, 애써 만들었던 내용을 온전히 버려야 함
- patch-package 사용. npm install 이후에 스크립트를 사용하여 버전을 비교한 뒤 지정한 패치 내용이 적용 되는 것
- SQLite를 react-native에서도 사용 가능하도록 만든 패키지
- Structured Query Language의 약자 "구조화 된 질의 언어". 즉, 데이터 베이스에서 데이터를 가져오기 위한 언어
- 표를 만드는 것처럼 데이터를 구조화 시켜 저장하는 것. SQL은 표에 있는 데이터들을 가져오도록 명령하는 언어
- INSERT
- 어떠한 값을 추가하기 위한 구문
INSERT INTO table_name($column1, $column2, $column3)
- UPDATE
- 어떠한 값을 수정하기 위한 구문
UPDATE table_name
- DELETE
- 어떠한 값을 삭제하기 위한 구문
DELETE FROM table_name WHERE ${value}={value}
- SELECT
- 어떠한 값을 조회하기 위한 구문
SELECT*FROM table_name WHERE value={value}
- SQL + Lite의 합성어
- 모바일 환경에 적합하게 가볍게 설계 되어있음
- 앱을 만드는데 있어서 필요한 만큼의 기능들은 제공됨







