원 레포랑 완전 분리

This commit is contained in:
ai-cell-a100-1
2025-08-11 18:56:38 +09:00
commit 7217d3cbaa
86 changed files with 6631 additions and 0 deletions

82
docs/ADR-3.md Normal file
View File

@@ -0,0 +1,82 @@
# **ADR-003**
* 제목: **서비스 간 공통 모듈 연동 방식 결정**
* 날짜: **2025-06-12**
* 상태: 제안됨 (Proposed)
* 작성자: **\[김용연 연구원]**
---
## 1. 컨텍스트 (Context)
ADR-002를 통해 **멀티레포 아키텍처**로 결정되었으며, 이에 따라 각 서비스 간 **공통 모듈을 어떤 방식으로 연동할 것인지**에 대한 결정을 내려야 한다. 이번 논의는 다음 피드백을 기반으로 진행된다.
> 1. 공통모듈이 많고 복잡한가?
> 2. 관리포인트가 늘어날 여지가 많은가?
또한, Git 연동 방식 외에도 **Gitea Action 기반 자동 동기화 방식**을 함께 검토한다. 고려 요소는 다음과 같다.
* 공통 모듈의 복잡도 및 변경 빈도
* 유지보수 및 형상관리 난이도
* 개발자 사용성
* 자동화 가능성과 CI/CD 연계
* 로컬/원격 환경 간의 충돌 여부
---
## 2. 결정 (Decision)
현재 고려 중인 연동 방식은 다음과 같다.
| 방법 | 장점 | 단점 |
| --------------------------- | ---------------------------- | ---------------------------- |
| **git-submodule** | 참조만으로 관리되어 가볍고 명확한 버전 고정 가능 | 초기 사용 복잡, 동기화 어려움, 실수 발생 가능성 |
| **git-subtree** ✅ | 병합, 업데이트 용이, 독립적인 서비스 유지 가능 | 충돌 시 수동 병합 필요, 코드 중복 위험 |
| **Gitea Action(강제 동기화)** | CI로 일관된 코드 유지 가능, 자동화 쉬움 | 설정 복잡, 브랜치 충돌 발생 가능성 있음 |
---
## ✅ 공통모듈
현재 공통적으로 사용되거나 예정된 모듈은 다음과 같다:
| 영역 | 모듈 예시 | 설명 |
| ------------- | ---------------------------------- | ------------------------------------------ |
| 로깅 | `logger.py` | 공통 포맷의 로그 기록, Loki 기반 모니터링 대응 |
| 요청 로깅 추적 | `request_logger.py` | 클라이언트 IP, 요청 시간, API 경로 등을 기록, Loki/Grafana 연동 |
| 설정 관리 | `config_loader.py` | 환경 변수 및 설정 파일 통합 로딩 |
| 응답 구조 | `response.py` | API 응답 형식 표준화 |
| 예외 처리 | `exceptions.py` | 공통 예외 클래스로 서비스간 처리 로직 통일 |
| Celery 태스크 래퍼 | `celery_base.py` | 공통 Task 기반 클래스, 재시도/타임아웃/로깅 통일 |
| 작업 상태 추적 | `redis_job_tracker.py` | Redis 기반 작업 상태 추적 기능 |
| 모델 어댑터 | `llm_adapter.py`, `ocr_adapter.py` | 다양한 추론 서비스에 대한 공통 인터페이스 |
| 라우터 템플릿 | `base_router.py` | FastAPI 기반 라우터 템플릿 및 공통 설정 |
| 파일 유틸리티 | `file_utils.py` | 확장자 검사, 디렉토리 생성 등 파일 처리 로직 |
---
## 3. 고려된 대안
### 1. **git-submodule**
* 경량화 및 버전 고정 측면에서 유리
* 그러나 초기 진입장벽이 높고, 실수(예: 서브모듈 커밋 누락 등) 발생 가능
### 2. **git-subtree**
* 현재 가장 유력한 방식
* 외부 저장소의 디렉터리를 내부로 복사하여 통합된 이력 관리 가능
* CI/CD 파이프라인 내에서도 동기화 명령 (`pull`, `push`, `split`)이 명확
### 3. **Gitea Action 통한 자동 동기화**
* push 이벤트 발생 시 `main` 브랜치의 `common/` 디렉토리를 각 서비스의 `utils/`로 복사
* 자동화는 강력하나, 충돌이나 병합 충돌 발생 시 수동 대응 필요
---
## 4. 향후 계획
* 실제 운영 중인 공통 모듈을 기준으로 **변경 빈도, 영향 범위 분석**
* `subtree``Gitea Action` 기반 연동 테스트 진행
* 두 방식을 병행 테스트하여 장단점 비교
---