티스토리 뷰
framework/ReactNative
갓난애기도 배울 수 있는 React Native 가이드 ⏺️ 보너스편13 – 알림 설정 화면 모듈화 및 관리 기능 추가하기
octo54 2025. 5. 20. 11:05반응형
갓난애기도 배울 수 있는 React Native 가이드 ⏺️ 보너스편13 – 알림 설정 화면 모듈화 및 관리 기능 추가하기
지금까지 우리는 Firebase 기반 클라우드 예약 알림을 만들었습니다.
하지만 앱을 사용하다 보면 알림을 수정하거나 삭제하고 싶을 때가 많죠?
이번 글에서는 알림 설정 화면을 모듈화하고 관리 기능(수정/삭제)을 추가하여
사용자 경험을 개선하는 방법을 알아봅니다. 🛠️🔔
✅ 1. 기능 요구사항 정리
기능 설명
알림 추가 | 제목과 내용을 입력하여 알림 추가 |
알림 수정 | 기존 알림의 제목과 내용을 수정 |
알림 삭제 | 불필요한 알림 삭제 |
목록 관리 | 설정된 알림 목록을 리스트로 확인 |
✅ 2. Firebase Firestore 데이터 구조
컬렉션 문서 ID 필드
alarms | {alarmId} | title, message, token, createdAt |
✅ 3. Firebase 함수 수정 (NotificationService.js)
📄 Firebase 연동 및 알림 관리 함수
import firestore from '@react-native-firebase/firestore';
import messaging from '@react-native-firebase/messaging';
const alarmsCollection = firestore().collection('alarms');
// 알림 추가
export const addCloudAlarm = async (title, message) => {
const token = await messaging().getToken();
return alarmsCollection.add({
title,
message,
token,
createdAt: firestore.FieldValue.serverTimestamp(),
});
};
// 알림 목록 가져오기
export const fetchAlarms = async () => {
const snapshot = await alarmsCollection.get();
return snapshot.docs.map(doc => ({
id: doc.id,
...doc.data(),
}));
};
// 알림 수정
export const updateAlarm = async (id, title, message) => {
return alarmsCollection.doc(id).update({ title, message });
};
// 알림 삭제
export const deleteAlarm = async (id) => {
return alarmsCollection.doc(id).delete();
};
✅ 4. 프로젝트 구조
반응형
/services
└── NotificationService.js
/screens
├── AlarmListScreen.js
├── EditAlarmScreen.js
App.js
✅ 5. 알림 목록 화면 구현 (AlarmListScreen.js)
📄 알림 목록 화면
import React, { useEffect, useState } from 'react';
import { View, Text, Button, FlatList, TouchableOpacity, StyleSheet } from 'react-native';
import { fetchAlarms, deleteAlarm } from '../services/NotificationService';
export default function AlarmListScreen({ navigation }) {
const [alarms, setAlarms] = useState([]);
useEffect(() => {
const loadAlarms = async () => {
const data = await fetchAlarms();
setAlarms(data);
};
loadAlarms();
}, []);
const handleDelete = async (id) => {
await deleteAlarm(id);
setAlarms(alarms.filter(alarm => alarm.id !== id));
};
return (
<View style={styles.container}>
<Button title="알림 추가" onPress={() => navigation.navigate('EditAlarm')} />
<FlatList
data={alarms}
keyExtractor={(item) => item.id}
renderItem={({ item }) => (
<TouchableOpacity
style={styles.alarmItem}
onPress={() => navigation.navigate('EditAlarm', { alarm: item })}
>
<Text style={styles.title}>{item.title}</Text>
<Button title="삭제" onPress={() => handleDelete(item.id)} />
</TouchableOpacity>
)}
/>
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 20 },
alarmItem: { padding: 15, backgroundColor: '#f9f9f9', marginBottom: 10 },
title: { fontSize: 18 },
});
✅ 6. 알림 추가/수정 화면 구현 (EditAlarmScreen.js)
📄 알림 추가/수정 화면
import React, { useState } from 'react';
import { View, TextInput, Button, StyleSheet } from 'react-native';
import { addCloudAlarm, updateAlarm } from '../services/NotificationService';
export default function EditAlarmScreen({ route, navigation }) {
const [title, setTitle] = useState(route.params?.alarm?.title || '');
const [message, setMessage] = useState(route.params?.alarm?.message || '');
const alarmId = route.params?.alarm?.id;
const handleSave = async () => {
if (alarmId) {
await updateAlarm(alarmId, title, message);
alert('알림이 수정되었습니다.');
} else {
await addCloudAlarm(title, message);
alert('알림이 추가되었습니다.');
}
navigation.goBack();
};
return (
<View style={styles.container}>
<TextInput
placeholder="알림 제목"
value={title}
onChangeText={setTitle}
style={styles.input}
/>
<TextInput
placeholder="알림 내용"
value={message}
onChangeText={setMessage}
style={styles.input}
/>
<Button title={alarmId ? "수정하기" : "추가하기"} onPress={handleSave} />
</View>
);
}
const styles = StyleSheet.create({
container: { flex: 1, padding: 20 },
input: { borderWidth: 1, marginBottom: 10, padding: 10, borderRadius: 6 },
});
✅ 7. App.js 수정 (네비게이션 설정)
import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import AlarmListScreen from './screens/AlarmListScreen';
import EditAlarmScreen from './screens/EditAlarmScreen';
const Stack = createNativeStackNavigator();
export default function App() {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="AlarmList">
<Stack.Screen name="AlarmList" component={AlarmListScreen} options={{ title: '알림 목록' }} />
<Stack.Screen name="EditAlarm" component={EditAlarmScreen} options={{ title: '알림 설정' }} />
</Stack.Navigator>
</NavigationContainer>
);
}
✅ 8. 실행 결과 확인
- 알림 목록 화면에서 "알림 추가" 버튼 클릭
- 알림 제목과 내용 입력 → 추가
- 목록에 추가된 알림 확인
- 알림 클릭 → 수정 화면 이동 → 수정 후 저장
- 삭제 버튼으로 알림 삭제 확인
✅ 9. 이번 글에서 배운 것
- 알림 목록을 리스트로 관리하여 직관성 향상
- 알림 추가, 수정, 삭제 기능 구현으로 완성도 강화
- Firebase Firestore와 연동하여 알림 데이터를 클라우드에서 관리
📘 다음 확장 예고
알림 히스토리 관리 (지난 알림 확인)
사용자 설정에 따라 반복 주기 커스터마이징
알림 소리 및 진동 설정 추가
React Native 알림 관리,React Native Firebase 알림 추가,React Native 알림 수정 삭제,React Native Firestore 알림 관리,React Native 푸시 알림 수정,React Native FCM 알림 관리,React Native 클라우드 알림 저장,React Native 예약 알림 관리,React Native 알림 목록,React Native 알림 설정 화면
'framework > ReactNative' 카테고리의 다른 글
※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- CI/CD
- Prisma
- Next.js
- 프론트엔드
- REACT
- App Router
- 파이썬 알고리즘
- fastapi
- rag
- nodejs
- SEO 최적화
- Docker
- gatsbyjs
- kotlin
- nextJS
- 개발블로그
- SEO최적화
- llm
- seo 최적화 10개
- NestJS
- 웹개발
- Ktor
- Python
- PostgreSQL
- 백엔드개발
- JAX
- AI챗봇
- Webpack
- 딥러닝
- 프론트엔드면접
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
글 보관함
반응형