접근성(a11y) — 모든 사용자를 위한 앱 만들기
접근성은 시각, 청각, 운동 장애가 있는 사용자도 앱을 사용할 수 있게 하는 것입니다. 법적 의무이자 좋은 UX의 기본입니다.
접근성 속성
// 기본 접근성 속성
<Pressable
accessible={true}
accessibilityLabel="프로필 편집" // 스크린 리더가 읽는 텍스트
accessibilityHint="프로필 정보를 수정합니다" // 추가 설명
accessibilityRole="button" // 요소의 역할
accessibilityState={{ disabled: false }} // 상태
onPress={handleEdit}
>
<Image source={editIcon} style={styles.icon} />
</Pressable>
// 이미지에 대체 텍스트
<Image
source={{ uri: profileImage }}
accessibilityLabel="홍길동님의 프로필 사진"
accessible={true}
/>
// 장식용 이미지 (스크린 리더 무시)
<Image
source={decorativeImage}
accessible={false}
accessibilityElementsHidden={true}
/>
accessibilityRole
| Role | 설명 |
|---|---|
button | 탭 가능한 요소 |
link | 링크 |
header | 섹션 제목 |
image | 이미지 |
text | 텍스트 |
search | 검색 필드 |
switch | 토글 스위치 |
checkbox | 체크박스 |
alert | 알림 메시지 |
adjustable | 슬라이더 등 조절 가능 요소 |
동적 접근성 알림
import { AccessibilityInfo, Platform } from 'react-native';
// 스크린 리더에게 변경사항 알림
function announceChange(message: string) {
if (Platform.OS === 'ios') {
AccessibilityInfo.announceForAccessibility(message);
}
// Android는 accessibilityLiveRegion 사용
}
// 사용 예: 장바구니에 상품 추가 시
function addToCart(item: Product) {
cart.add(item);
announceChange(`${item.name}이(가) 장바구니에 추가되었습니다`);
}
// 실시간 업데이트 영역 (Android)
<View accessibilityLiveRegion="polite">
<Text>장바구니: {count}개</Text>
</View>
스크린 리더 감지
function AccessibleComponent() {
const [screenReaderEnabled, setScreenReaderEnabled] = useState(false);
useEffect(() => {
AccessibilityInfo.isScreenReaderEnabled().then(setScreenReaderEnabled);
const subscription = AccessibilityInfo.addEventListener(
'screenReaderChanged',
setScreenReaderEnabled
);
return () => subscription.remove();
}, []);
return screenReaderEnabled ? (
// 스크린 리더용 간소화된 UI
<SimpleLayout />
) : (
// 일반 UI
<RichLayout />
);
}
접근성 체크리스트
- 모든 터치 요소에
accessibilityLabel설정 - ** 아이콘 버튼에 텍스트 대체 제공**
- ** 최소 터치 타겟 44x44pt 확보** (hitSlop 활용)
- ** 색상 대비 비율 4.5:1 이상** (텍스트)
- ** 색상만으로 정보를 전달하지 않기** (에러 시 아이콘+텍스트 병행)
- ** 폼 에러 메시지를 스크린 리더에 알리기**
- ** 애니메이션 축소 설정 존중** (
reduceMotion)
import { useReducedMotion } from 'react-native-reanimated';
function AnimatedComponent() {
const reducedMotion = useReducedMotion();
// 사용자가 동작 줄이기를 설정했으면 애니메이션 비활성화
const animationDuration = reducedMotion ? 0 : 300;
}
정리
accessibilityLabel은 스크린 리더 사용자를 위한 가장 기본적인 속성입니다accessibilityRole로 요소의 역할을 명시하면 스크린 리더가 적절히 안내합니다- ** 터치 타겟 44x44pt 이상 **을 확보하세요
- ** 색상 대비 **와 ** 동작 줄이기 설정 **을 존중하세요
- 접근성은 ** 모든 사용자의 UX를 향상 **시키며, 많은 국가에서 ** 법적 의무 **입니다
댓글 로딩 중...