패스잇

모바일 개발

React Native 면접 질문

React(Web)와의 차이, View·Text 같은 기본 컴포넌트, useEffect 의존성과 클린업, Context와 Redux의 선택, React Navigation의 Stack·Tab, JavaScript Bridge 병목, 새 아키텍처(JSI·Fabric·TurboModules) 마이그레이션. React Native 면접은 React 지식 위에 "네이티브와 JS 사이에서 무엇이 느려지는가"를 얹어 묻습니다. 크로스플랫폼 앱 개발 단골 질문을 모범답안과 함께 정리했습니다.

총 21문제 · 기초 7 · 중급 7 · 심화 7 · 모범답안 포함

React Native 면접 질문 · 기초

Q1 기초

React Native는 무엇이며, 모바일 애플리케이션 개발에 어떤 이점을 제공하나요?

힌트 · JavaScript로 iOS/Android 앱 개발, 코드 재사용성, 개발 속도 향상 등의 이점이 있습니다.

React Native는 JavaScript와 React를 사용하여 iOS와 Android 앱을 개발할 수 있게 해주는 프레임워크입니다. "Learn once, write anywhere"라는 슬로건처럼, 하나의 코…

전체 모범답안 펼치기

React Native는 JavaScript와 React를 사용하여 iOS와 Android 앱을 개발할 수 있게 해주는 프레임워크입니다. "Learn once, write anywhere"라는 슬로건처럼, 하나의 코드베이스로 두 플랫폼 모두에 앱을 만들 수 있다는 점이 가장 큰 장점입니다.

React Native의 이점은 크게 세 가지로 볼 수 있습니다. 첫째, 코드 재사용성이 높아 개발 속도를 향상시킬 수 있습니다. 둘째, JavaScript 개발자가 네이티브 앱 개발에 쉽게 접근할 수 있습니다. 셋째, 핫 리로딩과 같은 기능을 통해 개발 편의성을 높여줍니다. 물론, 완벽한 네이티브 성능을 위해서는 네이티브 모듈과의 연동이 필요할 수도 있습니다. 하지만 대부분의 경우 React Native만으로도 충분히 훌륭한 앱을 만들 수 있습니다.

#JavaScript#컴포넌트#재사용성#크로스 플랫폼#네이티브 모듈

이 질문 단독 페이지 →

Q2 기초

React Native가 React (Web)와 가장 큰 차이점은 무엇이며, 이로 인해 어떤 개발 방식의 변화가 필요한가요?

힌트 · DOM 대신 네이티브 UI 컴포넌트를 사용하며, 웹 표준 CSS 대신 JavaScript로 스타일링합니다.

React Native와 React (Web)의 가장 큰 차이점은 UI 렌더링 방식입니다. React는 DOM을 사용하여 웹 브라우저에 UI를 그리지만, React Native는 네이티브 UI 컴포넌트를 사용하여 i…

전체 모범답안 펼치기

React Native와 React (Web)의 가장 큰 차이점은 UI 렌더링 방식입니다. React는 DOM을 사용하여 웹 브라우저에 UI를 그리지만, React Native는 네이티브 UI 컴포넌트를 사용하여 iOS나 Android와 같은 플랫폼의 UI를 직접 렌더링합니다.

이러한 차이점 때문에 개발 방식에 몇 가지 변화가 필요합니다. 예를 들어, 웹에서는 HTML 태그를 사용하지만 React Native에서는 <View>, <Text>, <Image>와 같은 네이티브 컴포넌트를 사용해야 합니다. 또한, 웹 표준 CSS 대신 JavaScript로 스타일링해야 하며, 플랫폼별 API를 직접 호출해야 하는 경우도 있습니다. React Native는 브릿지를 통해 JavaScript 코드와 네이티브 코드를 연결하며, 쓰레딩 모델도 웹과는 다르게 동작하므로 이를 고려하여 개발해야 합니다.

#네이티브 컴포넌트#브릿지#쓰레딩 모델#플랫폼 API#UI 렌더링 방식

이 질문 단독 페이지 →

Q3 기초

React Native에서 가장 기본적인 컴포넌트인 `View`와 `Text`의 역할은 무엇이며, 각각 어떤 용도로 사용되는지 설명해주세요.

힌트 · `View`는 컨테이너 역할을 하며, `Text`는 텍스트를 표시하는 데 사용됩니다.

React Native에서 View와 Text는 가장 기본적인 컴포넌트입니다.

전체 모범답안 펼치기

React Native에서 View와 Text는 가장 기본적인 컴포넌트입니다.

View는 웹 개발에서의 div와 유사하게, 다른 컴포넌트들을 감싸는 컨테이너 역할을 합니다. 레이아웃을 구성하고 스타일을 적용하는 데 사용되며, 플렉스박스 레이아웃을 기본적으로 지원합니다. 예를 들어, 여러 개의 Text 컴포넌트를 묶어서 화면에 배치할 때 View로 감싸서 스타일을 적용할 수 있습니다.

Text는 화면에 텍스트를 표시하는 데 사용되는 컴포넌트입니다. 텍스트의 스타일(폰트 크기, 색상 등)을 지정할 수 있으며, 다른 Text 컴포넌트를 중첩하여 특정 부분만 다른 스타일을 적용하는 것도 가능합니다.

간단히 말해, View는 레이아웃과 스타일링을 위한 컨테이너, Text는 텍스트 렌더링을 위한 컴포넌트입니다.

#레이아웃#스타일링#텍스트 렌더링#컨테이너#플렉스박스

이 질문 단독 페이지 →

Q4 기초

React Native에서 UI 컴포넌트에 스타일을 적용하는 일반적인 방법 중 `StyleSheet.create`를 사용하는 이유는 무엇인가요?

힌트 · 스타일 객체를 한 번만 생성하여 캐싱함으로써 성능을 최적화하고 가독성을 높입니다.

React Native에서 UI 컴포넌트 스타일링 시 StyleSheet.create를 사용하는 이유는 크게 세 가지입니다.

전체 모범답안 펼치기

React Native에서 UI 컴포넌트 스타일링 시 StyleSheet.create를 사용하는 이유는 크게 세 가지입니다.

첫째, 성능 최적화입니다. StyleSheet.create로 생성된 스타일 객체는 한 번만 생성되어 캐싱되므로, 컴포넌트가 리렌더링될 때마다 새로운 스타일 객체를 생성하는 것을 방지하여 성능을 향상시킵니다.

둘째, 가독성과 유지보수성 향상입니다. 스타일을 별도의 객체로 분리함으로써 코드의 가독성을 높이고, 스타일 변경 시 해당 객체만 수정하면 되므로 유지보수가 용이해집니다.

셋째, 타입 안정성입니다. TypeScript와 함께 사용하면 스타일 객체에 대한 타입 검사를 수행하여 오류를 사전에 방지할 수 있습니다.

예를 들어, const styles = StyleSheet.create({ container: { flex: 1 } }); 와 같이 사용하면 styles.container를 통해 스타일을 재사용할 수 있습니다.

#성능 최적화#재사용성#타입 안정성#가독성#디버깅 용이

이 질문 단독 페이지 →

Q5 기초

React Native에서 레이아웃을 구성할 때 Flexbox를 활용하는 방법과 주요 속성 (예: `flexDirection`, `justifyContent`, `alignItems`)에 대해 설명해주세요.

힌트 · Flexbox는 유연한 박스 모델을 제공하며, `flexDirection`은 주축, `justifyContent`는 주축 정렬, `alignItems`는 교차축 정렬을 담당합니다.

React Native에서 레이아웃을 구성할 때 Flexbox를 활용하는 것은 매우 중요합니다. Flexbox는 화면 크기나 해상도에 상관없이 유연하고 반응형 레이아웃을 만들 수 있도록 도와줍니다.

전체 모범답안 펼치기

React Native에서 레이아웃을 구성할 때 Flexbox를 활용하는 것은 매우 중요합니다. Flexbox는 화면 크기나 해상도에 상관없이 유연하고 반응형 레이아웃을 만들 수 있도록 도와줍니다.

Flexbox의 핵심은 주축(main axis)과 교차축(cross axis)을 기준으로 아이템들을 정렬하는 것입니다. flexDirection 속성은 주축의 방향을 결정합니다. row (가로) 또는 column (세로)으로 설정할 수 있습니다.

justifyContent 속성은 주축을 따라 아이템들을 어떻게 정렬할지 정의합니다. 예를 들어 center는 가운데 정렬, space-between은 아이템 사이에 균등한 간격을 줍니다.

alignItems 속성은 교차축을 따라 아이템들을 정렬합니다. center는 교차축의 가운데, stretch는 컨테이너를 채우도록 늘립니다.

이 세 가지 속성을 조합하면 다양한 레이아웃을 쉽게 구현할 수 있습니다. 예를 들어, 화면 중앙에 텍스트를 배치하려면 flexDirection: column, justifyContent: center, alignItems: center를 사용할 수 있습니다.

#Flexbox#flexDirection#justifyContent#alignItems#반응형 레이아웃

이 질문 단독 페이지 →

Q6 기초

React Native 컴포넌트에서 `state`와 `props`는 각각 어떤 역할을 하며, 이 둘의 주요 차이점은 무엇인가요?

힌트 · `props`는 부모로부터 전달받는 읽기 전용 데이터이며, `state`는 컴포넌트 내부에서 관리되는 변경 가능한 데이터입니다.

React Native 컴포넌트에서 state와 props는 모두 데이터를 다루는 중요한 역할을 합니다.

전체 모범답안 펼치기

React Native 컴포넌트에서 state와 props는 모두 데이터를 다루는 중요한 역할을 합니다.

props는 부모 컴포넌트로부터 자식 컴포넌트로 전달되는 데이터입니다. 중요한 점은 props는 자식 컴포넌트 내부에서 변경할 수 없는 읽기 전용 데이터라는 것입니다. 부모 컴포넌트가 props를 변경해야 자식 컴포넌트가 업데이트됩니다.

반면 state는 컴포넌트 내부에서 관리되는 데이터입니다. 컴포넌트 스스로 setState 메서드를 사용하여 state를 변경할 수 있으며, state가 변경되면 컴포넌트가 다시 렌더링됩니다.

주요 차이점은 props는 외부로부터 전달받아 변경할 수 없는 데이터이고, state는 컴포넌트 내부에서 관리하며 변경 가능한 데이터라는 점입니다. React의 단방향 데이터 흐름을 이해하는 데 중요한 개념입니다.

#상태 관리#불변성#단방향 데이터 흐름#컴포넌트 내부#읽기 전용

이 질문 단독 페이지 →

Q7 기초

React Native 함수형 컴포넌트에서 `useEffect` Hook은 주로 어떤 목적으로 사용되며, 의존성 배열의 역할에 대해 설명해주세요.

힌트 · 컴포넌트 렌더링 후 부수 효과(데이터 fetching, 구독 등)를 처리하며, 의존성 배열로 실행 시점을 제어합니다.

useEffect Hook은 React Native 함수형 컴포넌트에서 주로 사이드 이펙트, 즉 부수 효과를 처리하기 위해 사용됩니다. 컴포넌트가 렌더링된 후에 특정 작업을 수행해야 할 때 유용합니다. 예를 들어,…

전체 모범답안 펼치기

useEffect Hook은 React Native 함수형 컴포넌트에서 주로 사이드 이펙트, 즉 부수 효과를 처리하기 위해 사용됩니다. 컴포넌트가 렌더링된 후에 특정 작업을 수행해야 할 때 유용합니다. 예를 들어, API로부터 데이터를 가져오거나, 외부 라이브러리를 초기화하거나, 구독을 설정하는 등의 작업이 있습니다.

의존성 배열은 useEffect가 언제 다시 실행되어야 하는지를 결정하는 중요한 역할을 합니다. 배열 내에 명시된 값들이 이전 렌더링과 비교하여 변경되었을 때만 useEffect 내부의 함수가 실행됩니다. 빈 배열 []을 전달하면 컴포넌트가 처음 마운트될 때 단 한 번만 실행되고, 배열을 생략하면 매 렌더링마다 실행됩니다. 적절한 의존성 배열을 사용하면 불필요한 업데이트를 방지하여 성능을 최적화할 수 있습니다.

#사이드 이펙트#렌더링#의존성 배열#생명주기#최적화

이 질문 단독 페이지 →

읽기만으론 부족합니다. 직접 말해보세요

패스잇 앱에서 React Native 질문에 직접 답하면 AI가 1:1로 답변을 코칭합니다.

React Native 면접 질문 · 중급

Q8 중급

React Native 컴포넌트에서 `useEffect` 훅의 의존성 배열(dependency array)과 클린업(cleanup) 함수를 사용하여 발생할 수 있는 일반적인 메모리 누수나 불필요한 재실행 문제를 어떻게 방지할 수 있나요?

힌트 · 의존성 배열은 훅의 재실행 조건을 제어하고, 클린업 함수는 컴포넌트 언마운트 시 구독 해제나 타이머 해제 등 리소스 정리를 담당합니다.

useEffect 훅에서 의존성 배열과 클린업 함수를 제대로 사용하지 않으면 메모리 누수나 불필요한 재실행 문제가 발생할 수 있습니다.

전체 모범답안 펼치기

useEffect 훅에서 의존성 배열과 클린업 함수를 제대로 사용하지 않으면 메모리 누수나 불필요한 재실행 문제가 발생할 수 있습니다.

의존성 배열은 useEffect가 언제 다시 실행될지를 결정합니다. 배열에 필요한 값만 넣어야 불필요한 재실행을 막을 수 있습니다. 빈 배열 []을 사용하면 컴포넌트가 처음 마운트될 때만 실행되지만, 외부 변수를 참조하면 예상치 못한 동작이 발생할 수 있습니다. 이럴 땐 useCallback이나 useMemo를 활용해서 함수나 객체의 참조가 변경되지 않도록 관리해야 합니다.

클린업 함수는 컴포넌트가 언마운트될 때 실행되어 리소스를 정리합니다. 예를 들어, 구독을 해제하거나 타이머를 제거하는 데 사용됩니다. 클린업 함수를 제대로 구현하지 않으면 메모리 누수가 발생할 수 있습니다. 특히, 비동기 작업이나 이벤트 리스너를 사용하는 경우 클린업 함수가 필수적입니다.

useEffect(() => {
  const timer = setTimeout(() => {
    // ...
  }, 1000);

  return () => clearTimeout(timer); // 클린업 함수
}, []);

요약하자면, 의존성 배열을 통해 재실행을 제어하고, 클린업 함수를 통해 메모리 누수를 방지하는 것이 중요합니다.

#의존성 배열#클린업 함수#최적화#메모리 누수#재실행 방지

이 질문 단독 페이지 →

Q9 중급

React Navigation 라이브러리에서 `Stack Navigator`와 `Tab Navigator`의 주요 차이점은 무엇이며, 각각 어떤 사용자 경험을 제공할 때 더 적합하다고 생각하시나요?

힌트 · Stack Navigator는 화면 스택 관리를 통해 깊이 있는 탐색 흐름에 적합하며, Tab Navigator는 앱의 주요 섹션 간 빠른 전환에 사용됩니다.

React Navigation에서 Stack Navigator와 Tab Navigator는 앱의 라우팅 구조와 사용자 경험에 큰 차이를 만듭니다.

전체 모범답안 펼치기

React Navigation에서 Stack Navigator와 Tab Navigator는 앱의 라우팅 구조와 사용자 경험에 큰 차이를 만듭니다.

Stack Navigator는 화면을 스택처럼 쌓아 올리는 방식으로, 사용자가 특정 화면에서 다음 화면으로 'push'하고, 뒤로 가기 버튼으로 이전 화면으로 'pop'하는 깊이 우선 탐색에 적합합니다. 예를 들어, 상세 정보 페이지에서 관련 상품 페이지로 이동하는 흐름에 유용합니다.

반면 Tab Navigator는 앱의 주요 섹션들을 탭 형태로 보여주어, 사용자가 앱의 여러 핵심 기능 사이를 빠르고 쉽게 전환할 수 있도록 합니다. 예를 들어, 소셜 미디어 앱에서 '홈', '검색', '프로필' 탭을 제공하는 경우에 적합합니다. Tab Navigator는 수평적인 탐색 구조를 제공하며, 앱의 정보 구조가 명확하고 주요 기능에 대한 빠른 접근이 중요할 때 효과적입니다.

#라우팅 구조#UI 구조#탐색 방식#깊이 우선#수평적 탐색

이 질문 단독 페이지 →

Q10 중급

React Native 애플리케이션에서 `Context API`와 `Redux` (또는 MobX와 같은 전역 상태 관리 라이브러리)의 차이점을 설명하고, 각각 어떤 상황에 더 적합하다고 판단하시나요?

힌트 · Context API는 가벼운 상태 공유에 적합하며, Redux는 복잡하고 대규모 애플리케이션의 예측 가능한 상태 관리에 유리합니다.

네, React Native에서 Context API와 Redux는 모두 전역 상태 관리를 위한 도구이지만, 사용 목적과 복잡성에서 차이가 있습니다.

전체 모범답안 펼치기

네, React Native에서 Context API와 Redux는 모두 전역 상태 관리를 위한 도구이지만, 사용 목적과 복잡성에서 차이가 있습니다.

Context API는 애플리케이션 내에서 데이터를 공유하기 위한 React의 내장 기능입니다. 사용법이 비교적 간단하고, 작은 규모의 애플리케이션에서 전역적으로 필요한 설정 정보나 테마 정보 등을 공유할 때 유용합니다. 하지만 Context를 사용하는 컴포넌트가 많아질수록 성능 문제가 발생할 수 있고, 상태 변화 추적이 어렵다는 단점이 있습니다.

반면 Redux는 더 강력하고 예측 가능한 상태 관리를 위한 라이브러리입니다. 액션, 리듀서, 스토어라는 명확한 구조를 통해 상태 변화를 예측 가능하게 만들고, 미들웨어를 통해 비동기 작업 처리나 로깅 등의 기능을 추가할 수 있습니다. 하지만 설정이 복잡하고, 작은 변화에도 많은 코드를 작성해야 한다는 단점이 있습니다. 따라서 애플리케이션의 규모가 크고, 상태 관리가 복잡하며, 여러 컴포넌트 간의 데이터 흐름이 빈번할 때 Redux를 사용하는 것이 더 적합하다고 생각합니다.

#Context API#Redux#전역 상태 관리#복잡성#성능 최적화

이 질문 단독 페이지 →

Q11 중급

React Native에서 `StyleSheet.create`를 사용하여 스타일을 정의하는 것이 인라인 스타일이나 일반 JavaScript 객체를 직접 사용하는 것보다 어떤 이점들이 있나요?

힌트 · StyleSheet.create는 스타일 객체를 한 번만 생성하여 메모리 사용을 최적화하고, 네이티브 모듈로 전달되어 더 효율적인 렌더링을 가능하게 합니다.

StyleSheet.create를 사용하면 몇 가지 중요한 이점이 있습니다.

전체 모범답안 펼치기

StyleSheet.create를 사용하면 몇 가지 중요한 이점이 있습니다.

첫째, 성능 최적화입니다. StyleSheet.create는 스타일 객체를 한 번만 생성하고, 이를 네이티브 모듈로 전달합니다. 이렇게 하면 매 렌더링마다 새로운 스타일 객체를 생성하는 인라인 스타일이나 일반 JavaScript 객체 사용 시 발생하는 불필요한 오버헤드를 줄여줍니다. 이는 특히 복잡한 UI나 많은 컴포넌트가 렌더링될 때 앱의 전반적인 성능 향상으로 이어집니다.

둘째, 타입 안정성과 유지보수성입니다. StyleSheet.create는 스타일 객체의 유효성을 검사하고, 잠재적인 오류를 미리 잡아낼 수 있도록 도와줍니다. 또한, 스타일을 중앙 집중식으로 관리할 수 있어 코드의 가독성과 재사용성이 높아지고, 나중에 스타일을 수정하거나 확장하기가 훨씬 용이해집니다.

#성능#최적화#타입 안정성#재사용성#유지보수성

이 질문 단독 페이지 →

Q12 중급

`FlatList` 컴포넌트의 성능을 최적화하기 위한 방법들을 3가지 이상 설명하고, 각 방법이 어떤 원리로 성능 향상에 기여하는지 구체적으로 설명해주세요.

힌트 · `getItemLayout`, `keyExtractor`, `initialNumToRender`, `windowSize`, `removeClippedSubviews` 등을 활용하여 불필요한 렌더링을 줄일 수 있습니다.

FlatList 성능 최적화에 대해 말씀드리겠습니다.

전체 모범답안 펼치기

FlatList 성능 최적화에 대해 말씀드리겠습니다.

첫째, keyExtractor prop을 사용하여 각 항목에 고유한 키를 제공하는 것입니다. 이는 React가 목록의 변경 사항을 효율적으로 추적하고 불필요한 컴포넌트 재생성을 방지하는 데 도움이 됩니다.

둘째, getItemLayout prop을 활용하는 것입니다. 이 prop을 사용하면 FlatList가 항목의 높이와 같은 레이아웃 정보를 미리 알 수 있어, 스크롤 시 항목의 위치를 계산하는 데 드는 비용을 줄일 수 있습니다. 특히 항목 높이가 일정할 때 효과적입니다.

셋째, initialNumToRender와 windowSize prop을 적절히 설정하는 것입니다. initialNumToRender는 초기 렌더링 시 보여줄 항목 수를, windowSize는 화면 밖에 있는 항목 중 렌더링할 항목 수를 조절합니다. 이를 통해 화면에 보이지 않는 항목의 렌더링을 최소화하여 메모리 사용량과 렌더링 시간을 줄일 수 있습니다.

#keyExtractor#getItemLayout#PureComponent#shouldComponentUpdate#windowSize

이 질문 단독 페이지 →

Q13 중급

React Native에서 JavaScript 코드와 네이티브 모듈(Java/Kotlin for Android, Objective-C/Swift for iOS) 간의 통신 원리에 대해 설명하고, 네이티브 모듈을 언제 사용해야 하는지 예시를 들어주세요.

힌트 · 브릿지를 통해 직렬화된 메시지를 주고받으며 통신하고, JS에서 접근할 수 없는 하드웨어 기능이나 고성능 네이티브 라이브러리 사용 시 네이티브 모듈을 활용합니다.

React Native에서 JavaScript 코드와 네이티브 모듈 간의 통신은 브릿지(Bridge)를 통해 이루어집니다. JavaScriptCore 엔진에서 실행되는 JavaScript 코드는 브릿지를 통해 메시지…

전체 모범답안 펼치기

React Native에서 JavaScript 코드와 네이티브 모듈 간의 통신은 브릿지(Bridge)를 통해 이루어집니다. JavaScriptCore 엔진에서 실행되는 JavaScript 코드는 브릿지를 통해 메시지를 직렬화하여 네이티브 코드로 전달하고, 네이티브 코드 역시 결과를 직렬화하여 JavaScript로 전달합니다. 이 과정은 비동기적으로 처리됩니다.

네이티브 모듈은 JavaScript만으로는 접근하기 어려운 특정 하드웨어 기능(예: 블루투스, 카메라의 고급 기능)을 사용해야 할 때, 또는 고성능이 요구되는 네이티브 라이브러리(예: 이미지 처리, 복잡한 계산)를 활용해야 할 때 사용합니다. 예를 들어, JavaScript로는 구현하기 어려운 특정 플랫폼 API를 사용하거나, JavaScript로 처리하기에는 성능상 병목이 발생하는 복잡한 이미지 처리 로직을 구현할 때 네이티브 모듈을 활용할 수 있습니다.

#Bridge#Native Modules#JavaScriptCore#Thread#성능

이 질문 단독 페이지 →

Q14 중급

React Native 애플리케이션에서 발생할 수 있는 일반적인 렌더링 성능 저하 문제를 어떻게 진단하고 해결할 수 있나요? 디버깅 도구(예: Flipper, React DevTools) 활용 방안을 포함하여 설명해주세요.

힌트 · 불필요한 리렌더링, 과도한 계산, 큰 이미지 로딩 등이 원인이 될 수 있으며, 프로파일러를 통해 병목 지점을 파악하고 `memo`, `useCallback` 등으로 최적화합니다.

React Native 앱의 렌더링 성능 저하 문제는 여러 가지 원인이 있을 수 있습니다. 가장 흔한 경우는 불필요한 리렌더링, 과도한 계산, 그리고 큰 이미지 로딩입니다.

전체 모범답안 펼치기

React Native 앱의 렌더링 성능 저하 문제는 여러 가지 원인이 있을 수 있습니다. 가장 흔한 경우는 불필요한 리렌더링, 과도한 계산, 그리고 큰 이미지 로딩입니다.

진단 방법으로는 먼저 React DevTools나 Flipper의 Profiler를 활용하여 렌더링 성능 병목 지점을 파악합니다. Profiler를 통해 어떤 컴포넌트가 가장 많은 시간을 소요하는지, 그리고 왜 리렌더링되는지 확인할 수 있습니다.

해결 방법으로는 memo를 사용하여 불필요한 리렌더링을 방지하고, useCallback이나 useMemo를 사용하여 함수나 값을 메모이제이션하여 불필요한 계산을 줄일 수 있습니다. 또한, 큰 이미지는 최적화하거나 로딩 방식을 개선해야 합니다. shouldComponentUpdate를 활용하여 리렌더링 조건을 직접 제어하는 방법도 있습니다.

예를 들어, memo를 사용하면 props가 변경되지 않는 컴포넌트의 리렌더링을 막을 수 있습니다.

const MyComponent = React.memo(function MyComponent(props) {
  // render using props
});

이러한 도구와 기법들을 적절히 활용하면 React Native 앱의 렌더링 성능을 효과적으로 개선할 수 있습니다.

#React DevTools#Flipper#Profiler#shouldComponentUpdate#useMemo

이 질문 단독 페이지 →

React Native 면접 질문 · 심화

Q15 심화

React Native 애플리케이션에서 JavaScript Bridge의 병목 현상을 최소화하고 성능을 극대화하기 위한 전략은 무엇이며, 이를 위해 JSI(JavaScript Interface)와 TurboModules이 어떤 역할을 하는지 설명하고, 실제 프로젝트에 적용했던 경험을 바탕으로 구체적인 구현 방안을 제시해 주세요.

힌트 · JSI는 JS와 Native 간의 직접 통신을 가능하게 하며, TurboModules는 Bridge 없이 모듈을 정의하여 오버헤드를 줄입니다. 이를 통해 직렬화/역직렬화 비용을 제거하고 호출 속도를 향상시킬 수 있습니다.

React Native에서 JavaScript Bridge 병목 현상을 최소화하고 성능을 극대화하기 위한 핵심 전략은 Native 코드와의 통신 오버헤드를 줄이는 것입니다. 이를 위해 JSI(JavaScript In…

전체 모범답안 펼치기

React Native에서 JavaScript Bridge 병목 현상을 최소화하고 성능을 극대화하기 위한 핵심 전략은 Native 코드와의 통신 오버헤드를 줄이는 것입니다. 이를 위해 JSI(JavaScript Interface)와 TurboModules가 중요한 역할을 합니다.

JSI는 기존의 비동기 Bridge 대신 JavaScript와 Native 간의 동기적이고 직접적인 함수 호출을 가능하게 합니다. 이를 통해 데이터 직렬화/역직렬화 과정에서 발생하는 비용을 제거하고 통신 속도를 크게 향상시킬 수 있습니다.

TurboModules는 JSI를 기반으로 Native Modules를 재구현한 것으로, Lazy Loading을 지원하고 Bridge를 완전히 우회하여 모듈을 로드하고 호출합니다. 즉, 필요한 Native 모듈만 필요할 때 로드하여 초기 로딩 시간을 단축하고 메모리 사용량을 최적화합니다.

실제 프로젝트에서는 AsyncStorage와 같이 I/O 작업이 빈번한 Native Modules를 TurboModule로 마이그레이션하는 것을 고려할 수 있습니다. 예를 들어, JSI를 사용하여 Native에서 직접 데이터를 읽고 쓰는 비동기 함수를 구현하면, Bridge를 통한 반복적인 데이터 전송 없이 훨씬 빠르게 데이터를 처리할 수 있습니다. 이를 통해 UI 렌더링 성능 저하를 방지하고 사용자 경험을 개선할 수 있습니다.

#JSI (JavaScript Interface)#TurboModules#AsyncStorage#Native Modules#Serialization/Deserialization

이 질문 단독 페이지 →

Q16 심화

복잡한 데이터 구조(예: 대용량 이미지 데이터, 파일 스트림, 커스텀 객체 그래프)를 React Native의 JavaScript 환경과 네이티브 모듈(iOS/Android) 간에 효율적으로 전달하고 처리하기 위한 설계 전략을 설명해 주세요. 특히, 이러한 데이터 전송 시 발생할 수 있는 메모리 문제나 스레딩 이슈를 어떻게 관리할 것인지 구체적인 방안을 제시해 주세요.

힌트 · JSI를 활용한 직접적인 메모리 접근, 파일 경로/URI 전달, 백그라운드 스레드에서 네이티브 작업 수행, 큰 데이터는 스트림 또는 청크 단위로 처리하는 방안을 고려합니다.

React Native에서 복잡한 데이터를 네이티브 모듈과 효율적으로 주고받기 위해 몇 가지 전략을 고려할 수 있습니다.

전체 모범답안 펼치기

React Native에서 복잡한 데이터를 네이티브 모듈과 효율적으로 주고받기 위해 몇 가지 전략을 고려할 수 있습니다.

첫째, 작은 데이터는 JSON 직렬화를 통해 브릿지를 사용하지만, 큰 데이터는 ArrayBuffer를 Base64로 인코딩하여 전달하는 방식을 고려합니다.

둘째, 이미지나 파일 스트림은 파일 경로 또는 URI를 네이티브 모듈에 전달하여 네이티브 코드에서 직접 처리하도록 합니다.

셋째, JSI를 활용하여 JavaScript 환경에서 네이티브 메모리에 직접 접근하는 방안도 있습니다. 이를 통해 복사본 생성을 최소화할 수 있습니다.

메모리 문제와 스레딩 이슈를 해결하기 위해, 네이티브 작업은 백그라운드 스레드에서 수행하고, 큰 데이터는 스트림 또는 청크 단위로 처리하여 메모리 사용량을 줄입니다. 또한, 필요 없는 데이터는 즉시 메모리에서 해제하여 메모리 누수를 방지해야 합니다.

#ArrayBuffer#Base64#Native Modules#Bridge#Serialization

이 질문 단독 페이지 →

Q17 심화

React Native의 새로운 아키텍처(Fabric Renderer, TurboModules, JSI)로 마이그레이션할 때 예상되는 주요 이점과 도전 과제는 무엇이며, 기존 프로젝트를 새로운 아키텍처로 전환하기 위한 구체적인 단계와 고려해야 할 사항들을 설명해 주세요.

힌트 · 새로운 아키텍처는 렌더링 성능 향상과 Bridge 제거를 목표로 합니다. 코드젠 도구 사용, 네이티브 모듈 및 UI 컴포넌트 업데이트, 점진적 전환 전략 수립이 중요합니다.

React Native의 새로운 아키텍처로 마이그레이션하면 렌더링 성능 향상, 네이티브 모듈과의 직접적인 통신을 통한 브릿지 오버헤드 감소라는 이점을 얻을 수 있습니다. Fabric Renderer는 UI 렌더링을…

전체 모범답안 펼치기

React Native의 새로운 아키텍처로 마이그레이션하면 렌더링 성능 향상, 네이티브 모듈과의 직접적인 통신을 통한 브릿지 오버헤드 감소라는 이점을 얻을 수 있습니다. Fabric Renderer는 UI 렌더링을 개선하고, TurboModules는 필요한 네이티브 모듈만 로딩하여 앱 시작 속도를 높이며, JSI는 JavaScript와 네이티브 코드 간의 효율적인 통신을 가능하게 합니다.

하지만 마이그레이션에는 어려움도 따릅니다. 기존 네이티브 모듈과 UI 컴포넌트의 호환성 문제가 발생할 수 있으며, 새로운 아키텍처에 맞춰 코드를 수정해야 합니다. 또한, 코드젠 도구를 사용하여 C++ 코드를 생성하고 관리해야 하는 부담도 있습니다.

마이그레이션 전략으로는 점진적인 전환을 추천합니다. 먼저 작은 기능부터 새로운 아키텍처로 전환하고, 충분한 테스트를 거친 후 전체 프로젝트로 확장하는 것이 안전합니다. 레거시 코드와 새로운 코드 간의 호환성을 유지하기 위한 추상화 레이어를 도입하는 것도 고려해볼 만합니다. 마지막으로, React Native 커뮤니티의 자료와 가이드를 적극적으로 활용하여 문제 해결에 도움을 받는 것이 중요합니다.

#Fabric Renderer#TurboModules#JSI#성능 향상#호환성

이 질문 단독 페이지 →

Q18 심화

네트워크 연결이 불안정하거나 오프라인 상태에서도 원활하게 동작하는 React Native 애플리케이션을 설계해야 한다면, 어떤 아키텍처 패턴과 데이터 동기화 전략을 채택하시겠습니까? 데이터 충돌 해결(Conflict Resolution) 및 상태 일관성(State Consistency)을 어떻게 보장할 수 있을지 구체적인 기술 스택과 함께 설명해 주세요.

힌트 · Realm, WatermelonDB, PouchDB/CouchDB와 같은 로컬 데이터베이스를 활용하고, Last-Write-Wins, Merge-on-Sync 등의 충돌 해결 전략을 사용합니다. 백그라운드 동기화 및 큐잉 메커니즘을 고려합니다.

네트워크 연결이 불안정하거나 오프라인 상태에서도 원활하게 동작하는 React Native 애플리케이션을 설계하기 위해 'OfflineFirst' 아키텍처 패턴을 채택하겠습니다.

전체 모범답안 펼치기

네트워크 연결이 불안정하거나 오프라인 상태에서도 원활하게 동작하는 React Native 애플리케이션을 설계하기 위해 'Offline-First' 아키텍처 패턴을 채택하겠습니다.

핵심은 로컬 데이터베이스를 중심으로 애플리케이션을 구축하고, 네트워크가 연결되었을 때 서버와 데이터를 동기화하는 것입니다. 이를 위해 Realm이나 WatermelonDB와 같은 강력한 로컬 데이터베이스를 활용할 것입니다. 이들은 비동기 작업과 복잡한 쿼리를 효율적으로 처리하며, 오프라인 환경에서도 뛰어난 성능을 제공합니다.

데이터 동기화 전략으로는 백그라운드 동기화와 큐잉 메커니즘을 구현하여, 사용자가 데이터를 변경하면 즉시 로컬에 저장하고 네트워크 연결 시점에 백그라운드에서 서버와 동기화하도록 합니다.

데이터 충돌 해결은 Last-Write-Wins 또는 Merge-on-Sync 전략을 사용할 수 있습니다. 예를 들어, 두 사용자가 같은 데이터를 동시에 수정했을 경우, 마지막으로 작성된 데이터를 우선하거나, 두 변경 사항을 병합하는 로직을 구현할 수 있습니다. 이를 위해 서버와 클라이언트 간의 버전 관리 또는 타임스탬프를 활용할 것입니다.

상태 일관성은 Redux Persist와 같은 라이브러리를 사용하여 Redux 스토어의 상태를 로컬에 저장하고, 앱 재시작 시 복원함으로써 보장합니다. 또한, Optimistic Updates 패턴을 적용하여 사용자 인터페이스가 즉각적으로 반응하도록 하고, 동기화 실패 시 롤백 처리를 통해 일관성을 유지합니다.

전반적으로, 로컬 데이터베이스를 최우선으로 하고, 백그라운드 동기화와 명확한 충돌 해결 전략을 통해 안정적인 오프라인 경험을 제공하는 데 집중할 것입니다.

#Redux Persist#AsyncStorage#Conflict Resolution#Optimistic Updates#Offline-First

이 질문 단독 페이지 →

Q19 심화

React Native에서 제공하는 컴포넌트만으로는 구현하기 어려운 복잡하고 고성능의 커스텀 UI 컴포넌트(예: 고성능 차트, 복잡한 애니메이션을 포함한 맵 뷰)를 네이티브 수준에서 개발해야 할 때, View Manager를 사용하여 어떻게 설계하고 구현할 것인지 설명해 주세요. 특히, JavaScript와 네이티브 UI 간의 속성 동기화 및 이벤트 처리를 효율적으로 관리하는 방안을 제시해 주세요.

힌트 · UIManager를 통해 네이티브 뷰를 JS에 노출하고, RCTViewManager를 상속받아 뷰를 생성합니다. @objc 또는 exportViewProperty를 사용하여 속성을 동기화하고, RCTBubblingEventBlock으로 이벤트를 전달합니다.

React Native에서 고성능 커스텀 UI 컴포넌트 개발 시 View Manager를 활용하는 방안을 설명드리겠습니다.

전체 모범답안 펼치기

React Native에서 고성능 커스텀 UI 컴포넌트 개발 시 View Manager를 활용하는 방안을 설명드리겠습니다.

먼저, 네이티브 UI 컴포넌트를 JavaScript에 노출하기 위해 RCTViewManager를 상속받는 네이티브 클래스를 작성합니다. 이 클래스는 UIManager를 통해 JavaScript와 통신하며, 네이티브 뷰의 생성 및 관리를 담당합니다.

속성 동기화는 @objc 또는 exportViewProperty 어노테이션을 사용하여 JavaScript에서 설정한 속성을 네이티브로 전달합니다. 예를 들어, 차트의 데이터나 애니메이션 속성 등을 네이티브 뷰에 설정할 수 있습니다.

이벤트 처리는 네이티브 뷰에서 발생한 이벤트를 JavaScript로 전달하기 위해 RCTBubblingEventBlock을 사용합니다. 예를 들어, 차트의 특정 부분을 탭하거나 맵 뷰에서 사용자의 인터랙션이 발생했을 때, 해당 이벤트를 JavaScript로 보내어 처리하도록 구현합니다.

이러한 방식으로 View Manager를 사용하면 JavaScript와 네이티브 간의 효율적인 통신을 통해 복잡하고 고성능의 커스텀 UI 컴포넌트를 개발할 수 있습니다.

#ViewManager#UIResponder#속성 동기화#Native Modules#Bridge

이 질문 단독 페이지 →

Q20 심화

네이티브 모듈을 포함하는 복잡한 React Native 프로젝트를 위한 CI/CD 파이프라인을 설계해야 한다면, 어떤 도구와 전략을 활용하시겠습니까? 특히, iOS와 Android 빌드 환경 설정, 테스트(단위, 통합, E2E), 코드 서명 및 배포 과정을 자동화하는 구체적인 방안을 설명해 주세요.

힌트 · GitHub Actions, GitLab CI, Azure DevOps와 같은 CI 툴과 Fastlane을 결합하여 빌드, 테스트, 서명, 배포를 자동화합니다. Xcode, Android SDK 환경 설정 및 종속성 관리가 중요합니다.

네, 복잡한 React Native 프로젝트, 특히 네이티브 모듈을 포함하는 경우 CI/CD 파이프라인 구축은 매우 중요합니다. 저는 다음과 같은 도구와 전략을 활용하겠습니다.

전체 모범답안 펼치기

네, 복잡한 React Native 프로젝트, 특히 네이티브 모듈을 포함하는 경우 CI/CD 파이프라인 구축은 매우 중요합니다. 저는 다음과 같은 도구와 전략을 활용하겠습니다.

우선 CI 툴로는 GitHub Actions를 선호합니다. 이유는 접근성이 좋고, 커뮤니티 지원이 활발하며, React Native 프로젝트에 필요한 다양한 액션들이 이미 존재하기 때문입니다.

빌드, 테스트, 배포 자동화에는 Fastlane을 적극적으로 활용합니다. Fastlane은 iOS와 Android 빌드, 코드 서명, TestFlight/Google Play Console 배포를 자동화하는 데 매우 강력합니다.

구체적으로, GitHub Actions 워크플로우에서 Fastlane lane을 호출하여 빌드 환경 설정(Xcode, Android SDK), 종속성 관리(CocoaPods, Gradle), 단위/통합 테스트 실행, E2E 테스트 실행(예: Detox), 코드 서명, 그리고 앱 배포를 자동화합니다.

iOS 빌드를 위해서는 macOS 환경의 GitHub Actions runner를 사용하고, Android 빌드를 위해서는 Linux 환경의 runner를 사용합니다. 캐싱을 활용하여 빌드 시간을 단축하고, 환경 변수를 통해 민감한 정보(API 키, 코드 서명 정보)를 안전하게 관리합니다.

테스트 자동화는 코드 품질을 유지하는 데 필수적입니다. 단위 테스트와 통합 테스트는 Jest와 React Native Testing Library를 사용하여 작성하고, E2E 테스트는 Detox를 사용하여 실제 디바이스 또는 에뮬레이터에서 실행합니다.

마지막으로, 배포 후에는 모니터링 도구를 연동하여 앱의 성능과 안정성을 지속적으로 관리합니다.

#Fastlane#Bitrise#GitHub Actions#TestFlight#Google Play Console

이 질문 단독 페이지 →

Q21 심화

React Native 애플리케이션에서 Deep Linking과 Universal Links(iOS) / App Links(Android)를 구현할 때, 단순한 페이지 이동을 넘어선 고급 시나리오(예: 사용자 인증이 필요한 페이지로의 딥 링크, 동적 콘텐츠 기반의 딥 링크, 외부 앱과의 연동)를 어떻게 처리할 것인지 설계 방안을 제시해 주세요. 특히 보안 및 사용자 경험 측면을 고려하여 설명해 주세요.

힌트 · Linking API를 활용하고, 네이티브 설정(Info.plist, AndroidManifest.xml)을 구성합니다. 인증이 필요한 경우 토큰 유효성 검사 및 리디렉션을 구현하고, 동적 콘텐츠는 쿼리 파라미터를 통해 처리합니다.

React Native에서 딥 링크와 Universal/App Links를 활용한 고급 시나리오 처리에 대해 말씀드리겠습니다.

전체 모범답안 펼치기

React Native에서 딥 링크와 Universal/App Links를 활용한 고급 시나리오 처리에 대해 말씀드리겠습니다.

단순 페이지 이동을 넘어 사용자 인증이 필요한 페이지로 딥 링크될 경우, 먼저 Linking API를 통해 URI 스킴이나 Universal/App Links를 감지합니다. 이때, 앱이 실행 중이거나 백그라운드에 있다면 바로 해당 페이지로 이동하되, 인증 토큰이 없거나 만료되었다면 로그인 페이지로 리디렉션합니다. 로그인 성공 후에는 원래 목적지로 다시 이동하도록 구현하여 사용자 경험을 해치지 않도록 합니다.

동적 콘텐츠 기반 딥 링크는 쿼리 파라미터를 적극 활용합니다. 예를 들어, myapp://product?id=123&category=electronics 와 같이 상품 ID와 카테고리 정보를 전달받아 해당 콘텐츠를 동적으로 로드하고 표시합니다.

외부 앱과의 연동은 딥 링크를 통해 데이터를 주고받는 방식으로 구현할 수 있습니다. 예를 들어, 다른 앱에서 특정 데이터를 딥 링크로 전달하면, 우리 앱은 해당 데이터를 받아 처리하고 결과를 다시 외부 앱으로 전달하는 방식입니다.

보안 측면에서는, 민감한 정보는 쿼리 파라미터에 직접 포함시키지 않고, 필요하다면 JWT와 같은 토큰을 사용하여 서버와 통신하며 인증 및 데이터 검증을 강화합니다. 또한, Universal/App Links 설정 시 도메인 검증을 철저히 하여 악의적인 링크로부터 앱을 보호하는 것이 중요합니다. Deferred Deep Linking 기법을 활용하여 앱이 설치되지 않은 사용자에게도 앱 설치 후 원래 의도했던 콘텐츠로 바로 연결되도록 유도하는 것도 사용자 경험 향상에 큰 도움이 됩니다.

#URI 스킴#Universal Links#App Links#JWT#Deferred Deep Linking

이 질문 단독 페이지 →

함께 보면 좋은 모바일 개발 면접 질문

모바일 개발 면접 질문 전체 보기 → 전체 카테고리

보유한 React Native 질문은 이게 전부가 아닙니다

패스잇 앱에는 직무별 면접 질문 수천 개와 모범답안이 담겨 있습니다. AI 모의면접으로 직접 답하고, 약점을 분석받아 보세요.