diff --git a/src/content/docs/part1/changelog.md b/src/content/docs/part1/changelog.md
index 5c89e01..03508d4 100644
--- a/src/content/docs/part1/changelog.md
+++ b/src/content/docs/part1/changelog.md
@@ -9,6 +9,7 @@ title: ๋ณ๊ฒฝ์ฌํญ
- ๐ฆ 1. ์์ํ๊ธฐ์ **๋ณ๊ฒฝ์ฌํญ** ์ถ๊ฐ
- ๐ก 2. Dart ์ธ์ด ๊ธฐ์ด ์ค ์ปฌ๋ ์
๊ณผ ๋ฐ๋ณต๋ฌธ์ collection ํจํค์ง ์๋ด ์ถ๊ฐ
- `flutter pub run build_runner build` ๋ฅผ `dart run build_runner build` ๋ก ๋ณ๊ฒฝ
+- JSON ์ง๋ ฌํ (freezed, json_serializable)์ freezed_annotation ํ ์ถ๊ฐ
### 2025๋
05์ 14์ผ
diff --git a/src/content/docs/part6/json-serialization.md b/src/content/docs/part6/json-serialization.mdx
similarity index 93%
rename from src/content/docs/part6/json-serialization.md
rename to src/content/docs/part6/json-serialization.mdx
index 14b1ba8..435720e 100644
--- a/src/content/docs/part6/json-serialization.md
+++ b/src/content/docs/part6/json-serialization.mdx
@@ -1,6 +1,8 @@
---
title: JSON ์ง๋ ฌํ (freezed, json_serializable)
---
+import { Aside } from '@astrojs/starlight/components';
+
REST API์ ํต์ ํ ๋ JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. Flutter/Dart์์๋ ์ด๋ฌํ JSON ๋ฐ์ดํฐ๋ฅผ Dart ๊ฐ์ฒด๋ก ๋ณํํ๊ณ , ๋ฐ๋๋ก Dart ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ์ง๋ ฌํํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค. ์ด ์ฅ์์๋ `json_serializable`๊ณผ `freezed` ํจํค์ง๋ฅผ ํ์ฉํ JSON ์ง๋ ฌํ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
@@ -164,6 +166,73 @@ class Product {
}
```
+
+
+
+```dart title="color_converter.dart"
+import 'package:flutter/material.dart';
+import 'package:freezed_annotation/freezed_annotation.dart';
+
+/// Color ๊ฐ์ฒด์ String(HEX) ๊ฐ์ ๋ณํ์ ์ฒ๋ฆฌํ๋ JSONConverter
+class ColorConverter implements JsonConverter {
+ const ColorConverter();
+
+ @override
+ Color fromJson(String json) {
+ // '#RRGGBB' ํํ์ HEX ๋ฌธ์์ด์ Color ๊ฐ์ฒด๋ก ๋ณํ
+ return Color(int.parse(json.substring(1), radix: 16) + 0xFF000000);
+ }
+
+ @override
+ String toJson(Color object) {
+ // Color ๊ฐ์ฒด๋ฅผ '#RRGGBB' ํํ์ HEX ๋ฌธ์์ด๋ก ๋ณํ
+ return '#${object.value.toRadixString(16).substring(2)}';
+ }
+}
+```
+
+```dart title="product.dart"
+import 'package:flutter/material.dart';
+import 'package:freezed_annotation/freezed_annotation.dart';
+
+part 'product.g.dart';
+part 'product.freezed.dart';
+
+/// ๊ฐ์ฒด ์์ฑ
+/// final Product product = Product(
+/// id: 1,
+/// name: '๋นจ๊ฐ ์ํ',
+/// color: Colors.red,
+/// );
+///
+/// JSON์ผ๋ก ๋ณํ - color๋ ์๋์ผ๋ก '#ff0000' ๊ฐ์ ๋ฌธ์์ด๋ก ๋ณํ๋จ
+/// final Map json = product.toJson();
+/// print(json); // {id: 1, name: ๋นจ๊ฐ ์ํ, color: #ff0000}
+///
+/// JSON์์ ๊ฐ์ฒด๋ก ๋ณํ - '#ff0000' ๊ฐ์ ๋ฌธ์์ด์ ์๋์ผ๋ก Color ๊ฐ์ฒด๋ก ๋ณํ๋จ
+/// final Product loadedProduct = Product.fromJson(json);
+/// print(loadedProduct.color); // Color(0xFFFF0000)
+@freezed
+class Product with _$Product {
+ factory Product({
+ required int id,
+ required String name,
+ @ColorConverter() required Color color, // JSONConverter ์ ์ฉ
+ }) = _Product;
+
+ factory Product.fromJson(Map json) => _$ProductFromJson(json);
+}
+```
+
+
#### ์ค์ฒฉ ๊ฐ์ฒด ์ฒ๋ฆฌ
```dart
diff --git a/src/content/docs/part9/multi-module.mdx b/src/content/docs/part9/multi-module.mdx
index 37a080e..af354b1 100644
--- a/src/content/docs/part9/multi-module.mdx
+++ b/src/content/docs/part9/multi-module.mdx
@@ -62,9 +62,7 @@ Flutter์์ ๋ฉํฐ ๋ชจ๋ ์ํคํ
์ฒ๋ฅผ ๊ตฌํํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ต
#### ๊ฐ ๋ชจ๋์ pubspec.yaml ์ค์
-**app/pubspec.yaml**:
-
-```yaml
+```yaml title="app/pubspec.yaml"
name: my_app
description: Main application module
version: 1.0.0+1
@@ -87,9 +85,7 @@ dependencies:
path: ../packages/feature_profile
```
-**packages/core/pubspec.yaml**:
-
-```yaml
+```yaml title="packages/core/pubspec.yaml"
name: core
description: Core module with shared functionality
version: 0.0.1
@@ -106,9 +102,7 @@ dependencies:
shared_preferences: ^2.2.0
```
-**packages/feature_auth/pubspec.yaml**:
-
-```yaml
+```yaml title="packages/feature_auth/pubspec.yaml"
name: feature_auth
description: Authentication feature module
version: 0.0.1
@@ -141,7 +135,7 @@ dart pub global activate melos
2. ํ๋ก์ ํธ ๋ฃจํธ์ `melos.yaml` ํ์ผ ์์ฑ:
-```yaml
+```yaml title="melos.yaml"
name: my_flutter_project
packages:
@@ -179,8 +173,7 @@ melos test
๋ฉํฐ ๋ชจ๋ ์ํคํ
์ฒ๋ Flutter Flavors์ ๊ฒฐํฉํ์ฌ ๋ค์ํ ์ฑ ๋ฒ์ (๊ฐ๋ฐ, ์คํ
์ด์ง, ํ๋ก๋์
๋ฑ)์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค:
-```dart
-// app/lib/main_dev.dart
+```dart title="app/lib/main_dev.dart"
import 'package:core/config.dart';
import 'package:flutter/material.dart';
import 'app.dart';
@@ -240,15 +233,15 @@ void main() {
#### ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ํต์ ์์
-```dart
-// core/lib/src/auth/auth_service.dart
+```dart title="core/lib/src/auth/auth_service.dart"
abstract class AuthService {
Future getCurrentUser();
Future signIn(String email, String password);
Future signOut();
}
+```
-// feature_auth/lib/src/services/firebase_auth_service.dart
+```dart title="feature_auth/lib/src/services/firebase_auth_service.dart"
class FirebaseAuthService implements AuthService {
@override
Future getCurrentUser() {
@@ -265,8 +258,9 @@ class FirebaseAuthService implements AuthService {
// Firebase ๊ตฌํ
}
}
+```
-// app/lib/di/service_locator.dart
+```dart title="app/lib/di/service_locator.dart"
void setupServiceLocator() {
GetIt.I.registerSingleton(FirebaseAuthService());
}
@@ -308,8 +302,7 @@ void setupServiceLocator() {
๊ฐ ๋ชจ๋์ ๋ช
ํํ ๊ณต๊ฐ API๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค. ๋ชจ๋ ๋ด๋ถ ๊ตฌํ์ ์จ๊ธฐ๊ณ ํ์ํ ๊ธฐ๋ฅ๋ง ๋
ธ์ถํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
-```dart
-// feature_auth/lib/feature_auth.dart
+```dart title="feature_auth/lib/feature_auth.dart"
library feature_auth;
// ๊ณต๊ฐ API
@@ -319,8 +312,7 @@ export 'src/domain/entities/user.dart';
export 'src/di/auth_module.dart';
```
-```dart
-// feature_auth/lib/src/di/auth_module.dart
+```dart title="feature_auth/lib/src/di/auth_module.dart"
import 'package:get_it/get_it.dart';
import '../data/repositories/auth_repository_impl.dart';
import '../data/datasources/auth_remote_datasource.dart';
@@ -375,8 +367,7 @@ class AuthModule {
์ฝ์ด ๋ชจ๋์ ๋ค๋ฅธ ๋ชจ๋ ๋ชจ๋์์ ์ฌ์ฉํ๋ ๊ณตํต ๊ธฐ๋ฅ์ ํฌํจํฉ๋๋ค:
-```dart
-// core/lib/core.dart
+```dart title="core/lib/core.dart"
library core;
export 'src/config/app_config.dart';
@@ -387,8 +378,7 @@ export 'src/di/service_locator.dart';
export 'src/navigation/router.dart';
```
-```dart
-// core/lib/src/config/app_config.dart
+```dart title="core/lib/src/config/app_config.dart"
enum Environment { dev, staging, prod }
class AppConfig {
@@ -416,8 +406,7 @@ class AppConfig {
UI ํคํธ ๋ชจ๋์ ์ฑ ์ ์ฒด์์ ์ฌ์ฉ๋๋ ๊ณตํต UI ์ปดํฌ๋ํธ๋ฅผ ํฌํจํฉ๋๋ค:
-```dart
-// ui_kit/lib/ui_kit.dart
+```dart title="ui_kit/lib/ui_kit.dart"
library ui_kit;
export 'src/buttons/primary_button.dart';
@@ -426,8 +415,7 @@ export 'src/theme/app_theme.dart';
export 'src/inputs/text_field.dart';
```
-```dart
-// ui_kit/lib/src/buttons/primary_button.dart
+```dart title="ui_kit/lib/src/buttons/primary_button.dart"
import 'package:flutter/material.dart';
class PrimaryButton extends StatelessWidget {
@@ -458,8 +446,7 @@ class PrimaryButton extends StatelessWidget {
์ํ ๊ธฐ๋ฅ ๋ชจ๋์ ์ํ ๋ชฉ๋ก, ์์ธ ์ ๋ณด, ๊ฒ์ ๋ฑ์ ๊ธฐ๋ฅ์ ๋ด๋นํฉ๋๋ค:
-```dart
-// feature_products/lib/feature_products.dart
+```dart title="feature_products/lib/feature_products.dart"
library feature_products;
export 'src/presentation/pages/product_list_page.dart';
@@ -468,8 +455,7 @@ export 'src/domain/entities/product.dart';
export 'src/di/products_module.dart';
```
-```dart
-// feature_products/lib/src/presentation/pages/product_list_page.dart
+```dart title="feature_products/lib/src/presentation/pages/product_list_page.dart"
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -516,8 +502,7 @@ class ProductListPage extends ConsumerWidget {
์ฑ ๋ชจ๋์ ๋ชจ๋ ๊ธฐ๋ฅ ๋ชจ๋์ ํตํฉํ๊ณ ์ฑ์ ์ง์
์ ์ญํ ์ ํฉ๋๋ค:
-```dart
-// app/lib/main_dev.dart
+```dart title="app/lib/main_dev.dart"
import 'package:core/core.dart';
import 'package:feature_auth/feature_auth.dart';
import 'package:feature_products/feature_products.dart';
@@ -548,8 +533,7 @@ void main() {
}
```
-```dart
-// app/lib/app.dart
+```dart title="app/lib/app.dart"
import 'package:core/core.dart';
import 'package:ui_kit/ui_kit.dart';
import 'package:flutter/material.dart';
@@ -587,7 +571,7 @@ class MyApp extends StatelessWidget {
- ํ์ํ ๊ฒฝ์ฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํต์ ์ ์ฌ์ฉํฉ๋๋ค.
- ๊ณตํต ์ฝ๋๋ฅผ ์ฝ์ด ๋ชจ๋๋ก ์ด๋์ํต๋๋ค.
-```dart
+```dart title="core/lib/core.dart"
// ์ด๋ฒคํธ ๊ธฐ๋ฐ ํต์ ์์ (core ๋ชจ๋)
class AppEvent {
// ์ด๋ฒคํธ ์ ์