TypeScriptλ‘ ML μ°κ΅¬λ₯Ό ν λ¨κ³ λ λ°μ μν€μΈμ. μ€ν μΆμ μμ νμ μμ μ±μ μ μ©νκ³ , λ°νμ μ€λ₯λ₯Ό λ°©μ§νλ©°, 볡μ‘ν ML νλ‘μ νΈμμ νμ μ ν¨μ¨ννλ λ°©λ²μ μμ보μΈμ.
TypeScript μ€ν μΆμ : λ¨Έμ λ¬λ μ°κ΅¬μμ νμ μμ μ± ν보νκΈ°
λ¨Έμ λ¬λ μ°κ΅¬μ μΈκ³λ λΉ λ₯Έ νλ‘ν νμ΄ν, 볡μ‘ν λ°μ΄ν° νμ΄νλΌμΈ, λ°λ³΅μ μΈ μ€νμ΄ μλμ μ΄λ©΄μλ μ’ μ’ νΌλμ€λ½κ² λ€μμ¬ μμ΅λλ€. κ·Έ ν΅μ¬μλ PyTorch, TensorFlow, scikit-learnκ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ‘ νμ μ μ΄λλ κ°λ ₯ν μμ§μΈ Python μνκ³κ° μμ΅λλ€. κ·Έλ¬λ μ΄λ¬ν μ μ°μ±μ νΉν μ€νμ μΆμ νκ³ κ΄λ¦¬νλ λ°©μμμ λ―Έλ¬νμ§λ§ μ€μν λ¬Έμ λ€μ μΌκΈ°ν μ μμ΅λλ€. μ°λ¦¬λ λͺ¨λ YAML νμΌμ μ€νλ νμ΄νΌνλΌλ―Έν°, μ«μκ° μλ λ¬Έμμ΄λ‘ κΈ°λ‘λ λ©νΈλ¦, λλ μ¬νμ±μ μ‘°μ©ν λ§κ°λ¨λ¦¬λ κ΅¬μ± λ³κ²½κ³Ό κ°μ κ²½νμ ν΄λ³΄μμ΅λλ€. μ΄λ λ¨μ§ μ¬μν λΆνΈν¨μ΄ μλλΌ, κ³Όνμ  μ격ν¨κ³Ό νλ‘μ νΈ μλμ λν μ€λν μνμ λλ€.
λͺ¨λΈ νλ ¨μ μν Pythonμ κ°λ ₯ν¨μ ν¬κΈ°νμ§ μμΌλ©΄μ, ML μν¬νλ‘μ°μ λ©νλ°μ΄ν° κ³μΈ΅μ κ°λ ₯ν νμ μΈμ΄μ κ·μ¨κ³Ό μμ μ±μ λμ ν μ μλ€λ©΄ μ΄λ¨κΉμ? μ¬κΈ°μ μμμΉ λͺ»ν μμ μ΄ λ±μ₯ν©λλ€: TypeScript. TypeScriptλ‘ μ€ν μ€ν€λ§λ₯Ό μ μν¨μΌλ‘μ¨, κ΅¬μ± μ ν¨μ± κ²μ¬λ₯Ό μννκ³ , IDEλ₯Ό μλ΄νλ©°, Python λ°±μλλΆν° μΉ κΈ°λ° λμ보λκΉμ§ μΌκ΄μ±μ 보μ₯νλ λ¨μΌ μ§μ€ 곡κΈμμ λ§λ€ μ μμ΅λλ€. μ΄ κ²μλ¬Όμ λ°μ΄ν° κ³Όνκ³Ό κ²¬κ³ ν μννΈμ¨μ΄ μμ§λμ΄λ§ κ°μ 격차λ₯Ό ν΄μνλ©°, ML μ€ν μΆμ μμ μλν¬μλ νμ μμ μ±μ λ¬μ±νκΈ° μν μ€μ©μ μΈ νμ΄λΈλ¦¬λ μ κ·Ό λ°©μμ νꡬν©λλ€.
Python μ€μ¬μ ML μΈμκ³Ό νμ μμ μ± μ¬κ°μ§λ
λ¨Έμ λ¬λ μμμμ Pythonμ μ§λ°°λ ₯μ λ Όλμ μ¬μ§κ° μμ΅λλ€. λμ  νμ΄νμ λ²κ·Έκ° μλλΌ κΈ°λ₯μ΄λ©°, μ°κ΅¬μ νμν λΉ λ₯Έ λ°λ³΅κ³Ό νμμ  λΆμμ κ°λ₯νκ² ν©λλ€. κ·Έλ¬λ νλ‘μ νΈκ° λ¨μΌ Jupyter λ ΈνΈλΆμμ νμ μ μΈ λ€μ€ μ€ν μ°κ΅¬ νλ‘κ·Έλ¨μΌλ‘ νμ₯λ¨μ λ°λΌ, μ΄λ¬ν μλμ±μ μ΄λμ΄ λ©΄μ λλ¬λ λλ€.
"λμ λ리 κΈ°λ° κ°λ°"μ μνμ±
ML νλ‘μ νΈμμ νν ν¨ν΄μ μ’ μ’ JSON λλ YAML νμΌμμ λ‘λλλ λμ λ리λ₯Ό μ¬μ©νμ¬ κ΅¬μ±κ³Ό νλΌλ―Έν°λ₯Ό κ΄λ¦¬νλ κ²μ λλ€. μμνκΈ°λ κ°λ¨νμ§λ§, μ΄ μ κ·Ό λ°©μμ μ·¨μ½ν©λλ€:
- μ€ν μ·¨μ½μ±: `learning_rate`μ κ°μ ν€λ₯Ό `learning_rte`λ‘ μλͺ» μ λ ₯ν΄λ μ€λ₯κ° λ°μνμ§ μμ΅λλ€. μ½λλ λ¨μν `None` κ°μ΄λ κΈ°λ³Έκ°μ μ‘μΈμ€νμ¬, μ‘°μ©ν μλͺ»λ νλ ¨μ μ€ννκ³ μ€ν΄μ μμ§κ° μλ κ²°κ³Όλ₯Ό μμ±νκ² λ©λλ€.
 - κ΅¬μ‘°μ  λͺ¨νΈμ±: μ΅ν°λ§μ΄μ  ꡬμ±μ΄ `config['optimizer']` μλμ μλμ μλλ©΄ `config['optim']` μλμ μλμ? νμ΅λ₯ μ μ€μ²©λ ν€μΈκ°μ μλλ©΄ μ΅μμ ν€μΈκ°μ? 곡μμ μΈ μ€ν€λ§ μμ΄λ λͺ¨λ κ°λ°μκ° μΆμΈ‘νκ±°λ μ½λμ λ€λ₯Έ λΆλΆμ κ³μ μ°Έμ‘°ν΄μΌ ν©λλ€.
 - νμ κ°μ  λ³ν λ¬Έμ : `num_layers`κ° μ μ `4`μΈκ°μ μλλ©΄ λ¬Έμμ΄ `"4"`μΈκ°μ? Python μ€ν¬λ¦½νΈκ° μ²λ¦¬ν μλ μμ§λ§, νλ‘ν μ μν΄ μ«μλ₯Ό μμνλ λ€μ΄μ€νΈλ¦Ό μμ€ν μ΄λ νλ‘ νΈμλ λμ보λλ μ΄λ»κ² λ κΉμ? μ΄λ¬ν λΆμΌμΉλ μΌλ ¨μ νμ± μ€λ₯λ₯Ό λ°μμν΅λλ€.
 
μ¬νμ± μκΈ°
κ³Όνμ  μ¬νμ±μ μ°κ΅¬μ μ΄μμ λλ€. MLμμ μ΄λ λμΌν μ½λ, λ°μ΄ν° λ° κ΅¬μ±μ μ¬μ©νμ¬ μ€νμ λ€μ μ€ννμ¬ λμΌν κ²°κ³Όλ₯Ό μ»μ μ μμμ μλ―Έν©λλ€. ꡬμ±μ΄ λμ¨ν ν€-κ° μμ μ§ν©μΈ κ²½μ° μ¬νμ±μ μ ν΄λ©λλ€. κ΅¬μ± κ΅¬μ‘°μ λ―Έλ¬νκ³ λ¬Έμνλμ§ μμ λ³κ²½μ μ΄μ  μ€νμ μ¬ννλ κ²μ λΆκ°λ₯νκ² λ§λ€κ³ , μ¬μ€μ κ³Όκ±° μμ μ 무ν¨νν μ μμ΅λλ€.
νμ λ§μ°°
μλ‘μ΄ μ°κ΅¬μμ΄ νλ‘μ νΈμ μ°Έμ¬ν λ, κ·Έλ€μ μ€ν ꡬμ±μ μμ ꡬ쑰λ₯Ό μ΄λ»κ² λ°°μ°λμ? κ·Έλ€μ μ’ μ’ μ½λλ² μ΄μ€μμ μ΄λ₯Ό μμ€κ³ν΄μΌ ν©λλ€. μ΄λ μ¨λ³΄λ©μ λ¦μΆκ³ μ€λ₯ λ°μ κ°λ₯μ±μ λμ λλ€. μ ν¨ν μ€νμ ꡬμ±νλ μμμ λν 곡μμ μ΄κ³ λͺ μμ μΈ κ³μ½μ ν¨κ³Όμ μΈ νμν¬μ νμμ μ λλ€.
μ TypeScriptμΈκ°? ML μ€μΌμ€νΈλ μ΄μ μ μν λΉμ ν΅μ μΈ μμ
μΌν 보면, ML λ¬Έμ μ JavaScriptμ μμ μ§ν©μ μ μνλ κ²μ μ§κ΄μ μ΄κΈλ 보μ λλ€. μ°λ¦¬λ μμΉ κ³μ°μ μν΄ Pythonμ λ체νλ €λ κ²μ΄ μλλλ€. λμ , TypeScriptκ° κ°μ₯ μνλ μΌμΈ λ°μ΄ν° ꡬ쑰 μ μ λ° κ°μ λ₯Ό μν΄ TypeScriptλ₯Ό μ¬μ©νκ³ μμ΅λλ€. ML μ€νμ "μ μ΄ μμ", μ¦ κ΅¬μ±, λ©νλ°μ΄ν° λ° μΆμ μ κ·Όλ³Έμ μΌλ‘ λ°μ΄ν° κ΄λ¦¬ λ¬Έμ μ΄λ©°, TypeScriptλ μ΄λ₯Ό ν΄κ²°νλ λ° νμνκ² μ ν©ν©λλ€.
μΈν°νμ΄μ€μ νμ μΌλ‘ κ²¬κ³ ν κ³μ½ μ μνκΈ°
TypeScriptλ₯Ό μ¬μ©νλ©΄ λ°μ΄ν°μ λν λͺ μμ μΈ ννλ₯Ό μ μν μ μμ΅λλ€. λͺ¨λ μ€ν ꡬμ±μ΄ μ€μν΄μΌ νλ κ³μ½μ λ§λ€ μ μμ΅λλ€. μ΄λ λ¨μν λ¬Έμκ° μλλΌ, κΈ°κ³κ° κ²μ¦ν μ μλ μ¬μμ λλ€.
λ€μ κ°λ¨ν μμλ₯Ό μ΄ν΄λ³΄μΈμ:
            // In a shared types.ts file
export type OptimizerType = 'adam' | 'sgd' | 'rmsprop';
export interface OptimizerConfig {
  type: OptimizerType;
  learning_rate: number;
  beta1?: number; // Optional property
  beta2?: number; // Optional property
}
export interface DatasetConfig {
  name: string;
  path: string;
  batch_size: number;
  shuffle: boolean;
}
export interface ExperimentConfig {
  id: string;
  description: string;
  model_name: 'ResNet' | 'ViT' | 'BERT';
  dataset: DatasetConfig;
  optimizer: OptimizerConfig;
  epochs: number;
}
            
          
        μ΄ μ½λ λΈλ‘μ μ΄μ  μ ν¨ν μ€νμ΄ λ¬΄μμΈμ§λ₯Ό λνλ΄λ λ¨μΌ μ§μ€ 곡κΈμμ λλ€. λͺ ννκ³ μ½κΈ° μ¬μ°λ©° λͺ¨νΈν¨μ΄ μμ΅λλ€.
λ¨ νλμ GPU μ¬μ΄ν΄λ λλΉνκΈ° μ μ μ€λ₯ ν¬μ°©νκΈ°
μ΄ μ κ·Ό λ°©μμ μ£Όμ μ΄μ μ λ°νμ μ΄μ  μ ν¨μ± κ²μ¬μ λλ€. TypeScriptλ₯Ό μ¬μ©νλ©΄ IDE (VS Codeμ κ°μ)μ TypeScript μ»΄νμΌλ¬κ° 첫 λ²μ§Έ λ°©μ΄μ μ΄ λ©λλ€. μ€ν€λ§λ₯Ό μλ°νλ κ΅¬μ± κ°μ²΄λ₯Ό μμ±νλ €κ³ νλ©΄ μ¦μ μ€λ₯κ° λ°μν©λλ€:
            // This would show a red squiggly line in your IDE!
const myConfig: ExperimentConfig = {
  // ... other properties
  optimizer: {
    type: 'adam',
    learning_rte: 0.001 // ERROR: Property 'learning_rte' does not exist.
  }
}
            
          
        μ΄ κ°λ¨ν νΌλλ°± 루νλ κ΅¬μ± νμΌμ μ¬μν μ€νλ‘ μΈν΄ μ€ν¨ν μ€νμ λλ²κΉ νλ λ° λλ μλ§μ μκ°μ μ μ½ν΄ μ€λλ€.
νλ‘ νΈμλμμ κ°κ·Ή μ°κ²°νκΈ°
MLOps νλ«νΌκ³Ό μ€ν μΆμ κΈ°λ μ μ  λ μΉ κΈ°λ°μΌλ‘ λ°μ νκ³ μμ΅λλ€. Weights & Biases, MLflow λ° λ§μΆ€ν λμ보λμ κ°μ λꡬλ λͺ¨λ μΉ μΈν°νμ΄μ€λ₯Ό κ°μΆκ³ μμ΅λλ€. λ°λ‘ μ¬κΈ°μ TypeScriptκ° λΉμ λ°ν©λλ€. Python ꡬμ±μ κ²μ¦νλ λ° μ¬μ©λ λμΌν `ExperimentConfig` νμ μ React, Vue λλ Svelte νλ‘ νΈμλλ‘ μ§μ  κ°μ Έμ¬ μ μμ΅λλ€. μ΄λ νλ‘ νΈμλμ λ°±μλκ° λ°μ΄ν° ꡬ쑰μ κ΄ν΄ νμ λκΈ°νλμ΄ μμμ 보μ₯νμ¬, λ°©λν ν΅ν© λ²κ·Έ μ νμ μ κ±°ν©λλ€.
μ€μ©μ μΈ νλ μμν¬: νμ΄λΈλ¦¬λ TypeScript-Python μ κ·Ό λ°©μ
λ μνκ³μ κ°μ μ νμ©νλ ꡬ체μ μΈ μν€ν μ²λ₯Ό μ μν΄ λ³΄κ² μ΅λλ€. λͺ©νλ TypeScriptλ‘ μ€ν€λ§λ₯Ό μ μνκ³ μ΄λ₯Ό μ¬μ©νμ¬ μ 체 ML μν¬νλ‘μ°μμ νμ μμ μ±μ μ μ©νλ κ²μ λλ€.
μν¬νλ‘μ°λ λ€μ λ€μ― κ°μ§ μ£Όμ λ¨κ³λ‘ ꡬμ±λ©λλ€:
- TypeScript "λ¨μΌ μ§μ€ 곡κΈμ": λͺ¨λ μ€ν κ΄λ ¨ νμ κ³Ό μΈν°νμ΄μ€κ° μ μλλ μ€μμ λ²μ  κ΄λ¦¬λλ ν¨ν€μ§.
 - μ€ν€λ§ μμ±: TypeScript νμ μΌλ‘λΆν° Python νΈν νν(Pydantic λͺ¨λΈ λλ JSON μ€ν€λ§ λ±)μ μλμΌλ‘ μμ±νλ λΉλ λ¨κ³.
 - Python μ€ν μ€νκΈ°: κ΅¬μ± νμΌ(μ: YAML)μ λ‘λνκ³ νλ ¨ νλ‘μΈμ€ μμ μ μ μμ±λ μ€ν€λ§μ λν΄ μ ν¨μ±μ κ²μ¬νλ Pythonμ ν΅μ¬ νλ ¨ μ€ν¬λ¦½νΈ.
 - νμ μμ  λ‘κΉ API: λ©νΈλ¦ λ° μν°ν©νΈλ₯Ό μμ νλ λ°±μλ μλΉμ€(Python/FastAPI λλ Node.js/ExpressμΌ μ μμ). μ΄ APIλ λμΌν μ€ν€λ§λ₯Ό μ¬μ©νμ¬ λͺ¨λ λ€μ΄μ€λ λ°μ΄ν°μ μ ν¨μ±μ κ²μ¬ν©λλ€.
 - νλ‘ νΈμλ λμ보λ: TypeScript νμ μ κΈ°λ³Έμ μΌλ‘ μ¬μ©νμ¬ μΆμΈ‘ μμ΄ μ€ν λ°μ΄ν°λ₯Ό νμ€νκ² νμνλ μΉ μ ν리μΌμ΄μ .
 
λ¨κ³λ³ ꡬν μμ
μ΄λ₯Ό μ€μ νλ λ°©λ²μ λν λ μμΈν μμλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
1λ¨κ³: TypeScriptμμ μ€ν€λ§ μ μνκΈ°
νλ‘μ νΈ λ΄μ `packages/schemas` λλ ν 리λ₯Ό λ§λ€κ³ κ·Έ μμ `experiment.types.ts`λΌλ νμΌμ μμ±νμΈμ. μ¬κΈ°μ λΉμ μ νμ€ μ μλ€μ΄ μμΉνκ² λ©λλ€.
            // packages/schemas/experiment.types.ts
export interface Metrics {
  epoch: number;
  timestamp: string;
  values: {
    [metricName: string]: number;
  };
}
export interface Hyperparameters {
  learning_rate: number;
  batch_size: number;
  dropout_rate: number;
  optimizer: 'adam' | 'sgd';
}
export interface Experiment {
  id: string;
  project_name: string;
  start_time: string;
  status: 'running' | 'completed' | 'failed';
  params: Hyperparameters;
  metrics: Metrics[];
}
            
          
        2λ¨κ³: Python νΈν λͺ¨λΈ μμ±νκΈ°
ν΅μ¬μ Pythonκ³Ό TypeScriptλ₯Ό λκΈ°ν μνλ‘ μ μ§νλ λ° μμ΅λλ€. μ°λ¦¬λ λ¨Όμ  TypeScript νμ μ JSON μ€ν€λ§μ κ°μ μ€κ° νμμΌλ‘ λ³νν λ€μ, ν΄λΉ μ€ν€λ§λ‘λΆν° Python Pydantic λͺ¨λΈμ μμ±ν¨μΌλ‘μ¨ μ΄λ₯Ό μνν μ μμ΅λλ€.
`typescript-json-schema`μ κ°μ λκ΅¬κ° μ²« λ²μ§Έ λΆλΆμ μ²λ¦¬ν μ μμ΅λλ€. `package.json`μ μ€ν¬λ¦½νΈλ₯Ό μΆκ°ν μ μμ΅λλ€:
            "scripts": {
  "build:schema": "typescript-json-schema ./packages/schemas/experiment.types.ts Experiment --out ./schemas/experiment.schema.json"
}
            
          
        μ΄κ²μ νμ€ `experiment.schema.json` νμΌμ μμ±ν©λλ€. λ€μμΌλ‘, μ°λ¦¬λ `json-schema-to-pydantic`μ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ μ΄ JSON μ€ν€λ§λ₯Ό Python νμΌλ‘ λ³νν©λλ€.
            # In your terminal
json-schema-to-pydantic ./schemas/experiment.schema.json > ./my_ml_project/schemas.py
            
          
        μ΄κ²μ λ€μκ³Ό κ°μ `schemas.py` νμΌμ μμ±ν©λλ€:
            # my_ml_project/schemas.py (auto-generated)
from pydantic import BaseModel, Field
from typing import List, Dict, Literal
class Hyperparameters(BaseModel):
    learning_rate: float
    batch_size: int
    dropout_rate: float
    optimizer: Literal['adam', 'sgd']
class Metrics(BaseModel):
    epoch: int
    timestamp: str
    values: Dict[str, float]
class Experiment(BaseModel):
    id: str
    project_name: str
    start_time: str
    status: Literal['running', 'completed', 'failed']
    params: Hyperparameters
    metrics: List[Metrics]
            
          
        3λ¨κ³: Python νλ ¨ μ€ν¬λ¦½νΈμ ν΅ν©νκΈ°
μ΄μ  μ£Ό Python νλ ¨ μ€ν¬λ¦½νΈλ μ΄ Pydantic λͺ¨λΈμ μ¬μ©νμ¬ κ΅¬μ±μ μμ μκ² λ‘λνκ³ μ ν¨μ±μ κ²μ¬ν μ μμ΅λλ€. Pydanticμ μλμΌλ‘ ꡬ문 λΆμνκ³ , νμ κ²μ¬λ₯Ό μννλ©°, λͺ¨λ μ€λ₯λ₯Ό λ³΄κ³ ν©λλ€.
            # my_ml_project/train.py
import yaml
from schemas import Hyperparameters # Import the generated model
def main(config_path: str):
    with open(config_path, 'r') as f:
        raw_config = yaml.safe_load(f)
    
    try:
        # Pydantic handles validation and type casting!
        params = Hyperparameters(**raw_config['params'])
    except Exception as e:
        print(f"Invalid configuration: {e}")
        return
    print(f"Successfully validated config! Starting training with learning rate: {params.learning_rate}")
    # ... rest of your training logic ...
    # model = build_model(params)
    # train(model, params)
if __name__ == "__main__":
    main('configs/experiment-01.yaml')
            
          
        λ§μ½ `configs/experiment-01.yaml`μ μ€νλ μλͺ»λ λ°μ΄ν° νμ μ΄ μλ€λ©΄, Pydanticμ μ¦μ `ValidationError`λ₯Ό λ°μμμΌ λΉμ©μ΄ λ§μ΄ λλ μ€ν¨ν μ€νμΌλ‘λΆν° λΉμ μ ꡬν΄μ€ κ²μ λλ€.
4λ¨κ³: νμ μμ  APIλ‘ κ²°κ³Ό λ‘κΉ νκΈ°
μ€ν¬λ¦½νΈκ° λ©νΈλ¦μ λ‘κΉ ν λ, μ΄λ₯Ό μΆμ  μλ²λ‘ 보λ λλ€. μ΄ μλ² λν μ€ν€λ§λ₯Ό κ°μ ν΄μΌ ν©λλ€. FastAPI (Python) λλ Express (Node.js/TypeScript)μ κ°μ νλ μμν¬λ‘ μΆμ  μλ²λ₯Ό ꡬμΆνλ€λ©΄, μ€ν€λ§λ₯Ό μ¬μ¬μ©ν μ μμ΅λλ€.
TypeScriptλ‘ μμ±λ Express μλν¬μΈνΈλ λ€μκ³Ό κ°μ΅λλ€:
            // tracking-server/src/routes.ts
import { Request, Response } from 'express';
import { Metrics, Experiment } from '@my-org/schemas'; // Import from shared package
app.post('/log_metrics', (req: Request, res: Response) => {
  const metrics: Metrics = req.body; 
  
  // We know for sure that metrics.epoch is a number
  // and metrics.values is a dictionary of strings to numbers.
  console.log(`Received metrics for epoch ${metrics.epoch}`);
  
  // ... save to database ...
  res.status(200).send({ status: 'ok' });
});
            
          
        5λ¨κ³: νμ μμ  νλ‘ νΈμλμμ μκ°ννκΈ°
μ¬κΈ°μ λͺ¨λ κ³Όμ μ΄ μλ¦λ΅κ² λ§λ¬΄λ¦¬λ©λλ€. Reactλ‘ κ΅¬μΆλμμ κ°λ₯μ±μ΄ μλ μΉ λμ보λλ λμΌν 곡μ `packages/schemas` λλ ν 리μμ TypeScript νμ μ μ§μ  κ°μ Έμ¬ μ μμ΅λλ€.
            // dashboard-ui/src/components/ExperimentTable.tsx
import React, { useState, useEffect } from 'react';
import { Experiment } from '@my-org/schemas'; // NATIVE IMPORT!
const ExperimentTable: React.FC = () => {
  const [experiments, setExperiments] = useState([]);
  useEffect(() => {
    // fetch data from the tracking server
    fetch('/api/experiments')
      .then(res => res.json())
      .then((data: Experiment[]) => setExperiments(data));
  }, []);
  return (
    
      {/* ... table headers ... */}
      
        {experiments.map(exp => (
          
            {exp.project_name} 
            {exp.params.learning_rate}  {/* Autocomplete knows .learning_rate exists! */}
            {exp.status} 
           
        ))}
      
    
  );
} 
            
          
        λͺ¨νΈν¨μ΄ μμ΅λλ€. νλ‘ νΈμλ μ½λλ `Experiment` κ°μ²΄κ° μ΄λ€ ννλ₯Ό κ°λμ§ μ νν μκ³ μμ΅λλ€. μ€ν€λ§ ν¨ν€μ§μ `Experiment` νμ μ μ νλλ₯Ό μΆκ°νλ©΄ TypeScriptλ μ λ°μ΄νΈκ° νμν UIμ λͺ¨λ λΆλΆμ μ¦μ νμν κ²μ λλ€. μ΄κ²μ μμ²λ μμ°μ± ν₯μκ³Ό λ²κ·Έ λ°©μ§ λ©μ»€λμ¦μ λλ€.
μ μ¬μ  μ°λ € λ° λ°λ‘ λ€λ£¨κΈ°
"μ΄κ²μ κ³Όμ μμ§λμ΄λ§ μλκ°μ?"
μ£Όλ§ νλ‘μ νΈλ₯Ό νλ λ¨λ μ°κ΅¬μμκ²λ κ·Έλ΄ μλ μμ΅λλ€. κ·Έλ¬λ νμ΄ μ°Έμ¬νκ³ μ₯κΈ°μ μΈ μ μ§λ³΄μ λλ νλ‘λμ μΌλ‘μ κ²½λ‘κ° μλ λͺ¨λ νλ‘μ νΈμμλ μ΄λ¬ν μμ€μ μ격ν¨μ κ³Όμ μμ§λμ΄λ§μ΄ μλλΌ μ λ¬Έμ μΈ μννΈμ¨μ΄ κ°λ°μ λλ€. μ΄κΈ° μ€μ  λΉμ©μ μ¬μν κ΅¬μ± μ€λ₯λ₯Ό λλ²κΉ νλ λ° λλ μκ° μ μ½κ³Ό κ²°κ³Όμ λν μ λ’°λ ν₯μμΌλ‘ λΉ λ₯΄κ² μμλ©λλ€.
"Pydanticκ³Ό Python νμ ννΈλ§ μ¬μ©νλ©΄ μ λλμ?"
Pydanticμ κ²½μ΄λ‘μ΄ λΌμ΄λΈλ¬λ¦¬μ΄λ©° μ μλ μν€ν μ²μ μ€μν λΆλΆμ λλ€. νμ§λ§ Pydanticλ§ μ¬μ©νλ κ²μ λ¬Έμ μ μ λ°λ§ ν΄κ²°ν©λλ€. Python μ½λλ νμ μμ μ±μ΄ ν보λμ§λ§, μΉ λμ보λλ μ¬μ ν API μλ΅μ ꡬ쑰λ₯Ό μΆμΈ‘ν΄μΌ ν©λλ€. μ΄λ νλ‘ νΈμλμ λ°μ΄ν° μ΄ν΄λκ° λ°±μλμ λκΈ°νλμ§ μλ μ€ν€λ§ λ리ννΈλ‘ μ΄μ΄μ§λλ€. TypeScriptλ₯Ό νμ€ μ§μ€ 곡κΈμμΌλ‘ λ§λ¦μΌλ‘μ¨, μ°λ¦¬λ Python λ°±μλ(μ½λ μμ±μ ν΅ν΄)μ JavaScript/TypeScript νλ‘ νΈμλ(λ€μ΄ν°λΈ κ°μ Έμ€κΈ°λ₯Ό ν΅ν΄) λͺ¨λκ° μλ²½νκ² μ λ ¬λλλ‘ λ³΄μ₯ν©λλ€.
"μ ν¬ νμ TypeScriptλ₯Ό λͺ¨λ¦ λλ€."
μ΄ μν¬νλ‘μ°μ νμν TypeScript λΆλΆμ μ£Όλ‘ νμ κ³Ό μΈν°νμ΄μ€λ₯Ό μ μνλ κ²μ λλ€. μ΄λ λλΆλΆμ Python κ°λ°μλ₯Ό ν¬ν¨νμ¬ κ°μ²΄ μ§ν₯ λλ C-μ€νμΌ μΈμ΄μ μ΅μν μ¬λλ€μκ² λ§€μ° μλ§ν νμ΅ κ³‘μ μ κ°μ§λλ€. μ 체μ μΈ λ²κ·Έ μ νμ μ κ±°νκ³ λ¬Έμλ₯Ό κ°μ νλ κ°μΉ μ μμ μ΄ κΈ°μ μ λ°°μ°λ λ° μ½κ°μ μκ°μ ν¬μν λ§ν μ€λλ ₯ μλ μ΄μ κ° λ©λλ€.
λ―Έλ: λ ν΅ν©λ MLOps μ€ν
μ΄ νμ΄λΈλ¦¬λ μ κ·Ό λ°©μμ MLOps μ€νμ κ° λΆλΆμ κ°μ₯ μ ν©ν λꡬλ₯Ό μ ννκ³ , κ°λ ₯ν κ³μ½μ ν΅ν΄ μ΄λ€μ΄ μννκ² ν¨κ» μλνλλ‘ λ³΄μ₯νλ λ―Έλλ₯Ό ν₯νκ³ μμ΅λλ€. Pythonμ λͺ¨λΈλ§ λ° μμΉ κ³μ° λΆμΌμμ κ³μν΄μ μ§λ°°μ μΈ μν μ ν κ²μ λλ€. ννΈ, TypeScriptλ κ²¬κ³ ν μ ν리μΌμ΄μ , API λ° μ¬μ©μ μΈν°νμ΄μ€λ₯Ό ꡬμΆνκΈ° μν μΈμ΄λ‘ κ·Έ μν μ νκ³ ν νκ³ μμ΅λλ€.
TypeScriptλ₯Ό μμ€ν μ ν΅ν΄ νλ₯΄λ λ°μ΄ν° κ³μ½μ μ μμ, μ¦ μ μ°©μ  μν λ‘ μ¬μ©ν¨μΌλ‘μ¨ μ°λ¦¬λ νλ μννΈμ¨μ΄ μμ§λμ΄λ§μ ν΅μ¬ μμΉμΈ κ³μ½μ μν μ€κ³λ₯Ό μ±νν©λλ€. μ°λ¦¬μ μ€ν μ€ν€λ§λ κ°λ°μ κ°μννκ³ μ€λ₯λ₯Ό λ°©μ§νλ©° κΆκ·Ήμ μΌλ‘ μ°κ΅¬μ μ λ’°μ±κ³Ό μ¬νμ±μ ν₯μμν€λ μ΄μμλ, κΈ°κ³ κ²μ¦ κ°λ₯ν ννμ λ¬Έμκ° λ©λλ€.
κ²°λ‘ : νΌλ μμμ μμ κ°μ μ°ΎμΌμΈμ
ML μ°κ΅¬μ νΌλμ κ·Έ μ°½μμ μΈ νμ μΌλΆμ λλ€. κ·Έλ¬λ κ·Έ νΌλμ μλ‘μ΄ μν€ν μ²μ μμ΄λμ΄λ₯Ό μ€ννλ λ° μ§μ€λμ΄μΌ νλ©°, YAML νμΌμ μ€νλ₯Ό λλ²κΉ νλ λ° μ¬μ©λμ΄μλ μ λ©λλ€. μ€ν μΆμ μ μν μ€ν€λ§ λ° κ³μ½ κ³μΈ΅μΌλ‘ TypeScriptλ₯Ό λμ ν¨μΌλ‘μ¨, μ°λ¦¬λ λͺ¨λΈμ λλ¬μΌ λ©νλ°μ΄ν°μ μ§μμ μμ μ±μ κ°μ Έμ¬ μ μμ΅λλ€.
ν΅μ¬ μμ μ λΆλͺ ν©λλ€:
- λ¨μΌ μ§μ€ 곡κΈμ: TypeScriptμμ μ€ν€λ§λ₯Ό μ μνλ©΄ μ€ν λ°μ΄ν° ꡬ쑰μ λν νλμ νμ€μ μ΄κ³ λ²μ  κ΄λ¦¬λλ μ μλ₯Ό μ 곡ν©λλ€.
 - μλν¬μλ νμ μμ μ±: μ΄ μ κ·Ό λ°©μμ ꡬμ±μ μμ§νλ Python μ€ν¬λ¦½νΈλΆν° κ²°κ³Όλ₯Ό νμνλ React λμ보λκΉμ§ μ 체 μν¬νλ‘μ°λ₯Ό 보νΈν©λλ€.
 - ν₯μλ νμ : λͺ μμ μΈ μ€ν€λ§λ μλ²½ν λ¬Έμ μν μ νμ¬ νμλ€μ΄ μμ κ°μ κ°μ§κ³ κΈ°μ¬νκΈ° μ½κ² λ§λλλ€.
 - λ μ μ λ²κ·Έ, λ λΉ λ₯Έ λ°λ³΅: λ°νμ λμ "μ»΄νμΌ μκ°"μ μ€λ₯λ₯Ό ν¬μ°©ν¨μΌλ‘μ¨ κ·μ€ν μ»΄ν¨ν μμκ³Ό κ°λ°μ μκ°μ μ μ½ν μ μμ΅λλ€.
 
νλ£»λ°€ μ¬μ΄μ μ 체 μμ€ν μ λ€μ μμ±ν νμλ μμ΅λλ€. μκ² μμνμΈμ. λ€μ νλ‘μ νΈμμλ νμ΄νΌνλΌλ―Έν° μ€ν€λ§λ§ TypeScriptλ‘ μ μν΄ λ³΄μΈμ. Pydantic λͺ¨λΈμ μμ±νκ³ IDEμ μ½λ μ ν¨μ± κ²μ¬κΈ°κ° λΉμ μ μν΄ μλνλ λλμ κ²½νν΄ λ³΄μΈμ. μ΄λ¬ν μμ ꡬ쑰νκ° λ¨Έμ λ¬λ μ°κ΅¬μ μλ‘μ΄ μμ€μ μμ κ°κ³Ό μλλ₯Ό κ°μ Έλ€μ€ μ μμμ λ°κ²¬ν μ§λ λͺ¨λ¦ λλ€.