Pressable이란 무엇인가, React Native에서의 프레스 처리

저자: IT Sectr 게시일: 2026-07-06 읽는 시간: 10 분

Pressable은 레거시 TouchableHighlight, TouchableOpacity 및 TouchableWithoutFeedback을 대체하는 React Native의 현대적인 터치 처리 컴포넌트입니다. Pressable은 pressed, hovered, focused 상태 감지 기능을 갖춘 통합 API를 제공합니다. 이 컴포넌트는 React Native 0.63에서 도입되었으며 Meta는 모든 새 프로젝트에 Pressable을 권장합니다. Meta 문서에서 자세히 알아보세요.

핵심 요점

  • Pressable — pressed, hovered, focused 상태를 지원하는 범용 터치 처리 컴포넌트
  • API는 onPress, onLongPress, onPressIn, onPressOut 콜백과 상태 기반 스타일링 함수를 포함
  • hitSlop은 UX 개선을 위해 컴포넌트의 가시적 경계를 넘어 터치 영역을 확장
  • Touchable 대체 — Pressable은 모든 Touchable 컴포넌트의 API를 하나의 유연한 인터페이스로 통합
  • 접근성 — ARIA 역할을 지원하고 VoiceOver 및 TalkBack을 자동으로 처리

Pressable이란?

Pressable은 모든 유형의 터치를 처리하기 위한 통합 인터페이스를 제공하는 React Native 컴포넌트입니다. 세 가지 다른 Touchable 컴포넌트(TouchableHighlight, TouchableOpacity, TouchableWithoutFeedback)와 달리 Pressable은 유연한 상태 및 스타일링 시스템으로 이를 모두 대체합니다.

이 컴포넌트는 React Native 0.63(2020년 9월)에 도입되었습니다. Meta(2026)에 따르면 React Native의 새 프로젝트 중 70%가 Touchable 컴포넌트 대신 Pressable을 사용합니다. Pressable은 Touchable의 주요 문제점인 단편화된 API와 다양한 효과를 위해 컴포넌트를 전환해야 하는 필요성을 해결합니다.

Pressable 철학

프레스 효과가 고정된(불투명도 변경) TouchableOpacity와 달리 Pressable은 현재 상태를 받는 함수를 제공합니다. 개발자는 프레스에 시각적으로 어떻게 반응할지(색상, 크기, 그림자 또는 효과 조합 변경) 결정할 수 있습니다. 이를 통해 UX를 완전히 제어할 수 있습니다.

Pressable 상태: pressed, hovered, focused

Pressable은 세 가지 상호작용 상태를 정의합니다: pressed(화면에 손가락), hovered(Web/TV에서 요소 위에 커서), focused(키보드 포커스의 요소). 각 상태는 해당 콜백을 트리거하고 스타일 함수와 자식 렌더 함수에 전달됩니다.

상태조건일반적인 반응
pressed화면에 손가락 또는 클릭 유지불투명도, 크기 또는 배경색 변경
hovered요소 위에 커서(Web, TV)강조, 그림자, 밑줄
focused키보드 포커스의 요소윤곽선, 테두리, 색상 변경

중요: hovered와 focused는 포인터 지원 플랫폼(Web, Android TV, Apple TV)에서만 작동합니다. 모바일 기기에서는 pressed만 사용 가능합니다. 크로스 플랫폼 애플리케이션의 경우 이 제한을 고려하여 시각적 반응을 설계하세요.

js
<Pressable
  style={({ pressed }) => [
    styles.button,
    pressed && styles.buttonPressed,
  ]}
  onPress={handlePress}>
  {({ pressed }) => (
    <Text style={pressed ? styles.textPressed : styles.text}>
      {pressed ? 'Release' : 'Press'}
    </Text>
  )}
</Pressable>

Pressable API 및 콜백

Pressable API는 네 가지 주요 콜백을 포함합니다: onPress(놓기를 포함한 전체 프레스), onLongPress(길게 누르기), onPressIn(터치 시작), onPressOut(터치 종료). onPressIn과 onPressOut의 조합으로 사용자 정의 애니메이션을 만들 수 있습니다.

추가 Props: delayLongPress(길게 누르기 지연, 기본값 500ms), pressRetentionOffset(프레스가 취소되는 영역), android_ripple(Android의 리플 효과). 참고: Ripple은 Android 5+에서만 작동합니다.

js
<Pressable
  onPress={() => console.log('눌림')}
  onLongPress={() => console.log('길게 누르기')}
  onPressIn={() => console.log('손가락 내리기')}
  onPressOut={() => console.log('손가락 올리기')}
  delayLongPress={300}
  android_ripple={{ color: 'rgba(0,0,0,0.1)', borderless: false }}
  style={styles.button}>
  <Text>Press me</Text>
</Pressable>

onPress는 pressRetentionOffset을 고려하여 컴포넌트 영역 내에서 손가락이 떼어질 때만 호출됩니다. 사용자가 손가락을 경계 밖으로 이동하면 onPress가 트리거되지 않아 잘못된 프레스를 방지합니다. onPressOut은 놓을 때 항상 호출됩니다.

hitSlop: 터치 영역 확장

hitSlop은 컴포넌트의 가시적 경계를 넘어 터치 영역을 확장하는 Pressable prop입니다. 이는 아이콘, 체크박스, 라디오 버튼과 같은 작은 요소에 중요합니다. Apple HIG는 최소 터치 대상 크기로 44×44 포인트를 권장합니다. hitSlop을 사용하면 시각적 크기를 변경하지 않고 이 요구 사항을 충족할 수 있습니다.

hitSlop은 객체 { top, bottom, left, right } 또는 모든 면에 단일 숫자를 허용합니다. 값은 논리 픽셀(dp/pt)로 지정됩니다. 24×24 아이콘의 경우 44×44 터치 대상을 달성하려면 각 면에 최소 10–12의 hitSlop이 권장됩니다.

js
<Pressable
  hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}
  onPress={handleIconPress}
  style={styles.iconButton}>
  <Icon name="star" size={24} />
</Pressable>

pressRetentionOffset — hitSlop의 반대: 사용자가 프레스를 취소하지 않고 컴포넌트 경계를 벗어날 수 있는 영역을 정의합니다. 기본값은 hitSlop과 같습니다. 경계를 벗어날 때 프레스를 유지해야 하는 경우 pressRetentionOffset을 늘리세요.

Pressable vs Touchable: 전환 시점

Pressable vs Touchable — 터치 처리를 위한 컴포넌트 선택 시 핵심 질문입니다. TouchableOpacity, TouchableHighlight, TouchableWithoutFeedback은 레거시 컴포넌트로 제거되지는 않지만 새 기능을 받지 않습니다. Meta는 새 프로젝트에 Pressable을 권장합니다.

Pressable의 주요 장점: 모든 효과 유형에 대한 통합 API, 사용자 정의 스타일링을 위한 pressed 상태 액세스, hovered/focused 상태 지원, hitSlop 및 pressRetentionOffset, 추가 구성 없이 onLongPress 콜백. TouchableOpacity는 단순한 불투명도 변경에만 적합합니다.

시나리오TouchablePressable
단순 프레스TouchableOpacityPressable + style의 opacity
배경 강조TouchableHighlightPressable + backgroundColor
시각 효과 없음TouchableWithoutFeedback빈 style의 Pressable
길게 누르기모든 Touchable의 onLongPressPressable의 onLongPress
사용자 정의 애니메이션Animated + onPressIn/OutPressable + useAnimatedStyle
Android의 RippleTouchableNativeFeedbackPressable + android_ripple

Pressable 사용 예제

Pressable을 사용하면 최소한의 코드로 복잡한 대화형 요소를 만들 수 있습니다. 다음은 Android에서 프레스 시 크기 변경과 리플 효과가 있는 애니메이션 버튼의 예입니다. 이러한 버튼은 TouchableOpacity + Animated 조합을 대체합니다.

js
const AnimatedButton = ({ title, onPress }) => {
  const scale = React.useRef(new Animated.Value(1)).current;

  const handlePressIn = () => {
    Animated.spring(scale, {
      toValue: 0.96,
      useNativeDriver: true,
    }).start();
  };

  const handlePressOut = () => {
    Animated.spring(scale, {
      toValue: 1,
      friction: 3,
      useNativeDriver: true,
    }).start();
  };

  return (
    <Pressable
      onPress={onPress}
      onPressIn={handlePressIn}
      onPressOut={handlePressOut}
      android_ripple={{ color: 'rgba(255,255,255,0.3)' }}
      style={styles.button}>
      <AnimatedView style={[styles.inner, { transform: [{ scale }] }]}>
        <Text style={styles.text}>{title}</Text>
      </AnimatedView>
    </Pressable>
  );
};

중요: Pressable에서 애니메이션에 useNativeDriver: true를 사용하세요. 이렇게 하면 애니메이션이 네이티브 스레드로 오프로드되어 빠른 프레스 중 프레임 드롭을 방지합니다. transform과 opacity의 네이티브 드라이버는 모든 플랫폼에서 지원됩니다.

자주 묻는 질문

코드 변경 없이 TouchableOpacity 대신 Pressable을 사용할 수 있나요?

아니요, Pressable은 다른 API를 가지고 있습니다. TouchableOpacity는 프레스 시 자동으로 불투명도를 적용합니다. Pressable은 상태 함수를 통해 명시적인 스타일 지정이 필요합니다. 대체는 간단합니다: style={({ pressed }) => [{ opacity: pressed ? 0.5 : 1 }]}를 전달하세요.

Material Design과 같은 리플 효과를 만들려면 어떻게 하나요?

android_ripple prop을 객체 { color, borderless }와 함께 사용하세요. 리플 색상은 rgba 형식으로 지정됩니다. 둥근 버튼의 경우 borderless: true를 사용하세요. Ripple은 Android 5+에서만 작동합니다. iOS에서는 사용자 정의 애니메이션을 사용하세요.

빠른 스크롤 중에 onPress가 실행되지 않는 이유는 무엇인가요?

Pressable에는 스크롤 중 우발적인 프레스에 대한 내장 보호 기능이 있습니다. 사용자가 목록을 스크롤하면 onPress가 호출되지 않습니다. 이 동작은 pressRetentionOffset과 delayPressIn을 통해 구성할 수 있습니다.

Pressable로 길게 누르기를 추적하려면 어떻게 하나요?

onLongPress prop을 사용하세요 — 길게 누르기 내장 지원. 지연 시간은 delayLongPress(기본값 500ms)를 통해 구성할 수 있습니다. 컨텍스트 메뉴 및 드래그 앤 드롭의 경우 onLongPress를 onPressIn과 결합하세요.

Pressable은 키보드 탐색을 지원하나요?

네, Pressable은 Android TV, Apple TV 및 Web에서 키보드 탐색을 위한 focused 상태를 지원합니다. { focused }를 통한 스타일링을 사용하여 포커스를 표시하세요. 모바일 기기에서는 focused 상태가 적용되지 않습니다.

요약

  • Pressable — 터치 처리를 위한 범용 React Native 컴포넌트, TouchableOpacity, TouchableHighlight, TouchableWithoutFeedback 대체
  • 상태 pressed, hovered, focused가 스타일 함수에 전달되어 각 시나리오에 맞게 반응을 사용자 정의 가능
  • hitSlop은 시각적 크기 변경 없이 터치 대상을 44×44 포인트로 확장하여 작은 요소의 UX 개선
  • API는 onPress, onLongPress, onPressIn, onPressOut을 포함하며 delayLongPress로 지연 설정 가능
  • android_ripple은 Android 5+에서 사용자 정의 가능한 색상과 모양의 Material Design 리플 효과 추가
  • Touchable에서 마이그레이션은 상태 함수를 통한 명시적 스타일링으로 자동 효과를 대체해야 함
  • Animated + Pressable은 성능을 위해 useNativeDriver로 부드러운 프레스 애니메이션 생성

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기