Architecture Decision Record

Active theme: Light

← 의사결정 기록 예시

아키텍처 의사결정 기록: 스타트업 제품을 위한 올인원(batteries included) 풀스택 웹 애플리케이션 프레임워크

주요 목표:
유료 고객이 로그인하고, 파일을 업로드하고, 데이터를 처리하고, 보고서를 볼 수 있는 웹 애플리케이션을 구축하며, 애자일 개발, 풀스택 기능, 그리고 특히 Project Jupyter 노트북 같은 AI/ML 도구와의 강력한 호환성에 중점을 둡니다.

맥락과 요구사항:

  1. 애자일 개발(높은 우선순위): 스타트업으로서 빠른 반복과 유연성이 필요합니다. 빠른 프로토타이핑, 반복적 개발, 변화에 대한 적응성 같은 애자일 방법론이 우리 개발 주기의 핵심입니다.

  2. 풀스택 프레임워크(높은 우선순위): 백엔드와 프런트엔드를 모두 효과적으로 처리할 수 있는 프레임워크를 선택하여 별도의 프런트엔드 프레임워크 필요성을 줄이고 오버헤드를 최소화하고자 합니다.

  3. AI/ML 도구와의 호환성(높은 우선순위): Jupyter 노트북 같은 데이터 분석 도구 및 Python의 데이터 과학 생태계(NumPy, Pandas, TensorFlow 등)와 쉽게 통합되는 능력이 필수적입니다. 이는 효율적인 데이터 처리와 보고를 촉진합니다.

  4. 낮은 우선순위 기준:

    • 런타임 속도: 성능은 관련이 있지만, 개발 속도와 기능 완성에 더 신경 쓰고 있으므로 초기에는 가장 중요한 요인이 아닙니다.
    • 확장성: 성장을 예상하지만 확장성 문제는 나중에 다룰 수 있으며 현재의 주요 요구사항은 아닙니다.
    • 하위 호환성: 우리는 현재 기술에 집중하고 있으며 레거시 시스템과의 하위 호환성은 크게 우려하지 않습니다.

평가한 프레임워크:

  1. Django (Python)
  2. Ruby on Rails (Ruby)
  3. Phoenix (Elixir)
  4. Loco (Rust)

1. Django (Python)

개요:
Django는 빠른 개발과 깔끔하고 실용적인 설계를 장려하는 Python용 고수준 웹 프레임워크입니다. 인증, 라우팅, ORM, 폼 처리 같은 많은 기능을 기본으로 포함하는 “올인원(batteries included)” 철학으로 유명합니다.

강점:

  • 풀스택: Django는 통합된 기능(예: 템플릿 엔진, 관리자 인터페이스)으로 백엔드와 프런트엔드 요구를 모두 처리할 수 있는 포괄적인 풀스택 프레임워크입니다.
  • 애자일 개발: Django의 잘 정의된 구조와 관례는 스타트업 환경에 필수적인 빠른 개발과 적응성을 가능하게 합니다. 이 프레임워크는 훌륭한 문서와 서드파티 패키지의 풍부한 생태계를 제공하여 개발을 가속합니다.
  • AI/ML 통합: Python의 생태계는 데이터 과학과 머신러닝에서 비할 데 없습니다. Python 기반인 Django는 Jupyter 노트북, Pandas, NumPy, TensorFlow, scikit-learn 같은 도구와 매끄럽게 통합됩니다.
  • 커뮤니티와 생태계: Django에는 방대한 커뮤니티, 견고한 문서, 폭넓은 플러그인과 확장 기능이 있어 개발과 문제 해결을 크게 가속합니다.

약점:

  • 런타임 속도: Python은 Rust나 Elixir 같은 언어에 비해 느린 경향이 있습니다. 그러나 성능이 주요 관심사가 아닌 이 사용 사례에서는 결정적이지 않을 수 있습니다.
  • 확장성: Django는 확장성이 매우 높지만 신중한 최적화 없이 매우 높은 규모에서는(예: 무거운 동시 요청 처리 시) 어려움이 있을 수 있습니다. 그래도 Django는 로드 밸런싱과 캐싱 기법으로 효과적으로 확장할 수 있습니다.

평가:
Django는 애자일 개발, 풀스택 지원, AI/ML 호환성 요구사항과 잘 맞습니다. Python 통합은 애플리케이션에 필요한 데이터 과학 도구와 라이브러리에 대한 매끄러운 접근을 제공합니다.


2. Ruby on Rails (Ruby)

개요:
Ruby on Rails(RoR)는 빠른 개발을 촉진하는 “설정보다 관례” 접근 방식으로 알려진 성숙한 풀스택 웹 애플리케이션 프레임워크입니다.

강점:

  • 풀스택: RoR에는 백엔드와 프런트엔드 개발 모두를 위한 내장 도구(예: 뷰, 템플릿, 스캐폴딩)가 포함되어 있으며, 풍부한 gem 라이브러리 덕분에 다양한 기능을 빠르게 구현할 수 있습니다.
  • 애자일 개발: Ruby on Rails는 특히 빠른 반복 주기로 유명하여 기능을 빠르게 반복하려는 스타트업에 유리합니다. RoR은 테스트 주도 개발(TDD)을 지원하며 애자일 워크플로를 위한 자리 잡은 생태계를 가지고 있습니다.
  • 커뮤니티와 생태계: RoR에는 자리 잡은 강한 커뮤니티와 개발을 가속할 수 있는 폭넓은 gem이 있습니다.
  • 사용 편의성: Rails는 매우 개발자 친화적인 문법을 가지고 있으며 데이터베이스 마이그레이션, 모델-뷰-컨트롤러(MVC) 아키텍처, 라우팅 관리 같은 작업을 빠르고 쉽게 하는 것으로 알려져 있습니다.

약점:

  • 성능: Ruby는 Python이나 Elixir에 비해 런타임 성능이 느린 경향이 있습니다. RoR은 적절한 인프라로 확장할 수 있지만, 무거운 실시간 처리나 높은 동시 트래픽이 필요한 애플리케이션에서는 Ruby의 성능이 병목이 될 수 있습니다.
  • AI/ML 통합: Ruby에도 머신러닝 라이브러리가 일부 있지만 AI/ML 커뮤니티에서 Python만큼 널리 채택되지는 않았습니다. Jupyter 노트북 같은 도구와의 통합이 그만큼 매끄럽지 않아 데이터 중심 애플리케이션에는 Python이 더 강력한 선택입니다.

평가:
Ruby on Rails는 애자일 개발과 빠른 프로토타이핑에 뛰어나지만 AI/ML 호환성에서는 Python(Django)에 못 미칩니다. 데이터 분석의 깊은 통합보다 빠른 반복을 우선하는 스타트업에는 실행 가능한 선택입니다.


3. Phoenix (Elixir)

개요:
Phoenix는 확장성과 동시성을 위해 설계된 함수형 프로그래밍 언어인 Elixir로 구축된 웹 프레임워크입니다. Phoenix는 대규모 동시성과 내결함성 시스템 처리로 유명한 Erlang VM을 활용합니다.

강점:

  • 확장성과 성능: Phoenix는 확장성과 높은 동시성 처리에서 빛납니다. 수천(심지어 수백만) 개의 동시 연결을 지원할 수 있는 Erlang VM 위에 구축되어 있어 실시간 데이터 처리나 대용량 트래픽이 필요한 애플리케이션에 강력한 후보입니다.
  • 풀스택: Phoenix에는 애플리케이션의 백엔드와 프런트엔드를 모두 구축하는 데 필요한 모든 것이 포함되어 있습니다. 인터랙티브 UI 업데이트를 위한 라이브 뷰를 지원하며 템플릿 엔진을 포함합니다.
  • 애자일 개발: Phoenix는 매우 모듈식이어서 기능을 빠르게 반복할 수 있습니다. 빠르게 움직여야 하는 스타트업에 잘 맞습니다.
  • AI/ML 호환성: Elixir에도 떠오르는 머신러닝 라이브러리가 있지만 AI/ML 작업에서 Python만큼 널리 지원되지는 않습니다. Elixir의 데이터 과학 생태계가 Python만큼 성숙하지 않아 Jupyter 노트북 같은 도구와의 통합에는 우회책이 필요합니다.

약점:

  • AI/ML 생태계: Elixir는 데이터 과학이나 머신러닝에 주로 사용되는 언어가 아니며 생태계도 Python만큼 성숙하지 않습니다. 따라서 Jupyter 노트북이나 인기 있는 AI 라이브러리(TensorFlow, PyTorch) 같은 도구와의 통합이 번거롭습니다.
  • 학습 곡선: 팀이 함수형 프로그래밍과 Elixir에 익숙하지 않으면 학습 곡선이 더 가파를 수 있습니다.

평가:
확장성과 동시성이 주요 우려라면 Phoenix는 훌륭한 선택입니다. 그러나 AI/ML 호환성의 우선순위를 고려할 때, 이 영역에서 Elixir의 제한적인 생태계 때문에 Phoenix는 최선의 선택이 아닐 수 있습니다.


4. Loco (Rust)

개요:
Loco는 성능, 메모리 안전성, 동시성으로 알려진 시스템 프로그래밍 언어인 Rust로 구축된 웹 프레임워크입니다. Rust는 고성능 애플리케이션을 구축하는 데 점점 더 인기를 얻고 있습니다.

강점:

  • 성능: Rust의 주된 강점은 높은 성능과 메모리 안전성에 있어 저수준 제어나 극도로 높은 성능이 필요한 애플리케이션에 훌륭한 선택입니다.
  • 동시성: Rust의 소유권(ownership) 시스템은 안전한 동시 프로그래밍을 허용하면서 메모리 안전성을 보장하므로 효율적으로 확장하고 병렬성을 처리해야 하는 시스템에 이상적입니다.

약점:

  • 풀스택 개발: Loco는 유망하지만 완전한 풀스택 솔루션을 제공하는 면에서 다른 프레임워크만큼 성숙하지 않습니다. 백엔드 개발에 더 적합하며, Rust 주변의 프런트엔드 생태계는 아직 떠오르는 중입니다.
  • 애자일 개발: Rust를 이용한 개발은 더 낮은 수준과 더 가파른 학습 곡선 때문에 Python이나 Ruby 같은 고수준 언어에 비해 느릴 수 있습니다.
  • AI/ML 생태계: Rust에는 Python만큼 광범위한 AI/ML 생태계가 없습니다. 수치 계산을 위한 라이브러리가 Rust에서 늘어나고 있지만, Jupyter 노트북이나 머신러닝 프레임워크 같은 Python의 제공물보다 훨씬 덜 성숙합니다.

평가:
Rust와 그 프레임워크 Loco는 뛰어난 성능을 제공하지만, 풀스택 지원, 애자일 개발의 이점, AI/ML 생태계가 부족하여 이 특정 사용 사례에는 덜 이상적입니다. 통합된 데이터 과학 도구를 갖춘 빠른 웹 개발보다는 성능이 중요한 애플리케이션에 더 적합합니다.


결론

프로젝트 요구사항을 기준으로 선택지를 평가한 결과, **Django (Python)**가 가장 적합한 선택입니다. 다음과 같은 이점을 제공합니다:

  • 풀스택 기능: Django는 백엔드와 프런트엔드 개발을 통합하는 풀스택 프레임워크입니다.
  • 애자일 개발: 이 프레임워크는 스타트업 환경에서 필수적인 빠른 프로토타이핑과 반복에 잘 맞습니다.
  • AI/ML 호환성: Python은 AI/ML을 선도하는 언어이며, Jupyter 노트북 같은 라이브러리와의 Django 호환성은 데이터 분석과 처리를 위한 원활한 통합을 보장합니다.
  • 커뮤니티와 생태계: Django의 강력한 커뮤니티 지원과 광범위한 라이브러리 생태계는 개발을 가속하는 수많은 도구를 제공합니다.

Ruby on Rails도 애자일 개발에 강력한 후보이지만, 제한적인 AI/ML 지원 때문에 이 특정 사용 사례에는 덜 이상적입니다. 확장성과 성능에 뛰어난 **Phoenix (Elixir)**와 **Loco (Rust)**는 AI/ML 통합과 풀스택 개발에서 못 미칩니다. 따라서 이 프로젝트에는 Django가 권장되는 프레임워크입니다.