# 유틸리티 함수 설계 원칙 **작성일**: 2025-12-16 **목적**: 코드 재사용성 향상, 중복 제거, 유지보수성 개선 --- ## 핵심 원칙 ### 1. 중복 코드 제거 우선 - 동일한 로직이 2개 이상의 위치에 반복되면 유틸리티 함수로 추출 - 중복 코드는 버그 발생 가능성과 유지보수 비용 증가 - 유틸리티 함수로 통일하여 한 곳만 수정하면 전체 반영 ### 2. 범용성과 재사용성 - 특정 도메인에 종속되지 않는 범용 함수로 설계 - 다양한 상황에서 사용 가능하도록 매개변수화 - 타입 안전성 지원 (타입 힌트, 타입 체크) ### 3. 명확한 책임 분리 - 하나의 함수는 하나의 명확한 작업만 수행 - 함수명이 기능을 명확히 표현 - 복잡한 로직은 여러 함수로 분리 --- ## 유틸리티 함수 위치 ### 디렉토리 구조 ``` app/ └── utils/ # 공통 유틸리티 함수 ├── __init__.py └── {domain}_extractor.py # 예: json_extractor.py ``` ### 네이밍 규칙 - 파일명: `{기능}_extractor.py`, `{기능}_helper.py` 등 - 함수명: `extract_{대상}()`, `parse_{대상}()`, `format_{대상}()` 등 - 명확하고 구체적인 이름 사용 --- ## 설계 패턴 ### 예시: JSON 추출 유틸리티 **문제**: LLM 응답에서 JSON을 추출하는 로직이 9개 위치에서 중복 **해결**: 범용 JSON 추출 함수 도입 ```python # app/utils/json_extractor.py def extract_json_from_text(text: str, expected_type: type = dict) -> Optional[Union[Dict, List]]: """다양한 형식의 LLM 응답에서 JSON 추출""" # 코드 블록, 설명 텍스트 등 다양한 형식 자동 처리 ``` **효과**: - 9개 위치의 중복 코드 제거 (90줄 절약) - 한 곳만 수정하여 전체 반영 가능 - 다양한 LLM 응답 형식 자동 처리 --- ## 재사용성 체크리스트 유틸리티 함수 생성 전 확인: - [ ] 동일한 로직이 2개 이상의 위치에 있는가? - [ ] 범용적으로 사용 가능한가? (도메인 종속성 없는가?) - [ ] 함수명이 기능을 명확히 표현하는가? - [ ] 타입 안전성을 지원하는가? - [ ] 에러 처리가 적절한가? --- ## 금지 사항 - ❌ 특정 도메인에 종속된 로직을 유틸리티로 만들지 않음 - ❌ 너무 복잡한 로직 (책임 분리 필요) - ❌ 한 곳에서만 사용되는 로직 (과도한 추상화 방지) - ❌ 비즈니스 로직을 유틸리티에 포함 (서비스 레이어에 있어야 함) --- **참고**: - JSON 추출 유틸리티 사례: `rb8001/app/utils/json_extractor.py` - 관련 troubleshooting: `DOCS/journey/troubleshooting/251216_coldmail_processing_improvements.md`