Oxy Custom 프로젝트 개요 분석
Oxy는 Rust로 작성된 오픈 소스 agentic analytics 프레임워크입니다. 이 프로젝트는 AI 기반 데이터 분석에 소프트웨어 개발 생명주기 원칙을 적용하여, 에이전트 생성부터 프롬프트 테스팅, 프로덕션 배포까지의 구조화된 워크플로우를 제공합니다.
1. 프로젝트 구조 개요
1.1 핵심 디렉토리 구성
oxy-cust/
├── crates/ # Rust 크레이트 구조
│ ├── core/ # 핵심 애플리케이션 로직
│ ├── entity/ # 데이터 엔터티 정의
│ ├── migration/ # 데이터베이스 마이그레이션
│ └── py/ # Python 바인딩
├── web-app/ # 웹 애플리케이션 프론트엔드
├── docs/ # 프로젝트 문서
├── examples/ # 사용 예제
├── json-schemas/ # JSON 스키마 정의
├── oss/ # 오픈 소스 관련 파일
├── sample_project/ # 샘플 프로젝트
├── docker-compose.yml # Docker 구성
├── Dockerfile # 컨테이너 이미지 빌드
└── Cargo.toml # Rust 워크스페이스 설정
1.2 프로젝트 특징
## The framework for agentic analytics
Oxy is an open-source framework for agentic analytics. It is declarative by design and written in Rust.
Oxy is built with the following product principles in mind:
- open-source
- performant
- code-native
- declarative
- composable
- secure
핵심 설계 원칙:
- 오픈 소스: Apache-2.0 라이센스 하에 완전 공개
- 고성능: Rust의 메모리 안전성과 성능 활용
- 코드 네이티브: 선언적 설정을 통한 코드 중심 접근
- 조합 가능: 모듈식 아키텍처로 유연한 확장
- 보안: Rust의 안전성 보장과 보안 설계
2. Cargo 워크스페이스 구조 분석
2.1 워크스페이스 설정
[workspace]
members = ["crates/core", "crates/entity", "crates/migration", "crates/py"]
default-members = ["crates/core"]
resolver = "2"
[workspace.dependencies]
tokio = { version = "1.45", features = ["full"] }
sea-orm = { version = "1.1.11", features = [
"sqlx-sqlite",
"sqlx-postgres",
"runtime-tokio-rustls",
"macros",
] }
sea-orm-migration = { version = "1.1.11", features = [
"sqlx-sqlite",
"sqlx-postgres",
"runtime-tokio-rustls",
] }
log = { version = "0.4" }
워크스페이스 특징:
- 모듈화: 기능별로 분리된 크레이트 구조
- 의존성 공유: 워크스페이스 레벨에서 공통 의존성 관리
- 비동기 처리: Tokio 기반 완전 비동기 런타임
- 데이터베이스: Sea-ORM을 통한 SQLite/PostgreSQL 지원
2.2 핵심 의존성 분석
# 핵심 애플리케이션 의존성
anyhow = "1.0.98" # 에러 처리
axum = { version = "0.8.4", features = ["macros"] } # 웹 프레임워크
clap = { version = "4.5.38", features = ["derive"] } # CLI 파싱
async-openai = {version = "0.28.1", features = ["byot"]} # OpenAI API
duckdb = { version = "=1.1.1", features = ["bundled"] } # 임베디드 분석 DB
의존성 카테고리:
비동기 및 웹 서비스
- Tokio: 비동기 런타임 및 I/O
- Axum: 현대적 웹 프레임워크
- Tower: 미들웨어 및 서비스 추상화
데이터 처리
- DuckDB: 고성능 분석 데이터베이스 엔진
- Arrow: 컬럼형 메모리 포맷
- ConnectorX: 다양한 데이터베이스 연결
AI 및 ML
- async-openai: OpenAI API 클라이언트
- LanceDB: 벡터 데이터베이스
- PyO3: Python 상호 운용성
CLI 및 사용자 인터페이스
- Clap: 명령행 인터페이스 파싱
- Colored: 컬러 터미널 출력
- Tabled: 테이블 형식 출력
3. 핵심 모듈 아키텍처
3.1 Core 크레이트 구조
// src/lib.rs
mod adapters; // 데이터 소스 어댑터
mod agent; // 에이전트 시스템
pub mod api; // REST API 서버
pub mod cli; // CLI 인터페이스
pub mod config; // 설정 관리
pub mod db; // 데이터베이스 클라이언트
pub mod errors; // 에러 타입 정의
mod eval; // 평가 시스템
pub mod execute; // SQL 실행 엔진
pub mod mcp; // Model Context Protocol
pub mod semantic; // 시맨틱 검색
pub mod service; // 비즈니스 서비스
pub mod theme; // UI 테마
mod tools; // 유틸리티 도구
pub mod utils; // 공통 유틸리티
pub mod workflow; // 워크플로우 엔진
3.2 애플리케이션 진입점
// src/main.rs
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Rustls 암호화 프로바이더 설정
rustls::crypto::aws_lc_rs::default_provider()
.install_default()
.expect("Failed to install rustls crypto provider");
// 패닉 핸들러 설정
setup_panic!(Metadata::new(env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"))
.authors("Robert Yi <robert@oxy.tech>")
.homepage("github.com/oxy-hq/oxy")
.support("- For support, please email robert@oxy.tech")
);
dotenv().ok();
// 로깅 시스템 초기화
let args: Vec<String> = env::args().collect();
let log_to_stdout = args.iter().any(|a| a == "serve");
init_tracing_logging(log_to_stdout);
// CLI 실행
match cli().await {
Ok(_) => {}
Err(e) => {
tracing::error!(error = %e, "Application error");
eprintln!("{}", format!("{}", e).error());
exit(1)
}
};
Ok(())
}
진입점 특징:
- 비동기 메인: Tokio 런타임에서 전체 애플리케이션 실행
- 암호화 설정: AWS LC RS 프로바이더로 TLS 보안
- 패닉 처리: 사용자 친화적 에러 메시지
- 구조화된 로깅: Tracing 기반 로그 시스템
4. 개발 환경 및 도구 체인
4.1 Rust 설정
[workspace.package]
edition = "2024"
rust-version = "1.86.0"
publish = false
description = "Oxy"
authors = ["oxy engineers"]
documentation = "https://docs.oxy.tech"
exclude = ["examples/", "tests/"]
Rust 버전 정책:
- Rust 2024 에디션: 최신 언어 기능 활용
- 최소 버전: 1.86.0으로 최신 안정성 확보
- 비공개: 워크스페이스 레벨에서 crates.io 발행 비활성화
4.2 개발 도구 구성
// package.json
{
"scripts": {
"lint": "eslint . --fix",
"format": "prettier --write .",
"type-check": "tsc --noEmit"
},
"devDependencies": {
"@commitlint/cli": "^18.0.0",
"@commitlint/config-conventional": "^18.0.0",
"eslint": "^8.50.0",
"prettier": "^3.0.3"
}
}
4.3 품질 관리 도구
# .github/workflows 구조
.husky/ # Git 훅 관리
.lintstagedrc.js # 스테이지된 파일 린트
commitlint.config.js # 커밋 메시지 규칙
eslint.config.js # JavaScript 린트 설정
.prettierrc.js # 코드 포맷팅 규칙
rustfmt.toml # Rust 포맷팅 설정
typos.toml # 오타 검사 설정
품질 보증:
- Husky: Git 커밋/푸시 훅으로 자동 검사
- Commitlint: 컨벤셔널 커밋 규칙 강제
- ESLint/Prettier: JavaScript/TypeScript 코드 품질
- Rustfmt: Rust 코드 스타일 통일
- Typos: 문서 및 코드 오타 검사
5. 컨테이너 및 배포 전략
5.1 Docker 멀티 스테이지 빌드
# Dockerfile (추정 구조)
FROM rust:1.86-alpine AS builder
WORKDIR /app
COPY . .
RUN cargo build --release --workspace
FROM alpine:latest
RUN apk add --no-cache ca-certificates
COPY --from=builder /app/target/release/oxy /usr/local/bin/
EXPOSE 8080
CMD ["oxy", "serve"]
5.2 Docker Compose 서비스
# docker-compose.yml
version: '3.8'
services:
oxy:
build: .
ports:
- "8080:8080"
environment:
- DATABASE_URL=sqlite:///data/oxy.db
volumes:
- ./data:/data
6. 설치 및 배포 자동화
6.1 크로스 플랫폼 설치
# 메인 설치 스크립트 (Linux/macOS/WSL)
bash <(curl --proto '=https' --tlsv1.2 -LsSf https://get.oxy.tech)
# Homebrew (macOS)
brew install oxy-hq/oxy/oxy
# 특정 버전 설치
OXY_VERSION="0.1.0" bash <(curl --proto '=https' --tlsv1.2 -sSf \
https://raw.githubusercontent.com/oxy-hq/oxy/refs/heads/main/install_oxy.sh)
6.2 릴리즈 관리
// release-please-config.json
{
"packages": {
".": {
"release-type": "rust",
"package-name": "oxy"
}
}
}
릴리즈 자동화:
- Release Please: 자동 버전 관리 및 체인지로그
- Self Update: 애플리케이션 내장 업데이트 기능
- 크로스 플랫폼: Linux, macOS, Windows 지원
7. 보안 및 컴플라이언스
7.1 보안 스캔
# .deepsource.toml
version = 1
analyzers = [
{ name = "rust", enabled = true },
{ name = "docker", enabled = true },
{ name = "secrets", enabled = true }
]
7.2 라이센스 관리
# .whitesource
{
"scanSettings": {
"baseBranches": ["main"]
},
"checkRunSettings": {
"vulnerableCheckRunConclusionLevel": "failure"
}
}
8. 모니터링 및 관찰성
8.1 구조화된 로깅
// 트레이싱 로깅 초기화
fn init_tracing_logging(log_to_stdout: bool) {
let env_filter = EnvFilter::try_from_default_env()
.unwrap_or_else(|_| EnvFilter::new("info"))
.add_directive("oxy=debug".parse().unwrap())
.add_directive("tower_http=debug".parse().unwrap());
let log_file_path = std::path::Path::new(&client::get_state_dir()).join("oxy.log");
// 파일 또는 stdout으로 로그 출력
}
로깅 전략:
- Tracing: 구조화된 로깅 및 분산 추적
- 환경별 설정: 개발/프로덕션 환경에 따른 로그 레벨
- JSON 출력: 프로덕션에서 기계 가독 형식
- 파일 로테이션: 로그 파일 자동 관리
9. 결론
Oxy는 현대적인 Rust 개발 패턴을 충실히 따르는 고품질 agentic analytics 프레임워크입니다:
9.1 주요 강점
- 현대적 아키텍처: 비동기 처리와 모듈화 설계
- 타입 안전성: Rust의 컴파일 타임 보장
- 성능 최적화: Zero-cost abstractions와 메모리 안전성
- 개발자 경험: 풍부한 CLI와 자동화된 도구 체인
9.2 기술적 혁신
- Agentic Analytics: AI 에이전트와 데이터 분석의 융합
- 선언적 설계: 코드 네이티브 접근으로 구성의 단순화
- 다중 언어 지원: Rust 코어에 Python 바인딩 제공
- 임베디드 분석: DuckDB 통합으로 고성능 분석 엔진
다음 포스트에서는 애플리케이션의 진입점과 초기화 과정을 상세히 분석해보겠습니다.