Odoo Core와 모든 것을 재발명하는 비용
Source: Dev.to
Odoo는 대부분의 기업이 필요로 하는 많은 사전 구축된 모듈(미니‑애플리케이션)을 제공하는 단일 플랫폼입니다. 예를 들어, 거의 모든 기업은 직원 상세 정보, 휴가, 출석, 계약, 퇴직 등을 관리하는 인사 시스템이 필요합니다. 인사 외에도 기업은 구매, 재고, 회계, 인증, 권한 부여 및 기타 시스템이 필요합니다.
Odoo는 이러한 긴밀하게 결합된 시스템들을 하나의 설치본으로 묶어 제공합니다. 이론적으로는 훌륭해 보이며, 비즈니스 관점에서도 종종 그렇습니다. 하지만 기술적인 관점에서는 상황이 매우 빠르게 복잡해집니다.
Main Odoo Components (ranked from least to most complex)
Odoo HTTP Layer
- JSON‑RPC
- Website routing
Odoo는 Django나 Flask와 같은 표준 Python 웹 프레임워크 위에 구축되지 않았습니다. 대신 Werkzeug(WSGI 유틸리티 라이브러리) 위에 자체 HTTP 프레임워크를 구현합니다. 이 레이어는 자체 추상화, 요청 라이프사이클, 라우팅, 직렬화 로직(JSON‑RPC 및 웹사이트 컨트롤러 포함)을 도입합니다. 기술적으로 인상적이지만, 이미 기존 프레임워크가 해결하고 검증한 많은 문제들을 다시 구현하고 있습니다. 제 의견으로는 이것이 Odoo에서 가장 문제적인 부분 중 하나입니다.
Odoo Views
- XML transformed into Python and JavaScript
XML 기반 뷰는 브라우저로 전송된 뒤 추상 구문 트리(AST) 분석을 통해 JavaScript로 변환됩니다. 다른 상황(예: 웹사이트)에서는 XML이 Python 코드로 변환되고 때때로 다시 JavaScript로 변환되기도 합니다. 이로 인해 다음과 같은 문제가 발생합니다:
- 높은 인지적 부하
- 디버깅 어려움
- 백엔드와 프론트엔드 간의 긴밀한 결합
- 현대 프론트엔드 스택에 비해 열악한 툴링 지원
마치 원재료인 금속을 가지고 차를 만든 뒤 A 지점에서 B 지점으로 이동하려는 느낌입니다.
Odoo ORM
- Custom inheritance system (instead of using Python’s built‑in one)
- Dependency injection mechanism
- Query builder
- Caching layers (LRU)
- Model extension via monkey‑patching
강력하지만, 이 시스템은 매우 복잡하고 이해하기 어렵습니다. 모델 동작을 디버깅하는 것은 보이지 않는 마법의 층을 탐험하는 것과 같습니다.
Cache System
- Implemented from scratch
WebSocket Implementation
- Very low‑level handling
성숙한 실시간 프레임워크를 사용하는 대신, Odoo는 매우 저수준 로직으로 WebSocket 처리를 구현합니다. 때때로 파일이 놀라울 정도로 작고 밀집돼 있습니다. 코드베이스의 한 주석이 이 접근 방식을 말보다 더 잘 요약합니다:
[Insert comment from the codebase here]
Historical Context
Odoo 아키텍처에 대한 흔한 변명은 “오래된 시스템이다”는 것입니다—원래 2005년경 Python 2로 개발되었습니다. 그러나 이 주장은 더 이상 설득력이 없습니다. Odoo는 2017년경 Python 3을 지원하기 위해 대부분을 새로 작성했습니다. 그때는 이미 많은 훌륭한 프레임워크가 존재했고, 같은 문제들을 더 깔끔하게 해결했으며, 생태계를 깨뜨리지 않고 지속적으로 진화하고 있었습니다.
Impact on Development
오늘날 Odoo 코어의 작은 변경이라도, 핵심 동작에 최소한의 의존성을 가진 단순 CRUD 모델이 아니라면 사용자 정의 모듈을 깨뜨릴 수 있습니다. Odoo는 강력한 제품이자 성공적인 비즈니스 플랫폼이지만, 소프트웨어 엔지니어링 관점에서는 많은 설계 결정이 유지보수성, 명확성, 개발자 경험보다 제어와 내부 일관성을 우선시합니다. Odoo와 오래 작업하다 보면 “왜 이렇게 동작하나요?”라는 질문 대신 “이 업그레이드를 어떻게 살아남나요?”라는 질문을 하게 됩니다.