diff --git a/flutter/assets/svg/mood/mood_calm.svg b/flutter/assets/svg/mood/mood_calm.svg
new file mode 100644
index 0000000..3841415
--- /dev/null
+++ b/flutter/assets/svg/mood/mood_calm.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/flutter/assets/svg/mood/mood_excited.svg b/flutter/assets/svg/mood/mood_excited.svg
new file mode 100644
index 0000000..a2210d3
--- /dev/null
+++ b/flutter/assets/svg/mood/mood_excited.svg
@@ -0,0 +1,12 @@
+
\ No newline at end of file
diff --git a/flutter/assets/svg/mood/mood_happy.svg b/flutter/assets/svg/mood/mood_happy.svg
new file mode 100644
index 0000000..34e9b34
--- /dev/null
+++ b/flutter/assets/svg/mood/mood_happy.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/flutter/assets/svg/mood/mood_meh.svg b/flutter/assets/svg/mood/mood_meh.svg
new file mode 100644
index 0000000..b8459c8
--- /dev/null
+++ b/flutter/assets/svg/mood/mood_meh.svg
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/flutter/assets/svg/mood/mood_sad.svg b/flutter/assets/svg/mood/mood_sad.svg
new file mode 100644
index 0000000..3313a82
--- /dev/null
+++ b/flutter/assets/svg/mood/mood_sad.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/flutter/assets/svg/mood/mood_sick.svg b/flutter/assets/svg/mood/mood_sick.svg
new file mode 100644
index 0000000..582da91
--- /dev/null
+++ b/flutter/assets/svg/mood/mood_sick.svg
@@ -0,0 +1,10 @@
+
\ No newline at end of file
diff --git a/flutter/lib/core/router/app_router.dart b/flutter/lib/core/router/app_router.dart
index 896770f..dd7145f 100644
--- a/flutter/lib/core/router/app_router.dart
+++ b/flutter/lib/core/router/app_router.dart
@@ -5,6 +5,9 @@ import 'package:tma_app/core/constants/app_sizes.dart';
import 'package:tma_app/core/router/app_routes.dart';
import 'package:tma_app/core/utils/date_format.dart';
import 'package:tma_app/features/auth/presentation/pages/login_page.dart';
+import 'package:tma_app/features/diary/presentation/pages/diary_compose_page.dart';
+import 'package:tma_app/features/diary/presentation/pages/diary_page.dart';
+import 'package:tma_app/features/diary/presentation/pages/diary_settings_page.dart';
import 'package:tma_app/features/entry/presentation/providers/entry_provider.dart';
import 'package:tma_app/features/home/presentation/pages/home_page.dart';
import 'package:tma_app/features/intro/presentation/pages/intro_page.dart';
@@ -94,6 +97,23 @@ final appRouterProvider = Provider((ref) {
parentNavigatorKey: rootKey,
builder: (context, state) => EventEditorPage.edit(eventId: state.uri.queryParameters['id'] ?? ''),
),
+ GoRoute(
+ path: AppRoutes.diaryPattern,
+ parentNavigatorKey: rootKey,
+ builder: (context, state) => DiaryPage(diaryId: state.pathParameters['diaryId']!),
+ routes: [
+ GoRoute(
+ path: 'write',
+ parentNavigatorKey: rootKey,
+ builder: (context, state) => DiaryComposePage(diaryId: state.pathParameters['diaryId']!),
+ ),
+ GoRoute(
+ path: 'settings',
+ parentNavigatorKey: rootKey,
+ builder: (context, state) => DiarySettingsPage(diaryId: state.pathParameters['diaryId']!),
+ ),
+ ],
+ ),
// 펫 명함 — 경로가 겹치므로 고정 경로(manage·new)를 :cardId 보다 먼저 둔다
GoRoute(
path: AppRoutes.petCardManage,
diff --git a/flutter/lib/core/router/app_routes.dart b/flutter/lib/core/router/app_routes.dart
index 40e25c7..73700d0 100644
--- a/flutter/lib/core/router/app_routes.dart
+++ b/flutter/lib/core/router/app_routes.dart
@@ -32,6 +32,12 @@ abstract final class AppRoutes {
static String eventCreate(DateTime date) => '$eventCreatePath?date=${toIsoDate(date)}';
static String eventEdit(String eventId) => '$eventEditPath?id=${Uri.encodeQueryComponent(eventId)}';
+ // 다이어리 — 열면 탭바 없이 전체 화면
+ static const String diaryPattern = '/diaries/:diaryId';
+ static String diary(String id) => '/diaries/$id';
+ static String diaryWrite(String id) => '/diaries/$id/write';
+ static String diarySettings(String id) => '/diaries/$id/settings';
+
static const String petCardManage = '/pet-cards/manage';
static const String petCardCreatePattern = '/pet-cards/new/:petId';
static const String petCardDetailPattern = '/pet-cards/:cardId';
diff --git a/flutter/lib/features/diary/data/diary_repository.dart b/flutter/lib/features/diary/data/diary_repository.dart
new file mode 100644
index 0000000..6a23a58
--- /dev/null
+++ b/flutter/lib/features/diary/data/diary_repository.dart
@@ -0,0 +1,46 @@
+import 'dart:convert';
+
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+import 'package:tma_app/core/storage/preferences_provider.dart';
+import 'package:tma_app/features/diary/domain/diary.dart';
+import 'package:tma_app/features/diary/domain/diary_book.dart';
+
+/// 다이어리 저장소 계약 — 공유 다이어리(서버)가 생기면 API 구현으로 바꾼다.
+abstract interface class DiaryRepository {
+ Future fetch();
+
+ Future save(DiaryBook book);
+}
+
+const String _kDiariesKey = 'diary.diaries.v1';
+const String _kPostsKey = 'diary.posts.v1';
+const String _kCommentsKey = 'diary.comments.v1';
+
+List