React Native 기반의 캘린더 라이브러리와 일기 앱을 포함하는 모노레포 프로젝트입니다.
이 프로젝트는 yarn workspaces를 활용한 모노레포 구조로 구성되어 있습니다:
calendiary-monorepo/
├── packages/
│ ├── calendar/ # @calendiary/calendar 라이브러리
│ └── app/ # Calendiary React Native 앱
├── package.json # 루트 워크스페이스 설정
└── README.md
React Native용 캘린더 라이브러리입니다. Reanimated 3와 Gesture Handler를 활용하여 부드러운 애니메이션과 제스처를 제공합니다.
주요 특징:
- 🎨 Expandable 캘린더: 주간/월간 뷰 간 부드러운 전환
- ⚡ 애니메이션: React Native Reanimated & Worklets 기반
- 🌍 다국어 지원: LocaleConfig를 통한 로케일 관리
- 🎯 타입 안전성: TypeScript로 작성된 타입 지원
@calendiary/calendar 라이브러리를 사용하는 데모 앱입니다.
src/
├── calendars/ # 최상위 캘린더 컴포넌트
│ ├── Calendar.tsx # 기본 캘린더
│ └── ExpandableCalendar.tsx # 확장 가능한 캘린더
│
├── components/ # UI 컴포넌트
│ ├── Day.tsx # 개별 날짜 셀
│ ├── Week.tsx # 주간 뷰
│ ├── CalendarGrid.tsx # 월간 그리드
│ ├── CalendarHeader.tsx # 헤더 (월/년 표시)
│ ├── CalendarWeekDays.tsx # 요일 헤더
│ ├── AnimatedWeek.tsx # 애니메이션 주간 뷰
│ ├── WeekCalendar.tsx # 주간 캘린더
│ └── ExpandableCalendarGrid.tsx # 확장 가능한 그리드
│
├── hooks/
│ ├── domains/ # 도메인 로직 훅
│ │ ├── types.ts # 도메인 타입 정의
│ │ ├── useCalendarState.ts # 캘린더 상태 관리
│ │ ├── useCalendarHeight.ts # 높이 계산 로직
│ │ ├── useCalendarMonthsData.ts # 월별 데이터 생성
│ │ ├── useCalendarWeeksData.ts # 주별 데이터 생성
│ │ └── useExpandableCalendarState.ts # 확장 캘린더 상태
│ │
│ └── utils/ # 유틸리티 훅
│ ├── useAnimatedHeightTransition.ts # 높이 애니메이션
│ ├── useInfiniteHorizontalScroll.ts # 무한 스크롤
│ ├── useIsMounted.ts # 마운트 상태 체크
│ └── useVerticalSwipeGesture.ts # 수직 스와이프 제스처
│
└── utils/ # 순수 유틸리티 함수
├── calendar.ts # 캘린더 계산 로직
├── date.ts # 날짜 유틸리티
└── locale.ts # 로케일 설정
- calendars/: 사용자 대면 API 레이어
- components/: 재사용 가능한 UI 컴포넌트
- hooks/domains/: 비즈니스 로직 및 상태 관리
- hooks/utils/: 범용 유틸리티 훅
- utils/: 순수 함수 (사이드 이펙트 없음)
- 고수준 컴포넌트는 저수준 구현체에 직접 의존하지 않음
- 인터페이스와 타입을 통한 추상화
hooks/domains/types.ts에 도메인 타입 집중
- 순수 함수 우선 (utils/)
- 불변성 유지
- 사이드 이펙트 격리
기본 월간 캘린더 컴포넌트입니다.
import { Calendar } from "@calendiary/calendar";
const today = new Date();
<Calendar selectedDate={today} onDateSelect={(date) => console.log(date)} />;주간/월간 뷰를 자유롭게 전환할 수 있는 확장 가능한 캘린더입니다.
import { ExpandableCalendar } from "@calendiary/calendar";
const today = new Date();
<ExpandableCalendar
selectedDate={today}
onDateSelect={(date) => console.log(date)}
/>;import { LocaleConfig } from "@calendiary/calendar";
// 한국어 설정 예시
LocaleConfig.locales["ko"] = {
monthText: ["1월", "2월", "3월" /* ... */],
weekDayText: ["일", "월", "화", "수", "목", "금", "토"],
weekOfMonthText: ["1주차", "2주차", "3주차", "4주차", "5주차", "6주차"],
};- React Native: 0.81.4+
- React: 19.1.0+
- React Native Reanimated: 4.1.3+
- React Native Gesture Handler: 2.28.0+
- React Native Worklets: 0.6.1+
- TypeScript: 5.9.2+
- Node.js >= 20
- Yarn 3.6.1+
# 저장소 클론
git clone <repository-url>
cd calendiary-monorepo
# 의존성 설치
yarn install# Metro bundler 시작
yarn app:start
# iOS 앱 실행
yarn app:ios
# Android 앱 실행
yarn app:android# 라이브러리 빌드
yarn calendar:build
# 테스트 실행
yarn calendar:test다음 패키지들이 필요합니다:
yarn add react-native-reanimated react-native-gesture-handler react-native-workletsmain: 프로덕션 브랜치develop: 개발 브랜치feature/*: 기능 개발fix/*: 버그 수정
# Commitizen 사용 (권장)
yarn commit
# 또는 수동으로
git commit -m "feat: 새로운 기능 추가"
git commit -m "fix: 버그 수정"
git commit -m "docs: 문서 업데이트"- pre-commit: Lint 및 타입 체크 (lefthook)
- commit-msg: 커밋 메시지 검증 (commitlint)
