안녕하세요, 여러분!
오늘은 제가 사이드 프로젝트로 진행하고 있는 React Native 캘린더 앱 개발 이야기를 공유하려고 합니다. 거의 모든 프로젝트의 시작 단계에서 항상 찾아보는 것처럼, 저도 괜찮은 라이브러리를 찾아보는 일부터 시작했습니다. 이 글에서는 제가 조사한 내용을 바탕으로 React Native에서 사용할 수 있는 캘린더 라이브러리들을 소개하고, 직접 캘린더를 구현했던 방법을 설명하겠습니다.
우선 저는 프로젝트를 빠르게 시작하고 싶어서 이미 존재하는 라이브러리를 사용하는 것이 좋겠다고 생각했습니다. 아래는 제가 찾아본 몇 가지 인기 있는 캘린더 라이브러리들입니다.
가장 먼저 찾아본 라이브러리는 react-native-calendars입니다. 이 라이브러리는 React Native에서 가장 널리 사용되는 캘린더 라이브러리 중 하나입니다. 다양한 뷰(월간, 주간, 일간 포함)를 제공하며, 커스터마이징이 용이합니다.
특징:
또 다른 유망한 라이브러리는 react-native-calendar-events입니다. 이 라이브러리는 Native 모듈로서 기기의 기본 캘린더와 상호작용 할 수 있게 해줍니다. 즉, Google Calendar나 Apple Calendar와의 동기화가 가능합니다.
특징:
react-native-big-calendar는 좀 더 심플하고 직관적인 UI를 제공하는 캘린더 라이브러리입니다. 대규모의 이벤트들을 한눈에 보기 좋게 표현할 수 있으며, 사용자 친화적인 인터페이스를 제공합니다.
특징:
많고 좋은 라이브러리가 많았고 실제로 써봤지만 아무리 커스터마이징하여 필요한 기능을 만든다 하더라도 한계가 있었습니다.
그래서 직접 구현하기로 결정했습니다!그냥 네이티브로 만들걸..!
const PAST_SCROLL_RANGE = 12;
const FUTURE_SCROLL_RANGE = 12;
const Calendar = () => {
const { width } = useWindowDimensions();
const items: Date[] = useMemo(() => {
const months: Date[] = [];
for (let i = 0; i <= PAST_SCROLL_RANGE + FUTURE_SCROLL_RANGE; i++) {
const rangeDate = addMonths(new Date(), i - PAST_SCROLL_RANGE);
months.push(rangeDate);
}
return months;
}, []);
const renderItem = useCallback(({ item }: { item: Date }) => {
const monthStart = startOfMonth(item);
const monthEnd = endOfMonth(monthStart);
const startDate = startOfWeek(monthStart);
const endDate = endOfWeek(monthEnd);
const rows = [];
let days = [];
let day = startDate;
while (day <= endDate) {
for (let i = 0; i < 7; i++) {
const formattedDate = fDate(day);
days.push(
<View key={formattedDate} style={{ padding: 8, flex: 1 }}>
<Text>{formattedDate}</Text>
</View>,
);
day = addDays(day, 1);
}
rows.push(
<View
style={{
flexDirection: 'row',
flex: 1,
}}
key={day.toString()}
>
{days}
</View>,
);
days = [];
}
return (
<View
style={{
width: width,
height: '100%',
}}
>
<View style={{ flex: 1 }}>{rows}</View>
</View>
);
}, []);
return (
<SafeAreaView style={{ flex: 1 }}>
<FlatList
data={items}
keyExtractor={(item) => JSON.stringify(item)}
renderItem={renderItem}
horizontal
pagingEnabled
/>
</SafeAreaView>
);
};
export default Calendar;
여기서 캘린더 기능을 확장하여 다양한 기능을 추가할 수 있습니다. 다음은 몇 가지 추가할 수 있는 기능들입니다:
React Native로 캘린더 앱을 만드는 과정에서 이미 좋은 라이브러리들이 많다는 점을 알 수 있었습니다. 하지만 커스터마이징의 한계를 느꼈고, 직접 구현함으로써 프로젝트에 대한 완벽한 제어권을 확보하겠다는 결정을 하게 되었습니다. 무언가를 처음부터 구현하려는 결정은 언제나 쉽지 않지만, 프로젝트를 더 나아가게 만드는 큰 발걸음이 될 수 있습니다.