본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

React Native 문서
React Native
React Native 시작하기프로젝트 구조핵심 개념데이터와 상태테스트배포
토론

React Native 안내서 · 3/6

핵심 개념

React Native는 React 컴포넌트로 화면을 설명하면 그것을 각 플랫폼의 진짜 네이티브 뷰로 그립니다. 웹 페이지를 앱 안에 띄우는 방식이 아닙니다. 이 장에서는 코어 컴포넌트, 스타일과 Flexbox, 플랫폼 차이, 내비게이션, 네이티브 모듈과 New Architecture를 차례로 살펴봅니다.

코어 컴포넌트

HTML의 div나 p 대신 React Native가 제공하는 컴포넌트를 씁니다.

컴포넌트하는 일Android / iOS 대응
View레이아웃 상자ViewGroup / UIView
Text글자 표시TextView / UITextView
Image이미지 표시ImageView / UIImageView
TextInput글자 입력EditText / UITextField
ScrollView스크롤 영역ScrollView / UIScrollView
FlatList긴 목록(보이는 것만 그림)가상화 목록
Pressable누름 처리터치 이벤트

모든 글자는 반드시 Text 안에 있어야 합니다. View 안에 글자를 바로 넣으면 오류가 납니다.

import { Image, Pressable, Text, View } from "react-native";

export function Profile({ onFollow }: { onFollow: () => void }) {
  return (
    <View style={{ padding: 16, gap: 8 }}>
      <Image source={{ uri: "https://reactnative.dev/img/tiny_logo.png" }} style={{ width: 64, height: 64 }} />
      <Text style={{ fontSize: 18, fontWeight: "600" }}>React Native</Text>
      <Pressable onPress={onFollow}>
        <Text>팔로우</Text>
      </Pressable>
    </View>
  );
}

네트워크 이미지는 크기를 알 수 없으므로 width·height를 직접 지정해야 합니다. 로컬 이미지는 require("./assets/icon.png")로 불러옵니다.

긴 목록은 FlatList

ScrollView는 자식을 한꺼번에 모두 그리므로 항목이 많으면 느려집니다. 길이가 정해지지 않은 목록에는 화면에 보이는 항목만 그리는 FlatList를 씁니다.

import { FlatList, Text } from "react-native";

type Todo = { id: string; title: string };

export function TodoList({ items }: { items: Todo[] }) {
  return (
    <FlatList
      data={items}
      keyExtractor={(item) => item.id}
      renderItem={({ item }) => <Text style={{ padding: 12 }}>{item.title}</Text>}
      ListEmptyComponent={<Text>할 일이 없습니다.</Text>}
    />
  );
}

StyleSheet와 Flexbox

스타일은 CSS와 비슷한 이름을 camelCase로 쓴 JavaScript 객체입니다. 단위 없는 숫자는 기기 독립 픽셀(dp)이고, 스타일은 부모에서 자식으로 상속되지 않습니다(중첩된 Text 사이에서만 일부 상속됩니다). 레이아웃은 Flexbox로 하며 웹과 달리 기본 방향 flexDirection이 column입니다.

import { StyleSheet, Text, View } from "react-native";

export function Row() {
  return (
    <View style={styles.row}>
      <Text style={styles.label}>이름</Text>
      <Text style={[styles.label, styles.value]}>홍길동</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  row: { flexDirection: "row", justifyContent: "space-between", padding: 16 },
  label: { fontSize: 16 },
  value: { fontWeight: "bold" },
});

style에 배열을 넘기면 뒤의 스타일이 앞의 것을 덮어씁니다. 조건부 스타일을 만들 때 유용합니다.

플랫폼 차이

같은 코드가 Android와 iOS에서 돌지만 플랫폼마다 다르게 처리해야 할 때가 있습니다. Platform API나 플랫폼별 파일 확장자를 씁니다.

import { Platform, StyleSheet } from "react-native";

const styles = StyleSheet.create({
  card: {
    padding: 16,
    ...Platform.select({
      ios: { shadowColor: "#000", shadowOpacity: 0.1, shadowRadius: 8 },
      android: { elevation: 3 },
    }),
  },
});

export const isIOS = Platform.OS === "ios";

Button.ios.tsx와 Button.android.tsx를 만들고 ./Button으로 불러오면 번들러가 플랫폼에 맞는 파일을 고릅니다. 노치나 상태 표시줄을 피하려면 react-native-safe-area-context의 SafeAreaView를, 화면 크기에는 useWindowDimensions 훅을 씁니다.

내비게이션

React Native 자체에는 화면 이동 기능이 없습니다. Expo 프로젝트는 Expo Router를, CLI 프로젝트는 주로 React Navigation을 씁니다. Expo Router는 React Navigation 위에 만들어졌습니다.

import { Link, router, useLocalSearchParams } from "expo-router";
import { Button, Text, View } from "react-native";

// app/posts/[id].tsx
export default function Post() {
  const { id } = useLocalSearchParams<{ id: string }>();
  return (
    <View>
      <Text>글 번호 {id}</Text>
      <Link href="/">홈으로</Link>
      <Button title="다음 글" onPress={() => router.push(`/posts/${Number(id) + 1}`)} />
    </View>
  );
}

네이티브 모듈과 New Architecture

JavaScript만으로 할 수 없는 기기 기능은 Kotlin·Java·Swift·Objective-C로 작성한 네이티브 모듈로 씁니다. 대부분은 이미 라이브러리로 나와 있으니 React Native Directory에서 먼저 찾아봅니다.

현재 React Native는 New Architecture를 기본으로 씁니다. 예전에는 JavaScript와 네이티브가 비동기 직렬화 메시지(브리지)로 통신했지만, New Architecture는 JSI로 JavaScript가 네이티브 객체를 직접 참조하고 필요하면 동기 호출도 할 수 있습니다. 네이티브 모듈은 필요할 때 불러오는 Turbo Native Module, 화면 렌더러는 Fabric이며, Codegen이 TypeScript 명세로부터 타입이 맞는 연결 코드를 생성합니다. 기본 JavaScript 엔진은 Hermes입니다.

import type { TurboModule } from "react-native";
import { TurboModuleRegistry } from "react-native";

export interface Spec extends TurboModule {
  setItem(value: string, key: string): void;
  getItem(key: string): string | null;
}

export default TurboModuleRegistry.getEnforcing<Spec>("NativeLocalStorage");

Expo 프로젝트에서는 Swift·Kotlin으로 더 간단히 모듈을 쓸 수 있는 Expo Modules API도 쓸 수 있습니다(npx create-expo-module@latest --local).

정리

  • 화면은 View, Text, Image, FlatList 같은 코어 컴포넌트로 만들고, 실제 네이티브 뷰로 그려집니다.
  • 스타일은 StyleSheet와 Flexbox(기본 방향 column)로 지정합니다.
  • 플랫폼 차이는 Platform과 .ios·.android 파일로 처리합니다.
  • 화면 이동은 Expo Router나 React Navigation이 맡습니다.
  • New Architecture(JSI, Turbo Native Module, Fabric, Codegen)가 네이티브와의 연결을 담당합니다.
이 장에 대해 질문이 있나요?
이전 장프로젝트 구조다음 장데이터와 상태

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.