Skip to main content

51 posts tagged with "announcement"

View All Tags

React Native 0.63 출시: LogBox 소개

· 14 min read
Mike Grabowski
Mike Grabowski
CTO and Co-Founder at Callstack

오늘 우리는 LogBox가 기본적으로 활성화된 상태로 제공되는 React Native 0.63을 출시한다.

LogBox

React Native 커뮤니티에서 자주 제기되는 피드백은 에러와 경고 메시지를 디버깅하기 어렵다는 점이었다. 이를 해결하기 위해 React Native의 전체 에러, 경고, 로그 시스템을 처음부터 다시 설계했다.

LogBox 스크린샷

LogBox는 React Native의 redbox, yellowbox, 로깅 경험을 완전히 재설계한 것이다. 0.62 버전에서는 LogBox를 옵트인 방식으로 도입했지만, 이번 릴리스에서는 모든 React Native에서 기본 경험으로 제공한다.

LogBox는 에러와 경고 메시지가 너무 장황하거나 형식이 잘못되었거나, 실행 가능한 조치가 없었던 문제를 해결하기 위해 세 가지 주요 목표에 집중했다:

  • 간결성: 로그는 문제를 디버깅하는 데 필요한 최소한의 정보만 제공해야 한다.
  • 형식화: 로그는 필요한 정보를 빠르게 찾을 수 있도록 잘 정리된 형식이어야 한다.
  • 실행 가능성: 로그는 문제를 해결하고 다음 단계로 넘어갈 수 있도록 실행 가능해야 한다.

이러한 목표를 달성하기 위해 LogBox는 다음과 같은 기능을 포함한다:

  • 로그 알림: 경고 알림을 재설계하고 에러를 지원하도록 개선했다. 이제 모든 console.warnconsole.log 메시지는 앱을 가리지 않고 알림으로 표시된다.
  • 코드 프레임: 모든 에러와 경고 메시지에는 앱 내에서 로그의 소스 코드를 보여주는 코드 프레임이 포함된다. 이를 통해 문제의 원인을 빠르게 파악할 수 있다.
  • 컴포넌트 스택: 모든 컴포넌트 스택은 이제 에러 메시지에서 분리되어 별도의 섹션에 표시되며, 상위 세 개의 프레임이 보인다. 이를 통해 로그 메시지를 어지럽히지 않고 스택 프레임 정보를 일관된 공간에서 확인할 수 있다.
  • 스택 프레임 접기: 기본적으로 앱 코드와 관련 없는 호출 스택 프레임을 접어서 React Native 내부 코드를 뒤지는 대신 앱 내 문제를 빠르게 확인할 수 있다.
  • 구문 에러 형식화: 구문 에러의 형식을 개선하고 구문 강조가 적용된 코드 프레임을 추가했다. 이를 통해 에러의 소스를 확인하고 수정한 후 React Native의 방해 없이 코딩을 계속할 수 있다.

이 모든 기능은 에러와 경고 간 일관된 디자인으로 통합되었으며, 모든 로그를 하나의 편리한 UI에서 페이징할 수 있도록 개선되었다.

이번 변경으로 YellowBox 대신 LogBox API를 사용한다:

  • LogBox.ignoreLogs(): 이 함수는 YellowBox.ignoreLogs([])를 대체하며, 주어진 문자열이나 정규식과 일치하는 로그를 무시한다.
  • LogBox.ignoreAllLogs(): 이 함수는 console.disableYellowBox를 대체하며, 에러나 경고 알림을 끌 수 있다. 단, 이는 알림만 비활성화하며, 처리되지 않은 에러는 여전히 전체 화면 LogBox를 열 것이다.

0.63 버전에서는 이러한 사용 중단된 모듈이나 메서드를 사용할 때 경고를 표시한다. 0.64 버전에서 이 API가 제거되기 전에 호출 부분을 업데이트해야 한다.

LogBox와 React Native 디버깅에 대한 자세한 내용은 문서를 참고한다.

Pressable

React Native는 플랫폼의 사용자 기대치를 충족하는 애플리케이션을 만들 수 있도록 설계되었다. 이는 React Native로 개발되었다는 사실을 드러내는 작은 단서를 피하는 것을 포함한다. 이러한 단서의 주요 원인 중 하나는 Touchable 컴포넌트들이다: Button, TouchableWithoutFeedback, TouchableHighlight, TouchableOpacity, TouchableNativeFeedback, 그리고 TouchableBounce. 이 컴포넌트들은 사용자 상호작용에 시각적 피드백을 제공해 애플리케이션을 인터랙티브하게 만든다. 하지만 플랫폼의 상호작용과 일치하지 않는 내장 스타일과 효과를 포함하고 있어, 사용자가 React Native로 작성된 경험을 알아챌 수 있다.

또한 React Native가 성장하고 고품질 애플리케이션에 대한 기준이 높아짐에 따라, 이 컴포넌트들은 그에 맞춰 발전하지 못했다. React Native는 이제 Web, Desktop, TV와 같은 플랫폼을 지원하지만, 추가적인 입력 방식에 대한 지원은 부족했다. React Native는 모든 플랫폼에서 고품질 상호작용 경험을 지원해야 한다.

이러한 문제를 해결하기 위해, 새로운 코어 컴포넌트인 Pressable을 출시했다. 이 컴포넌트는 다양한 유형의 상호작용을 감지하는 데 사용할 수 있다. API는 상위 컴포넌트에서 수동으로 상태를 유지하지 않고도 상호작용의 현재 상태에 직접 접근할 수 있도록 설계되었다. 또한 플랫폼이 호버, 블러, 포커스 등의 기능을 확장할 수 있도록 설계되었다. 대부분의 사람들이 TouchableOpacity와 같은 기본 경험에 의존하기보다는 Pressable을 활용해 컴포넌트를 구축하고 공유할 것으로 기대한다.

import {Pressable, Text} from 'react-native';

<Pressable
onPress={() => {
console.log('pressed');
}}
style={({pressed}) => ({
backgroundColor: pressed ? 'lightskyblue' : 'white',
})}>
<Text style={styles.text}>Press Me!</Text>
</Pressable>;

Pressable 컴포넌트의 간단한 예제

더 자세한 내용은 공식 문서에서 확인할 수 있다.

네이티브 색상 (PlatformColor, DynamicColorIOS)

모든 네이티브 플랫폼은 시스템에서 정의한 색상 개념을 가지고 있다. 이 색상들은 라이트 모드나 다크 모드와 같은 시스템 테마 설정, 고대비 모드와 같은 접근성 설정, 그리고 포함된 뷰나 윈도우의 특성과 같은 앱 내부의 컨텍스트에 자동으로 반응한다.

Appearance API나 AccessibilityInfo를 통해 이러한 설정 중 일부를 감지하고 스타일을 조정할 수 있지만, 이러한 추상화는 개발 비용이 많이 들 뿐만 아니라 네이티브 색상의 외관을 근사치로만 흉내낸다. 이러한 불일치는 React Native 엘리먼트와 네이티브 엘리먼트가 공존하는 하이브리드 애플리케이션에서 특히 두드러진다.

React Native는 이제 이러한 시스템 색상을 바로 사용할 수 있는 기본 제공 솔루션을 제공한다. PlatformColor()는 React Native에서 다른 색상과 마찬가지로 사용할 수 있는 새로운 API다.

예를 들어, iOS에서는 시스템이 labelColor라는 색상을 제공한다. 이 색상을 React Native에서 PlatformColor를 사용해 다음과 같이 적용할 수 있다:

import {Text, PlatformColor} from 'react-native';

<Text style={{color: PlatformColor('labelColor')}}>
This is a label
</Text>;

Text 컴포넌트의 색상을 iOS에서 정의한 labelColor로 설정한다.

반면 Android는 colorButtonNormal과 같은 색상을 제공한다. 이 색상을 React Native에서 다음과 같이 사용할 수 있다:

import {View, Text, PlatformColor} from 'react-native';

<View
style={{
backgroundColor: PlatformColor('?attr/colorButtonNormal'),
}}>
<Text>This is colored like a button!</Text>
</View>;

View 컴포넌트의 배경색을 Android에서 정의한 colorButtonNormal로 설정한다.

PlatformColor에 대해 더 자세히 알고 싶다면 공식 문서를 참고하라. 또한 RNTester에 있는 실제 코드 예제도 확인할 수 있다.

DynamicColorIOS는 iOS 전용 API로, 라이트 모드와 다크 모드에서 사용할 색상을 정의할 수 있다. PlatformColor와 마찬가지로, 이 API는 색상을 사용할 수 있는 모든 곳에서 사용할 수 있다. DynamicColorIOS는 내부적으로 iOS의 colorWithDynamicProvider를 사용한다.

import {Text, DynamicColorIOS} from 'react-native';

const customDynamicTextColor = DynamicColorIOS({
dark: 'lightskyblue',
light: 'midnightblue',
});

<Text style={{color: customDynamicTextColor}}>
This color changes automatically based on the system theme!
</Text>;

시스템 테마에 따라 텍스트 색상을 자동으로 변경한다.

DynamicColorIOS에 대해 더 자세히 알고 싶다면 공식 문서를 참고하라.

iOS 9 및 Node.js 8 지원 중단

출시된 지 4년이 넘은 iOS 9에 대한 지원을 중단한다. 이 변경으로 특정 iOS 버전에서 기능을 지원하는지 확인하기 위해 네이티브 코드에 추가해야 하는 호환성 검사를 줄일 수 있다. 이는 개발 속도를 높이는 데 도움이 된다. iOS 9의 시장 점유율이 1%에 불과하므로, 고객에게 큰 부정적인 영향을 미치지 않을 것이다.

동시에 Node 8에 대한 지원도 중단한다. Node 8의 LTS 유지보수 주기는 2019년 12월에 종료됐다. 현재 LTS 버전은 Node 10이며, 이제 이 버전을 목표로 한다. React Native 애플리케이션 개발에 여전히 Node 8을 사용하고 있다면, 최신 보안 수정 사항과 업데이트를 받기 위해 업그레이드할 것을 권장한다.

기타 주요 개선 사항

  • <View /><Text /> 내에서 명시적 크기 없이 렌더링 지원: 이제 <Text /> 컴포넌트 안에 있는 <View />를 명시적으로 너비와 높이를 설정하지 않고도 렌더링할 수 있다. 이전 React Native 버전에서는 RedBox 오류가 발생했던 문제가 해결되었다.

  • iOS 런치 스크린을 xib에서 storyboard로 변경: 2020년 4월 30일부터 App Store에 제출되는 모든 앱은 Xcode 스토리보드를 사용해 앱의 런치 스크린을 제공해야 하며, 모든 iPhone 앱은 모든 iPhone 화면을 지원해야 한다. 이번 커밋은 React Native 기본 템플릿을 이 요구사항에 맞게 조정한다.

감사의 말

0.63 버전을 만드는 데 도움을 준 수백 명의 기여자들에게 감사드립니다!

LogBox 섹션을 작성한 Rick Hanlon과 이 글의 Pressable 부분을 작성한 Eli White에게 특별한 감사를 전합니다.

모든 업데이트를 확인하려면 0.63 변경 로그를 참고하세요.

Flipper가 포함된 React Native 0.62 발표

· 9 min read
Rick Hanlon
Facebook의 React Native 코어 개발자

오늘 우리는 Flipper를 기본적으로 지원하는 React Native 버전 0.62를 출시한다.

이번 릴리스는 전 세계적인 팬데믹 상황 속에서 이루어졌다. 이 버전을 오늘 출시하는 이유는 이번 릴리스를 가능하게 한 수백 명의 기여자들의 노력을 존중하고, 릴리스가 master 브랜치에서 너무 멀어지지 않도록 하기 위해서다. 이슈 해결에 기여할 수 있는 인력이 제한적이라는 점을 고려해, 필요하다면 업그레이드를 잠시 미루는 것도 고려해 보길 바란다.

기본 제공되는 Flipper

Flipper는 모바일 앱 디버깅을 위한 개발자 도구다. Android와 iOS 커뮤니티에서 널리 사용되며, 이번 릴리스에서는 새롭거나 기존의 React Native 앱에서 기본적으로 지원하도록 설정했다.

React Native용 Flipper 스크린샷

Flipper는 기본적으로 다음과 같은 기능을 제공한다:

  • Metro Actions: 툴바에서 바로 앱을 리로드하거나 개발자 메뉴를 실행한다.
  • Crash Reporter: Android와 iOS 기기에서 발생한 크래시 리포트를 확인한다.
  • React DevTools: 최신 버전의 React DevTools를 다른 도구들과 함께 사용한다.
  • Network Inspector: 기기 애플리케이션이 만든 모든 네트워크 요청을 확인한다.
  • Metro and Device Logs: Metro와 기기에서 발생한 모든 로그를 확인하고 검색하며 필터링한다.
  • Native Layout Inspector: React Native 렌더러가 출력한 네이티브 레이아웃을 확인하고 편집한다.
  • Database and Preference Inspectors: 기기의 데이터베이스와 환경설정을 확인하고 편집한다.

또한 Flipper는 확장 가능한 플랫폼이기 때문에, NPM에서 플러그인을 가져오는 마켓플레이스를 제공한다. 이를 통해 여러분의 워크플로우에 특화된 커스텀 플러그인을 게시하고 설치할 수 있다. 사용 가능한 플러그인은 여기에서 확인할 수 있다.

더 많은 정보는 Flipper 문서를 참고한다.

새로운 다크 모드 기능

사용자의 선호 색상 테마(라이트 또는 다크)와 같은 외관 설정에 접근할 수 있는 새로운 Appearance 모듈을 추가했다.

const colorScheme = Appearance.getColorScheme();
if (colorScheme === 'dark') {
// 다크 색상 테마 사용
}

또한 사용자 설정의 상태 업데이트를 구독할 수 있는 훅도 추가했다:

import {Text, useColorScheme} from 'react-native';

const MyComponent = () => {
const colorScheme = useColorScheme();
return <Text>useColorScheme(): {colorScheme}</Text>;
};

더 자세한 내용은 AppearanceuseColorScheme 문서를 참고한다.

Apple TV를 react-native-tvos로 이전

Lean Core 프로젝트의 일환으로, 그리고 React Native Windows와 React Native macOS 같은 다른 플랫폼과 일관성을 유지하기 위해, 코어에서 Apple TV 전용 코드를 제거하기 시작했다.

앞으로 React Native의 Apple TV 지원은 react-native-community/react-native-tvos와 해당 react-native-tvos NPM 패키지에서 관리될 예정이다. 이 저장소는 Apple TV를 지원하기 위해 필요한 변경 사항만 포함한 메인 저장소의 완전한 포크 버전이다.

react-native-tvos의 릴리스는 React Native의 공개 릴리스를 기반으로 한다. 이번 react-native 0.62 릴리스에서는 Apple TV 프로젝트를 react-native-tvos 0.62로 업그레이드해야 한다.

업그레이드 지원 강화

0.61 버전이 출시되었을 때, 커뮤니티는 React Native의 새로운 버전으로 업그레이드하는 개발자를 지원하기 위해 업그레이드 헬퍼 도구를 선보였다. 이 도구는 현재 사용 중인 버전과 목표 버전 간의 변경 사항을 비교하여 특정 업그레이드에 필요한 수정 사항을 확인할 수 있게 해준다.

하지만 이 도구를 사용하더라도 업그레이드 과정에서 문제가 발생할 수 있다. 이를 해결하기 위해 Upgrade-Support를 공개하며 더 전문화된 업그레이드 지원을 제공한다. Upgrade Support는 GitHub 이슈 트래커로, 사용자가 프로젝트를 업그레이드하는 과정에서 발생한 문제를 제출하고 커뮤니티의 도움을 받을 수 있다.

우리는 업그레이드 경험을 지속적으로 개선하기 위해 노력하고 있으며, 이러한 도구들이 아직 다루지 못한 특수한 경우에도 사용자들이 필요한 지원을 받을 수 있기를 바란다.

기타 개선 사항

  • LogBox: 새로운 LogBox 오류 및 경고 경험을 선택적으로 추가했다. 이를 활성화하려면 index.js 파일에 require('react-native').unstable_enableLogBox()를 추가한다.
  • React DevTools v4: 최신 React DevTools로 업그레이드했다. 이는 성능 향상, 개선된 네비게이션 경험, React Hooks에 대한 완전한 지원을 제공한다.
  • 접근성 개선: accessibilityValue 추가, Touchables에 누락된 props 추가, onSlidingComplete 접근성 이벤트 추가, Switch 컴포넌트의 기본 역할을 "button"에서 "switch"로 변경하는 등 접근성 관련 개선 사항을 적용했다.

주요 변경 사항

  • PropTypes 제거: React Native 코어의 앱 크기 영향을 줄이고, 런타임이 아닌 컴파일 타임에 타입을 검사하는 정적 타입 시스템을 선호하기 위해 코어 컴포넌트에서 propTypes를 제거한다.
  • accessibilityStates 제거: 더 의미론적으로 풍부한 방식으로 컴포넌트의 상태 정보를 접근성 서비스에 전달할 수 있는 새로운 accessibilityState 프로퍼티를 도입하면서, 더 이상 사용되지 않는 accessibilityStates 프로퍼티를 제거했다.
  • TextInput 변경 사항: TextInput에서 드물게 사용되고, W3C 표준을 준수하지 않으며, Fabric에서 구현하기 어려운 onTextInput제거했다. 또한 문서화되지 않은 inputView 프로퍼티와 selectionState도 제거했다.

사용 중단 예정 기능

  • AccessibilityInfo.fetch는 이미 사용 중단 예정이었지만, 이번 릴리스에서 경고 메시지를 추가했다.
  • useNativeDriver 설정은 이제 필수로 지정했다. 이는 향후 기본값 전환을 지원하기 위함이다.
  • Animated 컴포넌트의 ref는 이제 내부 컴포넌트를 참조하며, getNode사용 중단 예정으로 지정했다.

감사의 말

0.62 버전을 가능하게 해준 수많은 기여자 여러분께 감사드립니다!

모든 업데이트 내용을 확인하려면 0.62 변경 로그를 참고하세요.

Meet Doctor, a new React Native command

· 3 min read
Lucas Bento
React Native Community

React Native 커뮤니티의 6명의 기여자가 20개 이상의 풀 리퀘스트를 통해 기여한 결과, 개발 환경 설정, 문제 해결, 그리고 오류 자동 수정을 도와주는 새로운 커맨드인 react-native doctor를 출시하게 되어 기쁘게 생각합니다. doctor 커맨드는 ExpoHomebrew의 doctor 커맨드에서 영감을 받았으며, Jest의 UI에서도 영향을 받았습니다.

Announcing React Native 0.61 with Fast Refresh

· 6 min read
Dan Abramov
React Core at Facebook

React Native 0.61을 발표하게 되어 기쁘게 생각합니다. 이번 버전에는 Fast Refresh라는 새로운 리로딩 기능이 포함되어 있습니다.

빠른 새로고침(Fast Refresh)

리액트 네이티브 커뮤니티에 공통적인 문제점에 대해 물었을 때, 가장 많이 언급된 답변 중 하나는 "핫 리로딩" 기능이 제대로 작동하지 않는다는 것이었다. 이 기능은 함수형 컴포넌트에서 신뢰할 수 없었고, 화면 업데이트가 자주 실패했으며, 오타나 실수에 취약했다. 대부분의 사람들이 이 기능을 비활성화했다는 피드백을 받았다.

리액트 네이티브 0.61에서 기존의 "라이브 리로딩"(저장 시 재로딩)과 "핫 리로딩" 기능을 통합해 "빠른 새로고침(Fast Refresh)"라는 새로운 기능으로 재설계했다. 빠른 새로고침은 다음과 같은 원칙으로 처음부터 구현되었다:

  • 빠른 새로고침은 함수형 컴포넌트와 훅을 포함한 모던 리액트를 완벽히 지원한다.
  • 빠른 새로고침은 오타나 실수 후에도 원활히 복구하며, 필요한 경우 전체 재로딩으로 대체한다.
  • 빠른 새로고침은 코드 변환을 과도하게 수행하지 않아 기본적으로 활성화해도 안정적이다.

빠른 새로고침이 작동하는 모습을 보려면 다음 비디오를 확인해 보자:

한번 사용해 보고 의견을 남겨 주세요! 원한다면 개발자 메뉴(iOS에서는 Cmd+D, 안드로이드에서는 Cmd+M 또는 Ctrl+M)에서 비활성화할 수 있다. 활성화와 비활성화는 즉시 적용되므로 언제든지 가능하다.

빠른 새로고침 사용 시 유용한 팁 몇 가지:

  • 빠른 새로고침은 기본적으로 함수형 컴포넌트(와 훅!)의 로컬 상태를 유지한다.
  • 매번 수정 시 리액트 상태를 초기화해야 한다면, 해당 컴포넌트 파일에 // @refresh reset 주석을 추가하면 된다.
  • 빠른 새로고침은 클래스 컴포넌트를 상태를 유지하지 않고 항상 다시 마운트한다. 이는 안정적인 작동을 보장한다.
  • 코드에서 실수를 할 때마다 빠른 새로고침은 파일 저장 후 자동으로 렌더링을 재시도한다. 구문 오류나 런타임 오류를 수정한 후 앱을 수동으로 재로딩할 필요가 없다.
  • 수정 중 console.logdebugger 문을 추가하는 것은 유용한 디버깅 기법이다.

빠른 새로고침 관련 문제가 있다면 GitHub에 보고해 주세요. 검토하겠습니다.

기타 개선 사항

  • use_frameworks! CocoaPods 지원 수정. 0.60 버전에서 CocoaPods를 기본적으로 통합하기 위해 몇 가지 업데이트를 진행했다. 하지만 이로 인해 use_frameworks!를 사용하는 빌드가 깨지는 문제가 발생했다. 이 문제는 0.61 버전에서 수정되어, 동적 프레임워크를 사용하는 iOS 프로젝트에 React Native를 더 쉽게 통합할 수 있게 됐다.

  • useWindowDimensions Hook 추가. 이 새로운 Hook은 자동으로 화면 크기 업데이트를 제공하고 구독한다. 대부분의 경우 Dimensions API 대신 사용할 수 있다.

  • React 16.9로 업그레이드. 이 버전에서는 UNSAFE_ 생명주기 메서드의 구식 이름을 더 이상 사용하지 않도록 변경했고, act 기능이 개선됐다. 자세한 내용과 자동 마이그레이션 스크립트는 React 16.9 블로그 포스트에서 확인할 수 있다.

주요 변경 사항

  • React .xcodeproj 제거. 0.60 버전에서 CocoaPods를 통한 자동 링크 기능을 도입했다. 또한 CocoaPods를 e2e 테스트 실행에 통합해, 이제부터는 iOS 앱에 RN을 통합하는 표준 방식으로 사용한다. 이로 인해 React .xcodeproj 지원이 사실상 중단되었으며, 0.61 버전부터 해당 파일이 제거되었다. 참고: 이미 0.60 버전의 자동 링크를 사용 중이라면 이 변경 사항의 영향을 받지 않는다.

감사 인사

0.61 버전을 만드는 데 도움을 주신 모든 기여자분들께 감사드립니다!

업데이트 내용을 확인하려면 0.61 변경 로그를 참고하세요.

Meet Hermes, a new JavaScript Engine optimized for React Native

· 3 min read
Rachel Nabors
Documentation Engineer at Facebook

지난주 Chain React 컨퍼런스에서 Facebook이 개발한 오픈소스 JavaScript 엔진인 Hermes를 공개했다. Hermes는 Android에서 React Native를 실행하기 위해 최적화된 작고 가벼운 JavaScript 엔진이다. 자세히 알아보기!

Hermes는 메모리 사용량을 줄이고, 다운로드 크기를 줄이며, 앱이 사용 가능해지는 시간 즉 "Time to Interactive"(TTI)를 단축함으로써 React Native의 성능을 향상시킨다.

"성능 데이터를 분석하면서 JavaScript 엔진 자체가 앱 시작 성능과 다운로드 크기에 큰 영향을 미친다는 사실을 발견했다. 이 데이터를 바탕으로 데스크톱이나 노트북보다 제약이 많은 모바일 환경에서 JavaScript 성능을 최적화해야 한다는 결론을 내렸다. 여러 옵션을 검토한 끝에 Hermes라는 새로운 JavaScript 엔진을 개발했다. Hermes는 메모리가 제한적이고 저장 장치가 느리며 컴퓨팅 성능이 낮은 대중 시장 기기에서도 React Native 앱의 성능을 개선하도록 설계되었다." —Hermes: React Native부터 시작하는 모바일 앱 최적화 오픈소스 JavaScript 엔진

바로 시작하고 싶은가? 기존 React Native 앱에서 Hermes를 활성화하는 새로운 가이드를 확인하자!

Hermes와 React Native 로고가 합쳐져 날개 달린 모습으로, 외로운 Android 폰에서 치솟는 전기 폭풍 속에 떠오르는 일러스트 Rachel Nabors의 일러스트

React Native 0.60 출시 소식

· 9 min read
Ryan Turner
코어 메인테이너 & React Native 개발자

수백 명의 기여자가 수개월간 열심히 노력한 끝에, React Native 코어 팀은 버전 0.60 출시를 발표하게 되어 기쁘게 생각한다. 이번 릴리스는 Android와 iOS 플랫폼 모두에서 중요한 마이그레이션을 처리하며, 많은 문제도 해결했다. 이 블로그 포스트는 이번 릴리스의 주요 내용을 다룬다. 항상 그렇듯, 더 자세한 정보는 변경 로그를 참고하기 바란다. 마지막으로, 이번 이정표를 달성하는 데 도움을 준 모든 기여자에게 감사한다!

접근성에 초점을 맞추기

접근성 API에는 announceForAccessibility와 같은 다양한 개선 사항이 추가되었다. 또한 역할(roles), 액션 지원(action support), 플래그(flags) 등 여러 부분에서 개선이 이루어졌다. 접근성은 복잡한 분야이지만, 이러한 개선 사항이 A11Y를 조금 더 쉽게 만들어 줄 것으로 기대한다. 자세한 내용은 2019년 6월 React Native 오픈소스 업데이트를 참고하면 된다.

새로운 시작

React Native의 시작 화면이 업데이트됐다! 새로운 UI를 만드는 데 도움을 준 많은 기여자들에게 감사한다. 이 새로운 "Hello World" 화면은 사용자를 더 친근하고 매력적인 방식으로 생태계에 맞이한다.

새로운 초기 화면은 개발자들이 처음부터 리소스와 좋은 예제를 통해 시작할 수 있도록 돕는다

AndroidX 지원

AndroidX는 안드로이드 생태계에서 중요한 발전을 이루었다. 기존의 지원 라이브러리 아티팩트는 더 이상 사용되지 않는다. React Native 0.60 버전부터는 AndroidX로 마이그레이션되었다. 이는 주요 변경 사항이며, 여러분의 네이티브 코드와 의존성도 마이그레이션해야 한다.

이 변경으로 인해 React Native 앱은 AndroidX를 사용해야 한다. 한 앱에서 둘을 동시에 사용할 수 없으므로, 앱 코드와 의존성 코드 모두 AndroidX 또는 기존 지원 라이브러리 중 하나를 사용해야 한다.

matt-oakes on discussions-and-proposals

여러분의 네이티브 코드는 직접 마이그레이션해야 하지만, @mikehardy, @cawfree, 그리고 @m4tt72node_modules를 패치할 수 있는 똑똑한 도구 "jetifier"를 만들었다. 라이브러리 관리자들은 업그레이드해야 하지만, 이 도구는 임시 해결책을 제공하며 AndroidX 버전을 출시할 시간을 벌어준다. 따라서 AndroidX 마이그레이션과 관련된 오류가 발생하면 이 도구를 사용해 보자.

기본 CocoaPods 설정

이제 CocoaPods가 React Native iOS 프로젝트의 일부로 포함되었다. 이전에 사용하지 않았다면, 앞으로 iOS 플랫폼 코드를 열 때 xcworkspace 파일을 사용해야 한다. (팁: 루트 프로젝트 디렉토리에서 xed ios를 실행해 보자.) 또한, 내부 패키지의 podspec이 Xcode 프로젝트와 호환되도록 변경되었다. 이는 문제 해결과 디버깅에 도움이 될 것이다. 0.60 버전으로 업그레이드하면서 몇 가지 간단한 변경Podfile에 적용해야 한다. use_frameworks!와 관련된 호환성 문제가 있음을 알고 있으며, 이를 해결하기 위한 이슈를 추적 중이다.

Lean Core 제거 작업

WebViewNetInfo는 이전에 별도의 저장소로 분리되었으며, React Native 0.60에서는 이들을 React Native 저장소에서 완전히 이관했다. 또한, 새로운 App Store 정책에 대한 커뮤니티 피드백을 반영해 Geolocation도 분리했다. 아직 마이그레이션을 완료하지 않았다면 react-native-webview, @react-native-community/netinfo, @react-native-community/geolocation에 의존성을 추가해 작업을 완료해야 한다. 자동화된 솔루션을 원한다면 rn-upgrade-deprecated-modules를 사용해 볼 수 있다. 분리 이후 이 저장소들에는 100개 이상의 커밋이 이루어졌으며, 커뮤니티의 지속적인 지원이 기대된다!

네이티브 모듈 자동 연결 기능 추가

React Native CLI 팀은 네이티브 모듈 연결 방식을 크게 개선한 자동 연결(autolinking) 기능을 도입했다. 이제 대부분의 경우 react-native link 명령어를 사용할 필요가 없다. 동시에 팀은 일반적인 연결 프로세스도 전면 개편했다. 위 문서에서 언급한 대로 기존에 연결된 의존성은 react-native unlink로 해제해야 한다.

업그레이드 헬퍼

@lucasbento, @pvinis, @kelset, 그리고 @watadarkstarUpgrade Helper라는 훌륭한 도구를 개발했다. 이 도구는 업그레이드 과정을 더 간단하게 만들어준다. React Native 사용자가 브라운필드 앱이나 복잡한 커스텀 설정을 가진 경우, 버전 간 변경 사항을 쉽게 확인할 수 있도록 도와준다. 업그레이드 문서를 확인하고, 오늘 바로 여러분의 업그레이드 경로에 이 도구를 활용해보자!

Upgrade Helper는 React Native의 다른 버전으로 마이그레이션하기 위해 필요한 변경 사항을 깔끔하고 쉽게 보여준다

라이브러리 관리자를 위한 주의사항

AndroidX로의 변경은 거의 대부분 라이브러리 업데이트를 필요로 한다. 따라서 가능한 한 빨리 지원을 추가해야 한다. 아직 업그레이드할 준비가 되지 않았다면, 사용자가 빌드 시 라이브러리를 패치할 수 있는지 확인하기 위해 jetifier를 사용해 라이브러리를 점검해 보는 것이 좋다.

설정과 README를 업데이트하려면 autolinking 문서를 검토한다. 라이브러리가 이전에 어떻게 통합되었는지에 따라 추가 변경이 필요할 수도 있다. 의존성 인터페이스를 정의하는 방법에 대한 정보는 CLI의 dependencies 가이드를 참고한다.

감사합니다

이번에 소개한 내용은 주요 업데이트 중 일부에 불과합니다. 더 많은 변화를 확인하려면 변경 로그를 살펴보세요. 앞으로도 더 많은 소식에 주목해 주시기 바랍니다. 그동안 0.60 버전을 즐겨보세요!

React Native Open Source Update June 2019

· 14 min read
Christoph Nakazawa
Christoph Nakazawa
Former Engineer at Facebook

코드와 커뮤니티 건강

지난 6개월 동안 550명 이상의 기여자가 React Native에 총 2800개의 커밋을 작성했다. 커뮤니티에서 400명의 기여자가 1,150개의 Pull Request를 생성했으며, 이 중 820개의 Pull Request가 병합되었다.

Lean Core 작업을 통해 웹사이트, CLI, 그리고 여러 모듈을 React Native에서 분리했음에도 불구하고, 지난 6개월 동안 하루 평균 Pull Request 수는 3개에서 약 6개로 증가했다. 현재 평균 오픈 Pull Request 수는 25개 미만이며, 대부분 몇 시간에서 며칠 내에 피드백과 리뷰를 제공한다.

의미 있는 커뮤니티 기여

최근 커뮤니티에서 이루어진 몇 가지 멋진 기여를 소개한다:

Lean Core

Lean Core의 주요 목표는 React Native의 모듈을 별도의 저장소로 분리하여 더 나은 유지보수를 가능하게 하는 것이다. 단 6개월 만에 WebView, NetInfo, AsyncStorage, 웹사이트, 그리고 CLI와 같은 저장소에서 총 800개 이상의 Pull Request가 처리되었다. 더 나은 유지보수 외에도, 이러한 프로젝트들은 React Native 자체보다 더 자주 독립적으로 릴리스될 수 있다.

또한, React Native 자체에서 더 이상 필요하지 않은 폴리필과 레거시 컴포넌트를 제거할 기회를 활용했다. 과거에는 JavaScriptCore(JSC)의 구버전에서 MapSet과 같은 언어 기능을 지원하기 위해 폴리필이 필요했다. 이제 React Native가 새로운 버전의 JSC를 포함하므로, 이러한 폴리필을 제거했다.

이 작업은 아직 진행 중이며, 네이티브와 JavaScript 양쪽에서 더 많은 요소를 분리하거나 제거해야 한다. 하지만 초기 징후로는, 점점 커지는 표면적과 앱 크기의 증가 추세를 뒤집는 데 성공한 것으로 보인다. 예를 들어, JavaScript 번들 크기를 살펴보면, 약 1년 전 버전 0.54에서 React Native의 JavaScript 번들 크기는 530kb였고, 6개월 만에 버전 0.57에서 607kb(+77kb)로 증가했다. 이제는 master 브랜치에서 번들 크기가 28kb 감소한 579kb로, 100kb 이상의 차이를 보이고 있다.

Lean Core 작업의 첫 번째 반복을 마무리하면서, React Native에 추가되는 새로운 API에 대해 더 신중하게 접근할 것이다. 또한, React Native를 더 작고 빠르게 만드는 방법을 지속적으로 평가하고, 커뮤니티가 다양한 컴포넌트의 소유권을 가질 수 있도록 지원할 방법을 모색할 것이다.

사용자 피드백

6개월 전 커뮤니티에 "React Native에서 불편한 점은 무엇인가요?"라는 질문을 던졌다. 이를 통해 사람들이 겪고 있는 문제를 종합적으로 파악할 수 있었다. 몇 달 전에 해당 게시물에 답변을 남겼고, 이제 주요 이슈에 대한 진행 상황을 요약할 때가 되었다:

  • 업그레이드: React Native 커뮤니티는 업그레이드 경험을 개선하기 위해 여러 노력을 기울였다. autolinkingrn-diff-purge를 통한 더 나은 업그레이드 커맨드, 곧 출시될 업그레이드 헬퍼 웹사이트 등이 대표적이다. 또한 각 주요 릴리스마다 블로그 포스트를 발행해 주요 변경 사항과 새로운 기능을 알릴 예정이다. 이러한 개선 사항들은 0.60 릴리스 이후의 업그레이드를 훨씬 쉽게 만들어 줄 것이다.

  • 지원 / 불확실성: Pull Request에 대한 활동 부족과 Facebook의 React Native 투자에 대한 불확실성으로 많은 사람들이 불만을 표시했다. 앞서 보여준 것처럼, 이제 더 많은 Pull Request를 받을 준비가 되어 있으며 여러분의 제안과 기여를 기대하고 있다.

  • 성능: React Native 0.59는 더 빠른 버전의 JavaScriptCore(JSC)를 포함해 출시되었다. 또한 기본적으로 inline-requires를 쉽게 활성화할 수 있도록 개선했으며, 다음 몇 달 동안 더 흥미로운 업데이트를 준비 중이다.

  • 문서: 최근 React Native 문서 전체를 개편하고 재작성하는 작업을 시작했다. 기여하고 싶다면 여러분의 도움을 기대한다.

  • Xcode 경고: 기존의 모든 경고를 제거했으며, 새로운 경고가 발생하지 않도록 노력하고 있다.

  • 핫 리로딩: React 팀이 새로운 핫 리로딩 시스템을 개발 중이며, 곧 React Native에 통합될 예정이다.

아쉽게도 아직 모든 부분을 개선하지는 못했다:

  • 디버깅: 매일 발생하는 불편한 버그와 이슈를 많이 수정했지만, 디버깅 부분에서는 기대만큼 진전을 이루지 못했다. React Native의 디버깅 경험이 아직 부족하다는 점을 인지하고 있으며, 향후 이를 개선하는 데 우선순위를 둘 예정이다.

  • Metro 심볼릭 링크: 아직 간단하고 직관적인 해결책을 제공하지 못했다. 하지만 React Native 사용자들이 다양한 임시 해결책을 공유했으니 참고하면 도움이 될 것이다.

지난 6개월 동안 많은 변화가 있었기 때문에, 같은 질문을 다시 던져보고자 한다. 최신 버전의 React Native를 사용 중이고 피드백을 남기고 싶다면, “React Native에서 불편한 점은 무엇인가요?”의 새 버전에 의견을 남겨주길 바란다.

지속적 통합

페이스북은 모든 Pull Request와 내부 변경 사항을 먼저 페이스북의 저장소에 병합한 다음 모든 커밋을 GitHub로 동기화한다. 페이스북의 인프라는 일반적인 지속적 통합 서비스와 다르며, 모든 오픈소스 테스트가 페이스북 내부에서 실행되지는 않는다. 이 때문에 GitHub로 동기화된 커밋이 자주 오픈소스 테스트를 깨뜨리며, 이를 수정하는 데 많은 시간이 소요된다.

React Native 팀의 Héctor Ramos는 지난 두 달 동안 페이스북과 GitHub에서 React Native의 지속적 통합 시스템을 개선하는 데 집중했다. 이제 대부분의 오픈소스 테스트는 페이스북에서 React Native에 변경 사항을 커밋하기 전에 실행된다. 이로 인해 커밋이 동기화될 때 GitHub에서 CI가 안정적으로 유지될 것이다.

다음 소식

React Native의 미래에 대한 이야기를 놓치지 마세요! 앞으로 몇 달 동안 Facebook의 React Native 팀 멤버들이 Chain ReactReact Native EU에서 발표할 예정입니다. 또한, 곧 출시될 0.60 버전도 기대해 주세요. 정말 흥미로울 거예요

React Native at F8 and Open Source Podcast

· 4 min read
Christoph Nakazawa
Christoph Nakazawa
Former Engineer at Facebook

이번 주, Eli WhiteF8 2019에서 페이스북의 안드로이드와 iOS 앱에서의 React Native에 대해 발표했다. 지난 2년간 진행한 작업과 앞으로의 계획을 공유하게 되어 기쁘게 생각한다.

페이스북 개발자 웹사이트에서 영상을 확인해 보자:

React Native에 관한 F8 발표

발표 내용 요약:

  • 2017년과 2018년에는 React Native로 개발된 가장 큰 제품인 Facebook의 Marketplace에 집중했다. Marketplace 팀과 협력해 제품의 품질을 개선하고 사용자 경험을 더욱 즐겁게 만들었다. 현재 Marketplace는 Facebook 앱 내에서 Android와 iOS 모두에서 가장 높은 품질을 자랑하는 제품 중 하나다.
  • Marketplace의 성능은 특히 중급 Android 기기에서 큰 도전이었다. 지난 한 해 동안 시작 시간을 50% 이상 단축했고, 더 많은 개선이 진행 중이다. 가장 큰 개선 사항들은 React Native에 통합되어 올해 후반에 커뮤니티에 공개될 예정이다.
  • React Native를 통해 Facebook이 필요로 하는 고품질의 고성능 앱을 구축할 수 있다는 확신을 얻었다. 이 확신은 React Native의 핵심을 재구성하는 것과 같은 더 큰 도전에 투자할 수 있게 해주었다.
  • Microsoft는 React Native for Windows를 지원하고 사용하며, 개발자들이 자신의 전문 지식과 코드베이스를 활용해 Microsoft의 Universal Windows Platform에 렌더링할 수 있도록 한다. 다음 주에 열리는 Microsoft Build에서 이에 대해 더 자세히 들을 수 있다.

오픈소스에 관한 React Radio 팟캐스트

Eli의 발표는 최근 진행한 오픈소스 작업에 대한 이야기로 마무리된다. 우리는 3월에 진행 상황을 업데이트했고, 최근 Nader DabitGant Laborde가 Christoph를 초대해 그들의 팟캐스트 React Native Radio에서 React Native와 오픈소스에 대해 이야기를 나눴다.

팟캐스트 하이라이트:

  • 페이스북의 React Native 팀이 오픈소스를 어떻게 바라보는지, 그리고 React Native와 같은 규모의 프로젝트를 위한 지속 가능한 커뮤니티를 어떻게 구축하고 있는지 이야기했다.
  • Lean Core 프로젝트의 일환으로 여러 모듈을 제거하는 작업을 진행 중이다. WebView와 React Native CLI와 같은 모듈은 분리된 이후 100개 이상의 Pull Request를 받았다.
  • 다음으로는 React Native 웹사이트와 문서를 전면 개편하는 데 집중할 예정이다. 계속 지켜봐 주세요!

이번 에피소드는 곧 여러분이 즐겨 사용하는 팟캐스트 앱에서 확인할 수 있다. 또는 아래에서 바로 녹음본을 들을 수 있다:

Releasing React Native 0.59

· 11 min read
Ryan Turner
Core Maintainer & React Native Developer

React Native 0.59 버전을 소개합니다. 이번 릴리스는 88명의 기여자가 참여해 총 644개의 커밋으로 이루어진 대규모 업데이트입니다. 또한, 이슈 관리, 커뮤니티 활성화, 그리고 React Native를 가르치는 등 다양한 형태의 기여도 이루어졌습니다. 여러분의 노력에 감사드립니다. 이번 달에는 많은 사람들이 기다려온 여러 변경 사항이 포함되어 있습니다. 즐겁게 사용해 주시기 바랍니다.

🎣 훅스가 도입되었다

이번 릴리스에는 컴포넌트 간에 상태 로직을 재사용할 수 있는 React 훅스가 포함되었다. 훅스에 대한 관심이 뜨겁지만 아직 잘 모르는 독자를 위해 몇 가지 유용한 자료를 소개한다:

여러분의 앱에서 훅스를 직접 사용해 보길 권한다. 우리가 경험한 것처럼 훅스의 재사용성이 흥미롭게 느껴질 것이다.

📱 업데이트된 JSC로 인한 성능 향상과 안드로이드 64비트 지원

React Native는 여러분의 애플리케이션을 구동하기 위해 JSC(JavaScriptCore)를 사용한다. 안드로이드의 JSC는 몇 년 전 버전이어서 많은 모던 자바스크립트 기능을 지원하지 못했다. 더 나쁜 점은 iOS의 최신 JSC에 비해 성능이 떨어졌다는 것이다. 이번 릴리즈로 이러한 문제가 모두 해결되었다.

@DanielZlotin, @dulmandakh, @gengjiawen, @kmagiera, 그리고 @kudo의 멋진 작업 덕분에 JSC가 몇 년 간의 격차를 따라잡았다. 이로 인해 64비트 지원, 모던 자바스크립트 지원, 그리고 큰 성능 향상이 이루어졌다. 또한, 이제는 유지보수가 가능한 프로세스로 만들어 향후 WebKit 개선 사항을 별도의 노력 없이 활용할 수 있게 해준 점도 칭찬할 만하다. 이 작업을 가능하게 해준 Software Mansion과 Expo에게도 감사드린다.

💨 인라인 리퀘어를 통해 더 빠른 앱 실행

React Native 앱이 기본적으로 뛰어난 성능을 발휘할 수 있도록 돕고자, Facebook의 최적화 기술을 커뮤니티에 제공하려고 한다. 이 기능은 '인라인 리퀘어'라고 불리며, Metro가 지연 로딩할 컴포넌트를 식별할 수 있게 한다. 이로 인해 앱이 필요한 리소스를 필요할 때 로드하므로, 앱 실행 속도가 느려지는 문제를 해결한다. 특히 컴포넌트 구조가 복잡하고 다양한 앱에서 가장 큰 성능 향상을 기대할 수 있다.

0.59 템플릿의 metro.config.js 파일 소스, inlineRequires를 활성화하는 위치를 보여줌

이 기능을 기본적으로 활성화하기 전에, 커뮤니티의 피드백이 필요하다. 0.59 버전으로 업그레이드하면 새로운 metro.config.js 파일이 생성된다. 여기서 옵션을 true로 설정하고 피드백을 보내주길 바란다. 앱의 성능을 측정하고 싶다면 성능 문서에서 인라인 리퀘어에 대해 자세히 알아볼 수 있다.

🚅 Lean Core 진행 중

React Native는 크고 복잡한 프로젝트로, 리포지토리 구조가 복잡하다. 이로 인해 코드베이스는 기여자들이 접근하기 어렵고, 테스트가 힘들며, 개발 의존성으로서 불필요하게 비대해졌다. Lean Core는 이러한 문제를 해결하기 위해 코드를 별도의 라이브러리로 이전해 더 나은 관리를 목표로 하는 노력이다. 지난 몇 차례 릴리스에서 첫 단계를 진행했지만, 이제 본격적으로 시작할 때다.

여러분은 추가 컴포넌트들이 공식적으로 더 이상 사용되지 않는다는 것을 눈치챌 수 있을 것이다. 이는 좋은 소식이다. 이제 해당 기능을 적극적으로 유지보수하는 소유자가 생겼기 때문이다. 경고 메시지를 주의 깊게 확인하고, 새로운 라이브러리로 마이그레이션하라. 이 기능들은 향후 릴리스에서 제거될 예정이다. 아래 표는 컴포넌트, 현재 상태, 그리고 마이그레이션할 수 있는 새로운 위치를 나타낸다.

컴포넌트더 이상 사용되지 않음?새로운 위치
AsyncStorage0.59@react-native-community/react-native-async-storage
ImageStore0.59expo-file-system or react-native-fs
MaskedViewIOS0.59@react-native-community/react-native-masked-view
NetInfo0.59@react-native-community/react-native-netinfo
Slider0.59@react-native-community/react-native-slider
ViewPagerAndroid0.59@react-native-community/react-native-viewpager

앞으로 몇 달 동안 더 많은 컴포넌트가 이 경로를 따라 더 가벼운 코어로 이동할 것이다. 우리는 이 작업에 도움을 필요로 한다. Lean Core umbrella로 가서 기여를 시작해 보라.

👩🏽‍💻 CLI 개선 사항

React Native의 커맨드라인 도구는 개발자가 이 생태계에 접근하는 첫 관문이다. 하지만 오랫동안 문제점이 지적되어 왔고 공식적인 지원도 부족했다. 이제 CLI 도구는 새로운 저장소로 이전되었으며, 전담 관리자 그룹이 몇 가지 흥미로운 개선 작업을 진행했다.

로그 형식이 훨씬 더 깔끔해졌다. 또한 명령어 실행 속도가 거의 즉각적으로 빨라졌다. 체감할 수 있을 정도의 차이가 있다:

0.58 버전의 CLI는 시작 속도가 느리다0.59 버전의 CLI는 거의 즉각적으로 실행된다

🚀 0.59 버전으로 업그레이드

여러분의 React Native 업그레이드 프로세스에 대한 피드백을 듣고, 향후 릴리스에서 경험을 개선하기 위해 조치를 취하고 있다. 0.59 버전으로 업그레이드하려면 rn-diff-purge를 사용해 현재 React Native 버전과 0.59 버전 사이의 변경 사항을 확인한 후, 수동으로 변경 사항을 적용하는 것을 추천한다. 프로젝트를 0.59 버전으로 업그레이드한 후에는 새롭게 개선된 react-native upgrade 명령어(이 명령어는 rn-diff-purge를 기반으로 한다!)를 사용해 0.60 버전 이상으로 업그레이드할 수 있다.

🔨 주요 변경 사항

0.59 버전에서 Android 지원은 Google의 최신 권장 사항에 맞춰 정리되었다. 이로 인해 기존 앱에서 문제가 발생할 수 있다. 런타임 크래시와 함께 "이 액티비티에는 Theme.AppCompat 테마(또는 이를 상속한 테마)를 사용해야 합니다"라는 메시지가 표시될 수 있다. 프로젝트의 AndroidManifest.xml 파일을 업데이트하고, android:theme 값이 AppCompat 테마(예: @style/Theme.AppCompat.Light.NoActionBar)인지 확인하는 것을 권장한다.

0.59 버전에서는 react-native-git-upgrade 명령어가 제거되었고, 새롭게 개선된 react-native upgrade 명령어로 대체되었다.

🙏 감사합니다

많은 새로운 기여자들이 플로우 타입에서 네이티브 코드 생성 활성화Xcode 경고 해결에 도움을 주셨습니다. 이러한 작업은 React Native가 어떻게 동작하는지 배우고 더 큰 선을 위해 기여할 수 있는 훌륭한 방법입니다. 감사합니다! 앞으로도 비슷한 이슈들을 기대해 주세요.

이번에 주목할 만한 주요 변경 사항들 외에도, 흥미로운 업데이트들이 많이 있습니다. 모든 업데이트를 확인하려면 변경 로그를 살펴보세요. 0.59 버전은 대규모 릴리스입니다. 여러분이 직접 사용해 보시길 기대합니다.

올해 남은 기간 동안 더 많은 개선 사항들이 예정되어 있습니다. 계속 지켜봐 주세요!

RyanReact Native 코어 팀

React Native 오픈소스 업데이트 (2019년 3월)

· 10 min read
Christoph Nakazawa
Christoph Nakazawa
Former Engineer at Facebook

2018년 4분기에 우리는 React Native 오픈소스 커뮤니티에 더 많은 투자를 하기로 결정한 후 React Native 오픈소스 로드맵을 발표했다.

첫 번째 목표로 우리는 커뮤니티에서 가장 눈에 띄는 부분을 파악하고 개선하는 데 집중했다. 주요 목표는 미처리된 풀 리퀘스트를 줄이고, 프로젝트의 범위를 축소하며, 주요 사용자 문제를 식별하고, 커뮤니티 관리 가이드라인을 마련하는 것이었다.

지난 두 달 동안 우리는 예상보다 더 많은 진전을 이루었다. 자세한 내용은 아래에서 확인할 수 있다:

풀 리퀘스트 관리

건강한 커뮤니티를 구축하려면 코드 기여에 신속하게 대응해야 한다. 지난 몇 년간 커뮤니티 기여 리뷰를 우선순위에서 밀려나게 하며 280개의 풀 리퀘스트가 누적되었다(2018년 12월 기준). 첫 번째 마일스톤에서 열려 있던 풀 리퀘스트 수를 약 65개로 줄였다. 동시에 하루 평균 풀 리퀘스트 개수는 3.5개에서 7개로 증가했으며, 이는 지난 3개월 동안 약 600개의 풀 리퀘스트를 처리했음을 의미한다.

풀 리퀘스트 중 약 3분의 2는 병합했고, 나머지 3분의 1은 닫았다. 병합하지 않고 닫은 경우는 오래되었거나 품질이 낮았거나, 프로젝트의 범위를 불필요하게 확장시키는 경우였다. 병합된 풀 리퀘스트 대부분은 버그 수정, 크로스 플랫폼 일관성 개선, 새로운 기능 도입과 관련이 있었다. 주목할 만한 기여로는 타입 안전성 개선과 AndroidX 지원 작업이 있다.

Facebook에서는 마스터 브랜치에서 React Native를 실행하므로, 모든 변경 사항을 React Native 릴리스에 반영하기 전에 먼저 테스트한다. 병합된 풀 리퀘스트 중 문제를 일으킨 것은 6개뿐이었다. 이 중 4개는 내부 개발에만 영향을 미쳤고, 2개는 릴리스 후보 단계에서 발견되었다.

커뮤니티 기여 중 눈에 띄는 예로는 업데이트된 “RedBox” 화면이 있다. 이는 커뮤니티가 개발자 경험을 더 친화적으로 만드는 좋은 사례다.

핵심 기능 최적화

현재 React Native는 매우 넓은 기능 범위를 가지고 있으며, Facebook에서 자주 사용하지 않는 여러 유지보수되지 않은 추상화들이 포함되어 있다. 우리는 React Native를 더 작고 가볍게 만들기 위해 기능 범위를 줄이고, Facebook에서 주로 사용되지 않는 추상화들을 커뮤니티가 더 잘 관리할 수 있도록 작업 중이다.

첫 번째 단계로, Lean Core 프로젝트에 대해 커뮤니티에 도움을 요청했다. 응답은 압도적이었고, 모든 진행 상황을 따라가기 어려울 정도였다. 한 달도 채 되지 않은 기간 동안 완료된 작업을 확인해 보라!

가장 기쁜 점은 유지보수 담당자들이 오랫동안 해결되지 않은 문제들을 수정하고, 테스트를 추가하며, 오랫동안 요청받던 기능을 지원하기 위해 적극적으로 참여했다는 것이다. 이러한 모듈들은 React Native 내에서보다 더 많은 지원을 받고 있으며, 이는 커뮤니티에게 큰 도약임을 보여준다. 예를 들어, WebView많은 풀 리퀘스트를 받았고, CLI는 이제 커뮤니티 멤버들에 의해 유지보수되며 필요한 개선과 수정을 받았다.

주요 사용자 문제

12월에 커뮤니티에 React Native에 대해 불만스러운 점을 물었다. 응답을 모아 각 문제에 대해 답변을 달았다. 다행히 커뮤니티가 겪는 많은 문제는 Facebook에서도 마찬가지로 발생하는 문제다. 다음 마일스톤에서 주요 문제 중 일부를 해결할 계획이다.

가장 많은 표를 받은 문제 중 하나는 React Native의 최신 버전으로 업그레이드할 때의 개발자 경험이었다. 불행히도 이 문제는 우리가 master 브랜치에서 React Native를 실행하기 때문에 직접 경험하지는 않는다. 다행히 커뮤니티 멤버들이 이 문제를 해결하기 위해 나섰다:

0.59 릴리스

React Native 커뮤니티, 특히 Mike GrabowskiLorenzo Sciandra의 도움 없이는 이번 릴리스를 진행할 수 없었다. 우리는 릴리스 관리 프로세스를 개선하고 앞으로 더 적극적으로 참여할 계획이다:

  • 주요 릴리스마다 커뮤니티 멤버들과 함께 블로그 포스트를 작성할 것이다.
  • 사용자가 새 버전으로 업그레이드할 때 CLI에서 주요 변경 사항을 직접 보여줄 것이다.
  • 릴리스에 걸리는 시간을 줄일 것이다. 자동화된 테스트를 늘리고 개선된 수동 테스트 계획을 마련하는 방법을 모색 중이다.

이러한 계획 중 상당 부분이 곧 출시될 React Native 0.59 릴리스에 반영될 것이다. 0.59 버전은 React Hooks, Android용 64비트 JavaScriptCore 버전, 그리고 다양한 성능 및 기능 개선 사항을 포함한다. 현재 릴리스 후보로 출시되었으며, 다음 2주 안에 안정화될 예정이다.

다음 단계

앞으로 두 달 동안 우리는 진행 상황을 유지하면서 풀 리퀘스트를 계속 관리할 것이다. 동시에 미해결된 GitHub 이슈의 수를 줄이기 시작할 것이다. Lean Core 프로젝트를 통해 React Native의 범위를 계속 축소할 계획이다. 우리는 커뮤니티에서 가장 중요한 문제 5가지를 해결할 것이다. 커뮤니티 가이드라인을 마무리하면서 웹사이트와 문서 작업에 집중할 예정이다.

3월에는 Facebook 런던 사무소에서 커뮤니티 기여자 10명 이상을 초청해 여러 작업을 함께 진행할 예정이다. 여러분이 React Native를 사용하고 있다는 사실에 기쁘게 생각하며, 2019년에 우리가 진행 중인 개선 사항을 직접 확인하고 느낄 수 있기를 바란다. 몇 달 후에 또 다른 업데이트로 찾아뵙겠다. 그동안 여러분의 풀 리퀘스트를 병합할 예정이다! ⚛️✌️