---
# System prepended metadata

title: RN 몇몇 내용 독해

---

---
tag: rn
---
# RN 몇몇 내용 독해

## 디버깅

[공식 문서](https://reactnative.dev/docs/debugging)

RN의 디버깅 인터페이스는 디바이스(device)와 웹(chrome) 인터페이스로 나뉩니다.

### 디바이스

![device 이미지](https://reactnative.dev/assets/images/DeveloperMenu-f22b01f374248b3242dfb3a1017f98a8.png)

디바이스의 인터페이스는 디바이스를 흔들어서 접근할 수 있습니다. fast refresh를 설정하거나 키보드 단축키를 활성화 할 수 있습니다.

**Fast Refresh**는 RN 코드의 변경에 대해 즉각적인 피드백을 처리하게 할 수 있습니다.

**inspector**는 개별 컴포넌트의 정보를 보여주는 오버레이를 띄워줍니다.

![inspector](https://reactnative.dev/assets/images/Inspector-4bd1342086bcd964bbd7f82e453743a7.gif)

### 크롬 도구

디바이스의 개발자메뉴에서 원격 JS 디버깅(Debug JS Remotely)를 선택하면 8081포트에서 [debugger-ui](http://localhost:8081/debugger-ui)를 열 수 있습니다.

크롬이 아닌 사파리에서도 활용 가능합니다.

### React 개발자 도구

`react-devtools`는 크롬 extension뿐만 아니라 독립형 도구를 제공합니다. [독립 도구 git](https://github.com/facebook/react/tree/main/packages/react-devtools)

![독립 도구](https://user-images.githubusercontent.com/29597/63811956-bdd9b580-c8dd-11e9-8962-c568e475c425.png)

독립도구는 전역으로 설치된 `react-devtools`에 의해 실행할 수 있습니다.

```
npm i -g react-devtools

react-devtools (실행)
```

`react-devtools`는 react native의 inspector와 통합될 수 있습니다. 

![web-inspector](https://reactnative.dev/assets/images/ReactDevToolsInspector-fb13d6cdad3479437715a25e038cf6f6.gif)

기존의 react와 동일하게 `react-devtools`에서 동작시킬 때 props와 state를 검사할 수 있습니다. 다만 먼저 **크롬 왼쪽 상단 드롭다운에 debuggerWorker.js가 동작하고 있는지 반드시 확인해야합니다.**


## 리엑트 네이티브의 코어 컴포넌트

React native는 코어 컴포넌트, 네이티브 컴포넌트, 커뮤니티 컴포넌트의 종합으로 어플리케이션을 개발합니다.

공식 문서에서 설명하는 주요 코어 컴포넌트는 아래와 같습니다.

**View, Text, Image, ScrollView, TextInput**

위 컴포넌트들은 네이티브 브릿지를 통해 각 플랫폼(Android, IOS, Web)에 해당하는 UI로 변경되어 처리됩니다.


## 터치 관련 옵션들

[공식 문서](https://reactnative.dev/docs/handling-touches)

디바이스에서 유저의 동작과 가장 직접적으로 연결된 것은 touch입니다. 기본적으로 RN은 `Button`을 제공하지만 Button이외의 요소를 touch로 감싸기 위한 고차 컴포넌트를 제공합니다. 개발자는 원하는 피드백에따라 Touchable 컴포넌트를 선택하여 요소를 감쌀 수 있습니다.

**TouchableHighlight**는 터치시 컴포넌트의 배경이 어두워집니다.

**TouchableOpacity**는 터치시 컴포넌트가 투명해집니다.

**TouchableNativeFeedback**은 안드로이드에서 제공하는 native 터치 모듈입니다.

**TouchableWithoutFeedback**은 피드백없이 터치에 대한 이벤트를 제공합니다.

### Scroll 과 Swiping

터치로 동작하는 흔한 제스쳐중에 스크롤링(상 - 하(pans))과 스와이핑(좌 - 우)가 있습니다. 이는 ScrollView에서 집중적으로 다룹니다.

## 애니메이션

[공식 문서](https://reactnative.dev/docs/animations)

애니메이션은 어플리케이션에 생기를 불어넣는 중요한 요소이자, 퍼포먼스와 직결되는 요소입니다.

RN의 `Animated API`는 이를 start/stop으로 제어하는 메서드 기반으로 제공합니다.

`Animated API`는 기본적으로 **View, Text, Image, ScrollView, FlatList, SectionList**가 애니메이션을 제공하는 컴포넌트 타입이지만 `createAnimatedComponent()`를 통해 직접 생성할 수 있습니다.

### Example

```typescript
import React, { useRef, useEffect } from 'react';

const FadeInView = ({ children }) => {
  const fadeAnim = useRef(new Animated.Value(0)).current;
  
  useEffect(() => {
    Animated.timing(
      fadeAnim,
      {
        toValue: 1,
        duration: 10000,
      }
    ).start();
  }, [fadeAnim]);
  
  return (
    <Animated.View
      style={{
        opacity: fadeAnim,
      }}
    >
      {children}
    </Animated.View>
  );
}
```

### Animation의 구성

[공식 문서](https://reactnative.dev/docs/animated#configuring-animations)

`Animated`에 의해 선언된 형태는 타입에 따라 인터페이스를 결정하고 이를 스타일에 적용합니다.

위 코드에서 `timing`은 시간의 흐름에 따른 애니메이션을 선언하며 이는 css의 일반적인 애니메이션과 동일하게 동작합니다. 그외에 `decay`, `spring`등의 다른 타입또한 제공합니다.

또한 애니메이션은 결합될 수 있습니다. 이를 위한 sequence, delay등의 메서드를 제공하고 리스트에 저장된 애니메이션을 지정에따라 start/stop을 진행합니다.

애니메이션은 유저의 동작(스크롤, 스와이프)에 의해서도 처리할 수 있습니다. 이를 `event` 인터페이스로 구현합니다. 예를 들면 캐러셀을 구현할 때 활용될 수 있습니다.


## 안드로이드 네이티브 모듈

[공식 문서](https://reactnative.dev/docs/native-components-android)

네이티브 모듈은 Java(혹은 Kotlin)으로 직접 개발되어 안드로이드 패키지(package)에 추가되어 집니다. 이를 RN에서 사용하기 위한 약간의 설정이 요구됩니다.

흐름은 네이티브 모듈 개발 -> 패키지 개발 -> 패키지 등록 -> RN에서 호출이 됩니다.

네이티브 모듈은 `ReactContextBaseJavaModule`을 상속하는 것을 권장합니다. 이는 액티비티의 생명주기 메소드에 연결될 수 있는 `ReactApplicationContext`를 파라미터로 제공하므로 안정성에 도움이 됩니다. 만약 이가 필요없으면 `NativeModule`을 구현하기만하면(혹은 `BaseJavaModule`을 확장하면) 동작할 수 있습니다.

네이티브 모듈은 JS에서 그 이름으로 선언되기 위해 getName을 반드시 오버라이드 해야합니다.

```java
// add to CalendarModule.java
@Override
public String getName() {
   return "yourModuleName";
}
```

또한 JS에서 호출될 메서드는 `@ReactMothod`로 데코레이터(decorator)되어야 합니다. `@ReactMethod(isBlockingSynchronousMethod = true)`를 통해 동기 메서드로 표기할 수 있습니다. 다만 이는 성능 저하를 포함하므로 권장하지 않습니다.

```java
@ReactMethod
public void someFunctionCalledInJS() {
}
```

작성된 모듈은 Package로 선언되고 어플리케이션 레벨에 등록되어 사용됩니다.

자세한 코드는 공식문서를 참고합니다.
