# RFS Framework π
> **Enterprise-Grade Python Framework for Modern Applications**
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
[](https://cloud.google.com/run)
[](https://mypy.readthedocs.io/)
RFS Frameworkλ νλμ μΈ μν°νλΌμ΄μ¦ Python μ ν리μΌμ΄μ
μ μν μ’
ν©μ μΈ νλ μμν¬μ
λλ€. ν¨μν νλ‘κ·Έλλ° ν¨ν΄, λ°μν μν€ν
μ², κ·Έλ¦¬κ³ Google Cloud Platformκ³Όμ μλ²½ν ν΅ν©μ μ 곡ν©λλ€.
## β¨ Key Features
### π§ Core Framework
- **π― Result Pattern**: ν¨μν μλ¬ νΈλ€λ§κ³Ό νμ
μμ μ±
- **βοΈ Configuration Management**: νκ²½λ³ μ€μ κ³Ό κ²μ¦ μμ€ν
- **π Dependency Injection**: λ μ§μ€νΈλ¦¬ κΈ°λ° μλΉμ€ κ΄λ¦¬
- **π Type Safety**: μμ ν νμ
ννΈ μ§μ (Python 3.10+)
### β‘ Reactive Programming
- **π‘ Mono/Flux**: λΉλκΈ° λ°μν μ€νΈλ¦Ό μ²λ¦¬
- **π Operators**: `map`, `filter`, `flat_map` λ± 30+ μ°μ°μ
- **β° Schedulers**: λ©ν°μ€λ λ λ° λΉλκΈ° μ€ν 컨ν
μ€νΈ
- **π Backpressure**: μλ νλ¦ μ μ΄
### ποΈ Advanced Patterns
- **π State Machine**: ν¨μν μν κ΄λ¦¬
- **π‘ Event Sourcing**: CQRSμ μ΄λ²€νΈ μ€ν μ΄
- **πͺ Saga Pattern**: λΆμ° νΈλμμ
μ€μΌμ€νΈλ μ΄μ
- **βοΈ Cloud Native**: Google Cloud Run μ΅μ ν
### π οΈ Developer Experience
- **π₯οΈ Rich CLI**: νλ‘μ νΈ μμ±, κ°λ°, λ°°ν¬ λͺ
λ Ήμ΄
- **π€ Automation**: CI/CD νμ΄νλΌμΈ μλν
- **π§ͺ Testing**: ν΅ν© ν
μ€νΈ νλ μμν¬
- **π Docs**: μλ λ¬Έμ μμ±
### π Production Ready
- **β
Validation**: ν¬κ΄μ μΈ μμ€ν
κ²μ¦
- **β‘ Optimization**: λ©λͺ¨λ¦¬, CPU, I/O μ΅μ ν
- **π‘οΈ Security**: μ·¨μ½μ μ€μΊλ λ° λ³΄μ κ°ν
- **π Deployment**: νλ‘λμ
μ€λΉμ± κ²μ¦
## π Quick Start
### Installation
```bash
pip install rfs-v4
```
### Basic Usage
```python
from rfs import Result, Success, Failure
from rfs import SystemValidator, PerformanceOptimizer
# Result ν¨ν΄μΌλ‘ μμ ν μλ¬ νΈλ€λ§
def divide(a: int, b: int) -> Result[float, str]:
if b == 0:
return Failure("0μΌλ‘ λλ μ μμ΅λλ€")
return Success(a / b)
# κ²°κ³Ό μ²λ¦¬
result = divide(10, 2)
if result.is_success:
print(f"κ²°κ³Ό: {result.unwrap()}") # κ²°κ³Ό: 5.0
else:
print(f"μ€λ₯: {result.unwrap_err()}")
# μμ€ν
κ²μ¦ μ¬μ©
validator = SystemValidator()
validation_result = validator.validate_system()
print(f"μμ€ν
μν: {'μ μ' if validation_result.is_valid else 'λ¬Έμ λ°κ²¬'}")
```
### μ€μ κ΄λ¦¬
```python
from rfs import RFSConfig, get_config
# μ€μ νμΌ λ‘λ (config.toml)
config = get_config()
print(f"μ ν리μΌμ΄μ
νκ²½: {config.environment}")
print(f"λ°μ΄ν°λ² μ΄μ€ URL: {config.database.url}")
# νκ²½λ³ μ€μ μ¬μ©
if config.environment == "production":
print("νλ‘λμ
νκ²½μμ μ€ν μ€")
else:
print("κ°λ° νκ²½μμ μ€ν μ€")
```
### State Machine
```python
from rfs import StateMachine, State, Transition
from rfs import Result
# κ°λ¨ν μ£Όλ¬Έ μν λ¨Έμ
order_machine = StateMachine(
initial_state="pending",
states=["pending", "processing", "completed", "cancelled"]
)
# μν μ ν
print(f"νμ¬ μν: {order_machine.current_state}") # pending
order_machine.transition_to("processing")
print(f"λ³κ²½λ μν: {order_machine.current_state}") # processing
```
## π₯οΈ CLI Usage
### Project Management
```bash
# μ νλ‘μ νΈ μμ±
rfs-cli create-project my-awesome-app --template fastapi
# νλ‘μ νΈ μ 보 νμΈ
rfs-cli project info
# μμ‘΄μ± κ΄λ¦¬
rfs-cli project deps --install
```
### Development
```bash
# κ°λ° μλ² μ€ν
rfs-cli dev --reload --port 8000
# μ½λ νμ§ κ²μ¬
rfs-cli dev lint
rfs-cli dev test
rfs-cli dev security-scan
```
### Deployment
```bash
# Cloud Run λ°°ν¬
rfs-cli deploy cloud-run --region asia-northeast3
# λ°°ν¬ μν νμΈ
rfs-cli deploy status
# λ‘κ·Έ νμΈ
rfs-cli deploy logs --follow
```
## ποΈ Architecture
RFS Framework v4λ λͺ¨λλ¬ μν€ν
μ²λ‘ μ€κ³λμ΄ νμμ λ°λΌ μ»΄ν¬λνΈλ₯Ό μ νμ μΌλ‘ μ¬μ©ν μ μμ΅λλ€.
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Application Layer β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β π οΈ CLI Tool β π Monitoring β π Security β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β‘ Reactive β π State Machine β π‘ Events β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β βοΈ Serverless β π§ Core β π§ͺ Testing β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Infrastructure Layer β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
### Core Modules
| Module | Description | Key Components |
|--------|-------------|----------------|
| **Core** | κΈ°λ³Έ ν¨ν΄κ³Ό μ νΈλ¦¬ν° | Result, Config, Registry |
| **Reactive** | λ°μν νλ‘κ·Έλλ° | Mono, Flux, Operators |
| **State Machine** | μν κ΄λ¦¬ | States, Transitions, Actions |
| **Events** | μ΄λ²€νΈ κΈ°λ° μν€ν
μ² | Event Store, CQRS, Saga |
| **Serverless** | ν΄λΌμ°λ λ€μ΄ν°λΈ | Cloud Run, Functions |
| **CLI** | κ°λ°μ λꡬ | Commands, Workflows |
## π Examples
### E-commerce API
```python
from rfs_v4 import RFSApp
from rfs_v4.core import Result
from rfs_v4.state_machine import StateMachine
from rfs_v4.reactive import Flux
app = RFSApp()
# μ£Όλ¬Έ μν λ¨Έμ
order_states = StateMachine.builder() \
.add_state("pending") \
.add_state("paid") \
.add_state("shipped") \
.add_state("delivered") \
.add_transition("pending", "pay", "paid") \
.add_transition("paid", "ship", "shipped") \
.add_transition("shipped", "deliver", "delivered") \
.build()
@app.route("/orders", method="POST")
async def create_order(order_data: dict) -> Result[dict, str]:
# μ£Όλ¬Έ κ²μ¦
validation_result = await validate_order(order_data)
if validation_result.is_failure():
return validation_result
# μν λ¨Έμ μΌλ‘ μ£Όλ¬Έ μμ±
order = await order_states.create_instance(
initial_state="pending",
data=order_data
)
return Result.success({"order_id": order.id, "status": order.state})
@app.route("/orders/{order_id}/items")
async def get_order_items(order_id: str) -> Result[list, str]:
# λ°μν μ€νΈλ¦ΌμΌλ‘ μ£Όλ¬Έ μμ΄ν
μ²λ¦¬
items = await (
Flux.from_database(f"orders/{order_id}/items")
.map(lambda item: {
"id": item.id,
"name": item.name,
"price": item.price,
"quantity": item.quantity
})
.filter(lambda item: item["quantity"] > 0)
.collect_list()
.to_result()
)
return items
```
## π§ Configuration
### Environment Configuration
```python
# config.toml
[development]
database_url = "sqlite:///dev.db"
redis_url = "redis://localhost:6379"
log_level = "DEBUG"
[production]
database_url = "${DATABASE_URL}"
redis_url = "${REDIS_URL}"
log_level = "INFO"
[cloud_run]
extends = "production"
port = 8080
workers = 4
```
### Application Configuration
```python
from rfs_v4.core import Config, ConfigProfile
config = Config.load("config.toml")
# νκ²½λ³ μ€μ λ‘λ
if config.profile == ConfigProfile.PRODUCTION:
# νλ‘λμ
μ€μ
pass
elif config.profile == ConfigProfile.DEVELOPMENT:
# κ°λ° μ€μ
pass
```
## π§ͺ Testing
### Unit Testing
```python
import pytest
from rfs_v4.core import Result
from rfs_v4.reactive import Mono
class TestUserService:
async def test_get_user_success(self):
result = await get_user(1)
assert result.is_success()
assert result.value["id"] == 1
async def test_get_user_not_found(self):
result = await get_user(999)
assert result.is_failure()
assert "not found" in result.error
async def test_reactive_processing(self):
result = await (
Mono.just([1, 2, 3])
.flat_map(lambda items: Flux.from_iterable(items))
.map(lambda x: x * 2)
.collect_list()
.to_result()
)
assert result.is_success()
assert result.value == [2, 4, 6]
```
### Integration Testing
```bash
# CLIλ₯Ό ν΅ν ν΅ν© ν
μ€νΈ
rfs-cli test --integration
# νΉμ λͺ¨λ ν
μ€νΈ
rfs-cli test --module core
rfs-cli test --module reactive
```
## π Performance
### Benchmarks
| Operation | RFS v3 | RFS v4 | Improvement |
|-----------|--------|--------|-------------|
| Cold Start | 3.2s | 1.8s | **44% faster** |
| Memory Usage | 128MB | 89MB | **30% less** |
| Throughput | 750 RPS | 1200 RPS | **60% more** |
| Response Time | 45ms | 28ms | **38% faster** |
### Optimization Tips
```python
# 1. λ©λͺ¨λ¦¬ μ΅μ νλ₯Ό μν μ€νΈλ¦Ό μ¬μ©
async def process_large_dataset():
return await (
Flux.from_database("large_table")
.buffer(100) # λ°°μΉ μ²λ¦¬
.map(process_batch)
.flat_map(lambda batch: Flux.from_iterable(batch))
.collect_list()
.to_result()
)
# 2. μΊμ±μΌλ‘ μ±λ₯ ν₯μ
@app.cache(ttl=300) # 5λΆ μΊμ
async def expensive_operation() -> Result[str, str]:
# λΉμ©μ΄ ν° μ°μ°
pass
# 3. λΉλκΈ° λ³λ ¬ μ²λ¦¬
async def parallel_processing():
tasks = [
process_user(user_id)
for user_id in user_ids
]
results = await Flux.merge(*tasks).collect_list().to_result()
return results
```
## π Security
RFS v4λ 보μμ μ΅μ°μ μΌλ‘ μ€κ³λμμ΅λλ€.
### Security Features
- **π Vulnerability Scanning**: μλ μ·¨μ½μ νμ§
- **π Encryption**: AES-256 λ°μ΄ν° μνΈν
- **π« Authentication**: JWT ν ν° κΈ°λ° μΈμ¦
- **π‘οΈ Input Validation**: μλ μ
λ ₯ κ²μ¦ λ° μ΄κ·
- **π Compliance**: OWASP Top 10 μ€μ
### Security Best Practices
```python
from rfs_v4.security import SecurityScanner, encrypt, decrypt
# 보μ μ€μΊ
scanner = SecurityScanner()
vulnerabilities = await scanner.scan_directory("./src")
# λ°μ΄ν° μνΈν
encrypted_data = encrypt("sensitive information", key)
decrypted_data = decrypt(encrypted_data, key)
# μ
λ ₯ κ²μ¦
@app.route("/api/users")
@validate_input(UserCreateSchema)
async def create_user(data: dict) -> Result[dict, str]:
# μλμΌλ‘ κ²μ¦λ λ°μ΄ν°
pass
```
## π Deployment
### Cloud Run Deployment
```bash
# 1. νλ‘μ νΈ λΉλ
rfs-cli build --platform cloud-run
# 2. λ°°ν¬
rfs-cli deploy cloud-run \
--region asia-northeast3 \
--memory 1Gi \
--cpu 2 \
--max-instances 100
# 3. λλ©μΈ λ§€ν
rfs-cli deploy domain --name api.example.com
```
### Docker Deployment
```dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8080
CMD ["rfs-cli", "serve", "--port", "8080"]
```
## π Documentation
- **[API Reference](./docs/api/)** - μμ ν API λ¬Έμ
- **[User Guide](./docs/guide/)** - λ¨κ³λ³ μ¬μ© κ°μ΄λ
- **[Examples](./examples/)** - μ€μ μμ μ½λ
- **[Migration Guide](./docs/migration/)** - v3μμ v4λ‘ λ§μ΄κ·Έλ μ΄μ
- **[Contributing](./CONTRIBUTING.md)** - κΈ°μ¬ κ°μ΄λ
- **[Changelog](./CHANGELOG.md)** - λ³κ²½ μ΄λ ₯
## π€ Contributing
RFS Frameworkλ μ€νμμ€ νλ‘μ νΈμ
λλ€. κΈ°μ¬λ₯Ό νμν©λλ€!
```bash
# 1. μ μ₯μ ν¬ν¬
git clone https://github.com/interactord/rfs-framework.git
# 2. κ°λ° νκ²½ μ€μ
cd rfs-framework
pip install -e ".[dev]"
# 3. ν
μ€νΈ μ€ν
rfs-cli test --all
# 4. PR μμ±
git checkout -b feature/awesome-feature
git commit -m "feat: add awesome feature"
git push origin feature/awesome-feature
```
### Development Setup
```bash
# κ°μνκ²½ μμ±
python -m venv venv
source venv/bin/activate # Linux/Mac
# λλ
venv\Scripts\activate # Windows
# κ°λ°μ© μμ‘΄μ± μ€μΉ
pip install -e ".[dev,test,docs]"
# νλ¦¬μ»€λ° ν
μ€μ
pre-commit install
```
## π Roadmap
### v4.1 (2025 Q3)
- π νλ¬κ·ΈμΈ μμ€ν
- π GraphQL μ§μ
- π± λͺ¨λ°μΌ SDK
### v4.2 (2025 Q4)
- π€ AI/ML ν΅ν©
- π κ³ κΈ λͺ¨λν°λ§
- π μλ μ€μΌμΌλ§ κ°μ
### v5.0 (2026 Q1)
- π¦ Rust νμ₯
- β‘ μ±λ₯ μ΅μ ν
- π λ€μ€ ν΄λΌμ°λ μ§μ
## π Support
### Community
- **π¬ Discord**: [RFS Community](https://discord.gg/rfs-framework)
- **π§ Email**: support@rfs-framework.dev
- **π Issues**: [GitHub Issues](https://github.com/interactord/rfs-framework/issues)
- **π Docs**: [Documentation](https://github.com/interactord/rfs-framework#documentation)
### Enterprise Support
μν°νλΌμ΄μ¦ μ§μμ΄ νμνμλ©΄ enterprise@rfs-framework.devλ‘ μ°λ½ν΄ μ£ΌμΈμ.
## π License
MIT License - μμΈν λ΄μ©μ [LICENSE](./LICENSE) νμΌμ μ°Έμ‘°νμΈμ.
---
**Made with β€οΈ by the RFS Framework Team**
[](https://github.com/interactord/rfs-framework)
[](https://github.com/interactord/rfs-framework/fork)
[](https://pypi.org/project/rfs-v4/)
Raw data
{
"_id": null,
"home_page": null,
"name": "rfs-v4",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "async, cloud-native, enterprise, framework, functional, microservices, monad, optimization, production-ready, reactive, result-pattern, security, serverless, validation",
"author": null,
"author_email": "RFS Framework Team <team@rfs-framework.dev>",
"download_url": "https://files.pythonhosted.org/packages/2e/5c/144c45a688d93169b4a637833e9712b97ae4a5e73b8d4987ea51474f209b/rfs_v4-4.0.1.tar.gz",
"platform": null,
"description": "# RFS Framework \ud83d\ude80\n\n> **Enterprise-Grade Python Framework for Modern Applications**\n\n[](https://www.python.org/downloads/)\n[](https://opensource.org/licenses/MIT)\n[](https://cloud.google.com/run)\n[](https://mypy.readthedocs.io/)\n\nRFS Framework\ub294 \ud604\ub300\uc801\uc778 \uc5d4\ud130\ud504\ub77c\uc774\uc988 Python \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc704\ud55c \uc885\ud569\uc801\uc778 \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. \ud568\uc218\ud615 \ud504\ub85c\uadf8\ub798\ubc0d \ud328\ud134, \ubc18\uc751\ud615 \uc544\ud0a4\ud14d\ucc98, \uadf8\ub9ac\uace0 Google Cloud Platform\uacfc\uc758 \uc644\ubcbd\ud55c \ud1b5\ud569\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.\n\n## \u2728 Key Features\n\n### \ud83d\udd27 Core Framework\n- **\ud83c\udfaf Result Pattern**: \ud568\uc218\ud615 \uc5d0\ub7ec \ud578\ub4e4\ub9c1\uacfc \ud0c0\uc785 \uc548\uc804\uc131\n- **\u2699\ufe0f Configuration Management**: \ud658\uacbd\ubcc4 \uc124\uc815\uacfc \uac80\uc99d \uc2dc\uc2a4\ud15c \n- **\ud83d\udd17 Dependency Injection**: \ub808\uc9c0\uc2a4\ud2b8\ub9ac \uae30\ubc18 \uc11c\ube44\uc2a4 \uad00\ub9ac\n- **\ud83d\udd12 Type Safety**: \uc644\uc804\ud55c \ud0c0\uc785 \ud78c\ud2b8 \uc9c0\uc6d0 (Python 3.10+)\n\n### \u26a1 Reactive Programming\n- **\ud83d\udce1 Mono/Flux**: \ube44\ub3d9\uae30 \ubc18\uc751\ud615 \uc2a4\ud2b8\ub9bc \ucc98\ub9ac\n- **\ud83d\udd04 Operators**: `map`, `filter`, `flat_map` \ub4f1 30+ \uc5f0\uc0b0\uc790\n- **\u23f0 Schedulers**: \uba40\ud2f0\uc2a4\ub808\ub4dc \ubc0f \ube44\ub3d9\uae30 \uc2e4\ud589 \ucee8\ud14d\uc2a4\ud2b8\n- **\ud83c\udfad Backpressure**: \uc790\ub3d9 \ud750\ub984 \uc81c\uc5b4\n\n### \ud83c\udfd7\ufe0f Advanced Patterns\n- **\ud83c\udfad State Machine**: \ud568\uc218\ud615 \uc0c1\ud0dc \uad00\ub9ac\n- **\ud83d\udce1 Event Sourcing**: CQRS\uc640 \uc774\ubca4\ud2b8 \uc2a4\ud1a0\uc5b4\n- **\ud83c\udfaa Saga Pattern**: \ubd84\uc0b0 \ud2b8\ub79c\uc7ad\uc158 \uc624\ucf00\uc2a4\ud2b8\ub808\uc774\uc158\n- **\u2601\ufe0f Cloud Native**: Google Cloud Run \ucd5c\uc801\ud654\n\n### \ud83d\udee0\ufe0f Developer Experience\n- **\ud83d\udda5\ufe0f Rich CLI**: \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131, \uac1c\ubc1c, \ubc30\ud3ec \uba85\ub839\uc5b4\n- **\ud83e\udd16 Automation**: CI/CD \ud30c\uc774\ud504\ub77c\uc778 \uc790\ub3d9\ud654\n- **\ud83e\uddea Testing**: \ud1b5\ud569 \ud14c\uc2a4\ud2b8 \ud504\ub808\uc784\uc6cc\ud06c\n- **\ud83d\udcd6 Docs**: \uc790\ub3d9 \ubb38\uc11c \uc0dd\uc131\n\n### \ud83d\udd12 Production Ready\n- **\u2705 Validation**: \ud3ec\uad04\uc801\uc778 \uc2dc\uc2a4\ud15c \uac80\uc99d\n- **\u26a1 Optimization**: \uba54\ubaa8\ub9ac, CPU, I/O \ucd5c\uc801\ud654\n- **\ud83d\udee1\ufe0f Security**: \ucde8\uc57d\uc810 \uc2a4\uce90\ub2dd \ubc0f \ubcf4\uc548 \uac15\ud654\n- **\ud83d\ude80 Deployment**: \ud504\ub85c\ub355\uc158 \uc900\ube44\uc131 \uac80\uc99d\n\n## \ud83d\ude80 Quick Start\n\n### Installation\n\n```bash\npip install rfs-v4\n```\n\n### Basic Usage\n\n```python\nfrom rfs import Result, Success, Failure\nfrom rfs import SystemValidator, PerformanceOptimizer\n\n# Result \ud328\ud134\uc73c\ub85c \uc548\uc804\ud55c \uc5d0\ub7ec \ud578\ub4e4\ub9c1\ndef divide(a: int, b: int) -> Result[float, str]:\n if b == 0:\n return Failure(\"0\uc73c\ub85c \ub098\ub20c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4\")\n return Success(a / b)\n\n# \uacb0\uacfc \ucc98\ub9ac\nresult = divide(10, 2)\nif result.is_success:\n print(f\"\uacb0\uacfc: {result.unwrap()}\") # \uacb0\uacfc: 5.0\nelse:\n print(f\"\uc624\ub958: {result.unwrap_err()}\")\n\n# \uc2dc\uc2a4\ud15c \uac80\uc99d \uc0ac\uc6a9\nvalidator = SystemValidator()\nvalidation_result = validator.validate_system()\nprint(f\"\uc2dc\uc2a4\ud15c \uc0c1\ud0dc: {'\uc815\uc0c1' if validation_result.is_valid else '\ubb38\uc81c \ubc1c\uacac'}\")\n```\n\n### \uc124\uc815 \uad00\ub9ac\n\n```python\nfrom rfs import RFSConfig, get_config\n\n# \uc124\uc815 \ud30c\uc77c \ub85c\ub4dc (config.toml)\nconfig = get_config()\nprint(f\"\uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ud658\uacbd: {config.environment}\")\nprint(f\"\ub370\uc774\ud130\ubca0\uc774\uc2a4 URL: {config.database.url}\")\n\n# \ud658\uacbd\ubcc4 \uc124\uc815 \uc0ac\uc6a9\nif config.environment == \"production\":\n print(\"\ud504\ub85c\ub355\uc158 \ud658\uacbd\uc5d0\uc11c \uc2e4\ud589 \uc911\")\nelse:\n print(\"\uac1c\ubc1c \ud658\uacbd\uc5d0\uc11c \uc2e4\ud589 \uc911\")\n```\n\n### State Machine\n\n```python\nfrom rfs import StateMachine, State, Transition\nfrom rfs import Result\n\n# \uac04\ub2e8\ud55c \uc8fc\ubb38 \uc0c1\ud0dc \uba38\uc2e0\norder_machine = StateMachine(\n initial_state=\"pending\",\n states=[\"pending\", \"processing\", \"completed\", \"cancelled\"]\n)\n\n# \uc0c1\ud0dc \uc804\ud658\nprint(f\"\ud604\uc7ac \uc0c1\ud0dc: {order_machine.current_state}\") # pending\norder_machine.transition_to(\"processing\")\nprint(f\"\ubcc0\uacbd\ub41c \uc0c1\ud0dc: {order_machine.current_state}\") # processing\n```\n\n## \ud83d\udda5\ufe0f CLI Usage\n\n### Project Management\n```bash\n# \uc0c8 \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131\nrfs-cli create-project my-awesome-app --template fastapi\n\n# \ud504\ub85c\uc81d\ud2b8 \uc815\ubcf4 \ud655\uc778\nrfs-cli project info\n\n# \uc758\uc874\uc131 \uad00\ub9ac\nrfs-cli project deps --install\n```\n\n### Development\n```bash\n# \uac1c\ubc1c \uc11c\ubc84 \uc2e4\ud589\nrfs-cli dev --reload --port 8000\n\n# \ucf54\ub4dc \ud488\uc9c8 \uac80\uc0ac\nrfs-cli dev lint\nrfs-cli dev test\nrfs-cli dev security-scan\n```\n\n### Deployment\n```bash\n# Cloud Run \ubc30\ud3ec\nrfs-cli deploy cloud-run --region asia-northeast3\n\n# \ubc30\ud3ec \uc0c1\ud0dc \ud655\uc778\nrfs-cli deploy status\n\n# \ub85c\uadf8 \ud655\uc778\nrfs-cli deploy logs --follow\n```\n\n## \ud83c\udfd7\ufe0f Architecture\n\nRFS Framework v4\ub294 \ubaa8\ub4c8\ub7ec \uc544\ud0a4\ud14d\ucc98\ub85c \uc124\uacc4\ub418\uc5b4 \ud544\uc694\uc5d0 \ub530\ub77c \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc120\ud0dd\uc801\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Application Layer \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \ud83d\udee0\ufe0f CLI Tool \u2502 \ud83d\udcca Monitoring \u2502 \ud83d\udd12 Security \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u26a1 Reactive \u2502 \ud83c\udfad State Machine \u2502 \ud83d\udce1 Events \u2502 \n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 \u2601\ufe0f Serverless \u2502 \ud83d\udd27 Core \u2502 \ud83e\uddea Testing \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 Infrastructure Layer \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n### Core Modules\n\n| Module | Description | Key Components |\n|--------|-------------|----------------|\n| **Core** | \uae30\ubcf8 \ud328\ud134\uacfc \uc720\ud2f8\ub9ac\ud2f0 | Result, Config, Registry |\n| **Reactive** | \ubc18\uc751\ud615 \ud504\ub85c\uadf8\ub798\ubc0d | Mono, Flux, Operators |\n| **State Machine** | \uc0c1\ud0dc \uad00\ub9ac | States, Transitions, Actions |\n| **Events** | \uc774\ubca4\ud2b8 \uae30\ubc18 \uc544\ud0a4\ud14d\ucc98 | Event Store, CQRS, Saga |\n| **Serverless** | \ud074\ub77c\uc6b0\ub4dc \ub124\uc774\ud2f0\ube0c | Cloud Run, Functions |\n| **CLI** | \uac1c\ubc1c\uc790 \ub3c4\uad6c | Commands, Workflows |\n\n## \ud83d\udcd6 Examples\n\n### E-commerce API\n\n```python\nfrom rfs_v4 import RFSApp\nfrom rfs_v4.core import Result\nfrom rfs_v4.state_machine import StateMachine\nfrom rfs_v4.reactive import Flux\n\napp = RFSApp()\n\n# \uc8fc\ubb38 \uc0c1\ud0dc \uba38\uc2e0\norder_states = StateMachine.builder() \\\n .add_state(\"pending\") \\\n .add_state(\"paid\") \\\n .add_state(\"shipped\") \\\n .add_state(\"delivered\") \\\n .add_transition(\"pending\", \"pay\", \"paid\") \\\n .add_transition(\"paid\", \"ship\", \"shipped\") \\\n .add_transition(\"shipped\", \"deliver\", \"delivered\") \\\n .build()\n\n@app.route(\"/orders\", method=\"POST\")\nasync def create_order(order_data: dict) -> Result[dict, str]:\n # \uc8fc\ubb38 \uac80\uc99d\n validation_result = await validate_order(order_data)\n if validation_result.is_failure():\n return validation_result\n \n # \uc0c1\ud0dc \uba38\uc2e0\uc73c\ub85c \uc8fc\ubb38 \uc0dd\uc131\n order = await order_states.create_instance(\n initial_state=\"pending\",\n data=order_data\n )\n \n return Result.success({\"order_id\": order.id, \"status\": order.state})\n\n@app.route(\"/orders/{order_id}/items\")\nasync def get_order_items(order_id: str) -> Result[list, str]:\n # \ubc18\uc751\ud615 \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uc8fc\ubb38 \uc544\uc774\ud15c \ucc98\ub9ac\n items = await (\n Flux.from_database(f\"orders/{order_id}/items\")\n .map(lambda item: {\n \"id\": item.id,\n \"name\": item.name,\n \"price\": item.price,\n \"quantity\": item.quantity\n })\n .filter(lambda item: item[\"quantity\"] > 0)\n .collect_list()\n .to_result()\n )\n \n return items\n```\n\n## \ud83d\udd27 Configuration\n\n### Environment Configuration\n\n```python\n# config.toml\n[development]\ndatabase_url = \"sqlite:///dev.db\"\nredis_url = \"redis://localhost:6379\"\nlog_level = \"DEBUG\"\n\n[production]\ndatabase_url = \"${DATABASE_URL}\"\nredis_url = \"${REDIS_URL}\"\nlog_level = \"INFO\"\n\n[cloud_run]\nextends = \"production\"\nport = 8080\nworkers = 4\n```\n\n### Application Configuration\n\n```python\nfrom rfs_v4.core import Config, ConfigProfile\n\nconfig = Config.load(\"config.toml\")\n\n# \ud658\uacbd\ubcc4 \uc124\uc815 \ub85c\ub4dc\nif config.profile == ConfigProfile.PRODUCTION:\n # \ud504\ub85c\ub355\uc158 \uc124\uc815\n pass\nelif config.profile == ConfigProfile.DEVELOPMENT:\n # \uac1c\ubc1c \uc124\uc815 \n pass\n```\n\n## \ud83e\uddea Testing\n\n### Unit Testing\n\n```python\nimport pytest\nfrom rfs_v4.core import Result\nfrom rfs_v4.reactive import Mono\n\nclass TestUserService:\n async def test_get_user_success(self):\n result = await get_user(1)\n \n assert result.is_success()\n assert result.value[\"id\"] == 1\n \n async def test_get_user_not_found(self):\n result = await get_user(999)\n \n assert result.is_failure()\n assert \"not found\" in result.error\n \n async def test_reactive_processing(self):\n result = await (\n Mono.just([1, 2, 3])\n .flat_map(lambda items: Flux.from_iterable(items))\n .map(lambda x: x * 2)\n .collect_list()\n .to_result()\n )\n \n assert result.is_success()\n assert result.value == [2, 4, 6]\n```\n\n### Integration Testing\n\n```bash\n# CLI\ub97c \ud1b5\ud55c \ud1b5\ud569 \ud14c\uc2a4\ud2b8\nrfs-cli test --integration\n\n# \ud2b9\uc815 \ubaa8\ub4c8 \ud14c\uc2a4\ud2b8\nrfs-cli test --module core\nrfs-cli test --module reactive\n```\n\n## \ud83d\udcca Performance\n\n### Benchmarks\n\n| Operation | RFS v3 | RFS v4 | Improvement |\n|-----------|--------|--------|-------------|\n| Cold Start | 3.2s | 1.8s | **44% faster** |\n| Memory Usage | 128MB | 89MB | **30% less** |\n| Throughput | 750 RPS | 1200 RPS | **60% more** |\n| Response Time | 45ms | 28ms | **38% faster** |\n\n### Optimization Tips\n\n```python\n# 1. \uba54\ubaa8\ub9ac \ucd5c\uc801\ud654\ub97c \uc704\ud55c \uc2a4\ud2b8\ub9bc \uc0ac\uc6a9\nasync def process_large_dataset():\n return await (\n Flux.from_database(\"large_table\")\n .buffer(100) # \ubc30\uce58 \ucc98\ub9ac\n .map(process_batch)\n .flat_map(lambda batch: Flux.from_iterable(batch))\n .collect_list()\n .to_result()\n )\n\n# 2. \uce90\uc2f1\uc73c\ub85c \uc131\ub2a5 \ud5a5\uc0c1\n@app.cache(ttl=300) # 5\ubd84 \uce90\uc2dc\nasync def expensive_operation() -> Result[str, str]:\n # \ube44\uc6a9\uc774 \ud070 \uc5f0\uc0b0\n pass\n\n# 3. \ube44\ub3d9\uae30 \ubcd1\ub82c \ucc98\ub9ac\nasync def parallel_processing():\n tasks = [\n process_user(user_id) \n for user_id in user_ids\n ]\n results = await Flux.merge(*tasks).collect_list().to_result()\n return results\n```\n\n## \ud83d\udd12 Security\n\nRFS v4\ub294 \ubcf4\uc548\uc744 \ucd5c\uc6b0\uc120\uc73c\ub85c \uc124\uacc4\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n\n### Security Features\n- **\ud83d\udd0d Vulnerability Scanning**: \uc790\ub3d9 \ucde8\uc57d\uc810 \ud0d0\uc9c0\n- **\ud83d\udd10 Encryption**: AES-256 \ub370\uc774\ud130 \uc554\ud638\ud654 \n- **\ud83c\udfab Authentication**: JWT \ud1a0\ud070 \uae30\ubc18 \uc778\uc99d\n- **\ud83d\udee1\ufe0f Input Validation**: \uc790\ub3d9 \uc785\ub825 \uac80\uc99d \ubc0f \uc0b4\uade0\n- **\ud83d\udccb Compliance**: OWASP Top 10 \uc900\uc218\n\n### Security Best Practices\n\n```python\nfrom rfs_v4.security import SecurityScanner, encrypt, decrypt\n\n# \ubcf4\uc548 \uc2a4\uce94\nscanner = SecurityScanner()\nvulnerabilities = await scanner.scan_directory(\"./src\")\n\n# \ub370\uc774\ud130 \uc554\ud638\ud654\nencrypted_data = encrypt(\"sensitive information\", key)\ndecrypted_data = decrypt(encrypted_data, key)\n\n# \uc785\ub825 \uac80\uc99d\n@app.route(\"/api/users\")\n@validate_input(UserCreateSchema)\nasync def create_user(data: dict) -> Result[dict, str]:\n # \uc790\ub3d9\uc73c\ub85c \uac80\uc99d\ub41c \ub370\uc774\ud130\n pass\n```\n\n## \ud83d\ude80 Deployment\n\n### Cloud Run Deployment\n\n```bash\n# 1. \ud504\ub85c\uc81d\ud2b8 \ube4c\ub4dc\nrfs-cli build --platform cloud-run\n\n# 2. \ubc30\ud3ec\nrfs-cli deploy cloud-run \\\n --region asia-northeast3 \\\n --memory 1Gi \\\n --cpu 2 \\\n --max-instances 100\n\n# 3. \ub3c4\uba54\uc778 \ub9e4\ud551\nrfs-cli deploy domain --name api.example.com\n```\n\n### Docker Deployment\n\n```dockerfile\nFROM python:3.11-slim\n\nWORKDIR /app\nCOPY requirements.txt .\nRUN pip install -r requirements.txt\n\nCOPY . .\n\nEXPOSE 8080\nCMD [\"rfs-cli\", \"serve\", \"--port\", \"8080\"]\n```\n\n## \ud83d\udcda Documentation\n\n- **[API Reference](./docs/api/)** - \uc644\uc804\ud55c API \ubb38\uc11c\n- **[User Guide](./docs/guide/)** - \ub2e8\uacc4\ubcc4 \uc0ac\uc6a9 \uac00\uc774\ub4dc \n- **[Examples](./examples/)** - \uc2e4\uc81c \uc608\uc81c \ucf54\ub4dc\n- **[Migration Guide](./docs/migration/)** - v3\uc5d0\uc11c v4\ub85c \ub9c8\uc774\uadf8\ub808\uc774\uc158\n- **[Contributing](./CONTRIBUTING.md)** - \uae30\uc5ec \uac00\uc774\ub4dc\n- **[Changelog](./CHANGELOG.md)** - \ubcc0\uacbd \uc774\ub825\n\n## \ud83e\udd1d Contributing\n\nRFS Framework\ub294 \uc624\ud508\uc18c\uc2a4 \ud504\ub85c\uc81d\ud2b8\uc785\ub2c8\ub2e4. \uae30\uc5ec\ub97c \ud658\uc601\ud569\ub2c8\ub2e4!\n\n```bash\n# 1. \uc800\uc7a5\uc18c \ud3ec\ud06c\ngit clone https://github.com/interactord/rfs-framework.git\n\n# 2. \uac1c\ubc1c \ud658\uacbd \uc124\uc815\ncd rfs-framework\npip install -e \".[dev]\"\n\n# 3. \ud14c\uc2a4\ud2b8 \uc2e4\ud589\nrfs-cli test --all\n\n# 4. PR \uc0dd\uc131\ngit checkout -b feature/awesome-feature\ngit commit -m \"feat: add awesome feature\"\ngit push origin feature/awesome-feature\n```\n\n### Development Setup\n\n```bash\n# \uac00\uc0c1\ud658\uacbd \uc0dd\uc131\npython -m venv venv\nsource venv/bin/activate # Linux/Mac\n# \ub610\ub294\nvenv\\Scripts\\activate # Windows\n\n# \uac1c\ubc1c\uc6a9 \uc758\uc874\uc131 \uc124\uce58\npip install -e \".[dev,test,docs]\"\n\n# \ud504\ub9ac\ucee4\ubc0b \ud6c5 \uc124\uc815\npre-commit install\n```\n\n## \ud83d\udcca Roadmap\n\n### v4.1 (2025 Q3)\n- \ud83d\udd0c \ud50c\ub7ec\uadf8\uc778 \uc2dc\uc2a4\ud15c\n- \ud83c\udf10 GraphQL \uc9c0\uc6d0\n- \ud83d\udcf1 \ubaa8\ubc14\uc77c SDK\n\n### v4.2 (2025 Q4) \n- \ud83e\udd16 AI/ML \ud1b5\ud569\n- \ud83d\udcca \uace0\uae09 \ubaa8\ub2c8\ud130\ub9c1\n- \ud83d\udd04 \uc790\ub3d9 \uc2a4\ucf00\uc77c\ub9c1 \uac1c\uc120\n\n### v5.0 (2026 Q1)\n- \ud83e\udd80 Rust \ud655\uc7a5\n- \u26a1 \uc131\ub2a5 \ucd5c\uc801\ud654\n- \ud83c\udf0d \ub2e4\uc911 \ud074\ub77c\uc6b0\ub4dc \uc9c0\uc6d0\n\n## \ud83c\udd98 Support\n\n### Community\n- **\ud83d\udcac Discord**: [RFS Community](https://discord.gg/rfs-framework)\n- **\ud83d\udce7 Email**: support@rfs-framework.dev\n- **\ud83d\udc1b Issues**: [GitHub Issues](https://github.com/interactord/rfs-framework/issues)\n- **\ud83d\udcd6 Docs**: [Documentation](https://github.com/interactord/rfs-framework#documentation)\n\n### Enterprise Support\n\uc5d4\ud130\ud504\ub77c\uc774\uc988 \uc9c0\uc6d0\uc774 \ud544\uc694\ud558\uc2dc\uba74 enterprise@rfs-framework.dev\ub85c \uc5f0\ub77d\ud574 \uc8fc\uc138\uc694.\n\n## \ud83d\udcc4 License\n\nMIT License - \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 [LICENSE](./LICENSE) \ud30c\uc77c\uc744 \ucc38\uc870\ud558\uc138\uc694.\n\n---\n\n**Made with \u2764\ufe0f by the RFS Framework Team**\n\n[](https://github.com/interactord/rfs-framework)\n[](https://github.com/interactord/rfs-framework/fork)\n[](https://pypi.org/project/rfs-v4/)",
"bugtrack_url": null,
"license": "MIT",
"summary": "Enterprise-Grade Reactive Functional Serverless Framework for Python",
"version": "4.0.1",
"project_urls": {
"Bug Tracker": "https://github.com/interactord/rfs-framework/issues",
"Changelog": "https://github.com/interactord/rfs-framework/blob/main/CHANGELOG.md",
"Documentation": "https://github.com/interactord/rfs-framework#documentation",
"Homepage": "https://github.com/interactord/rfs-framework",
"Repository": "https://github.com/interactord/rfs-framework"
},
"split_keywords": [
"async",
" cloud-native",
" enterprise",
" framework",
" functional",
" microservices",
" monad",
" optimization",
" production-ready",
" reactive",
" result-pattern",
" security",
" serverless",
" validation"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "e84607cfaae36460c0d3e628cb09ce697a83ccd437aead4ddb876890a247f314",
"md5": "da3a0afe5c9c66352f664aa3ca5e735b",
"sha256": "ee1b4cd79ac6e68bbf4a076b7133b0804e2c0131d351f461c243b326fd8a8b71"
},
"downloads": -1,
"filename": "rfs_v4-4.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "da3a0afe5c9c66352f664aa3ca5e735b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 202815,
"upload_time": "2025-08-23T10:41:44",
"upload_time_iso_8601": "2025-08-23T10:41:44.547220Z",
"url": "https://files.pythonhosted.org/packages/e8/46/07cfaae36460c0d3e628cb09ce697a83ccd437aead4ddb876890a247f314/rfs_v4-4.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2e5c144c45a688d93169b4a637833e9712b97ae4a5e73b8d4987ea51474f209b",
"md5": "d6f210abd59ee6de40ac48bf8aafd1dd",
"sha256": "b8d3ed95323303e6d8967925d52978115ed9571af1fc2149df0caf2371804180"
},
"downloads": -1,
"filename": "rfs_v4-4.0.1.tar.gz",
"has_sig": false,
"md5_digest": "d6f210abd59ee6de40ac48bf8aafd1dd",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 174179,
"upload_time": "2025-08-23T10:41:46",
"upload_time_iso_8601": "2025-08-23T10:41:46.471349Z",
"url": "https://files.pythonhosted.org/packages/2e/5c/144c45a688d93169b4a637833e9712b97ae4a5e73b8d4987ea51474f209b/rfs_v4-4.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-23 10:41:46",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "interactord",
"github_project": "rfs-framework",
"github_not_found": true,
"lcname": "rfs-v4"
}