✨ 새로운 기능: - iPhone HEIC 사진 업로드 지원 (pillow-heif 라이브러리 추가) - 완료 사진 업로드/교체 기능 - 완료 코멘트 수정 기능 - 통합 이슈 수정 모달 (진행 중/완료 대기 공통) 🔧 기술적 개선: - HEIC 파일 자동 감지 및 원본 저장 - Base64 이미지 처리 로직 강화 - 상세한 디버깅 로그 추가 - 프론트엔드 파일 정보 로깅 📝 문서화: - 배포 가이드 (DEPLOYMENT_GUIDE_20251026.md) 추가 - DB 변경사항 로그 업데이트 - 마이그레이션 스크립트 (020_add_management_completion_fields.sql) 🐛 버그 수정: - loadManagementData -> initializeManagement 함수명 통일 - 모달 저장 후 즉시 닫히는 문제 해결 - 422 Unprocessable Entity 오류 해결
260 lines
8.5 KiB
Markdown
260 lines
8.5 KiB
Markdown
# 🗄️ DB 변경사항 로그
|
|
|
|
> **중요**: 배포 시 반드시 이 문서를 확인하여 DB 마이그레이션을 순서대로 실행하세요.
|
|
|
|
## 📋 변경사항 목록
|
|
|
|
### 2025.10.26 - 관리함 완료 신청 정보 수정 기능 추가
|
|
|
|
**🎯 목적**: 관리함에서 완료 사진 업로드/교체 및 완료 코멘트 수정 기능 구현
|
|
|
|
#### 📁 파일 변경사항
|
|
|
|
**1. 백엔드 스키마 추가**
|
|
- **파일**: `backend/database/schemas.py`
|
|
- **변경내용**: `ManagementUpdateRequest` 클래스 추가
|
|
- **코드**:
|
|
```python
|
|
class ManagementUpdateRequest(BaseModel):
|
|
"""관리함에서 이슈 업데이트 요청"""
|
|
final_description: Optional[str] = None
|
|
final_category: Optional[IssueCategory] = None
|
|
solution: Optional[str] = None
|
|
responsible_department: Optional[DepartmentType] = None
|
|
responsible_person: Optional[str] = None
|
|
expected_completion_date: Optional[str] = None
|
|
cause_department: Optional[DepartmentType] = None
|
|
management_comment: Optional[str] = None
|
|
completion_comment: Optional[str] = None
|
|
completion_photo: Optional[str] = None # Base64
|
|
review_status: Optional[ReviewStatus] = None
|
|
```
|
|
|
|
**2. 백엔드 API 개선**
|
|
- **파일**: `backend/routers/management.py`
|
|
- **변경내용**: `PUT /api/management/{issue_id}` 엔드포인트에 완료 사진 처리 로직 추가
|
|
- **코드**:
|
|
```python
|
|
if field == 'completion_photo' and value:
|
|
# 완료 사진 Base64 처리
|
|
from services.file_service import save_base64_image
|
|
try:
|
|
photo_path = save_base64_image(value, "completion_")
|
|
issue.completion_photo_path = photo_path
|
|
except Exception as e:
|
|
print(f"완료 사진 저장 실패: {e}")
|
|
continue
|
|
```
|
|
|
|
**3. 프론트엔드 통합 모달**
|
|
- **파일**: `frontend/issues-management.html`
|
|
- **변경내용**:
|
|
- 진행 중/완료 대기 상태 모두 동일한 수정 가능한 모달 사용
|
|
- 완료 사진 업로드/교체 버튼 추가
|
|
- 완료 코멘트 텍스트 영역 수정 가능
|
|
- `loadManagementData()` → `initializeManagement()` 함수명 수정
|
|
|
|
**4. DB 마이그레이션**
|
|
- **파일**: `backend/migrations/020_add_management_completion_fields.sql`
|
|
- **목적**: 완료 신청 관련 컬럼들이 누락된 경우 추가 (이미 존재할 수 있음)
|
|
|
|
#### 🚀 배포 시 실행 순서
|
|
|
|
```bash
|
|
# 1. 데이터베이스 백업
|
|
docker-compose exec postgres pg_dump -U postgres -d m_project > backup_$(date +%Y%m%d_%H%M%S).sql
|
|
|
|
# 2. 백엔드 코드 배포
|
|
git pull origin master
|
|
docker-compose down
|
|
docker-compose build backend
|
|
docker-compose up -d
|
|
|
|
# 3. DB 마이그레이션 실행
|
|
docker-compose exec backend python -c "
|
|
import sys
|
|
sys.path.append('/app')
|
|
import psycopg2
|
|
import os
|
|
|
|
conn = psycopg2.connect(
|
|
host=os.getenv('DB_HOST', 'postgres'),
|
|
database=os.getenv('DB_NAME', 'm_project'),
|
|
user=os.getenv('DB_USER', 'postgres'),
|
|
password=os.getenv('DB_PASSWORD', 'password')
|
|
)
|
|
|
|
with open('/app/migrations/020_add_management_completion_fields.sql', 'r', encoding='utf-8') as f:
|
|
migration_sql = f.read()
|
|
|
|
with conn.cursor() as cursor:
|
|
cursor.execute(migration_sql)
|
|
conn.commit()
|
|
|
|
print('✅ 마이그레이션 완료')
|
|
conn.close()
|
|
"
|
|
|
|
# 4. 배포 후 검증
|
|
docker-compose logs backend --tail=20
|
|
docker-compose exec postgres psql -U postgres -d m_project -c "SELECT COUNT(*) FROM migration_log WHERE migration_file = '020_add_management_completion_fields.sql';"
|
|
```
|
|
|
|
#### ⚠️ 주의사항
|
|
- 완료 신청 관련 컬럼들이 이미 존재할 수 있으므로 마이그레이션 스크립트는 안전하게 작성됨
|
|
- 브라우저 캐시 문제로 인해 강제 새로고침(Ctrl+Shift+F5) 필요할 수 있음
|
|
- 422 에러 발생 시 백엔드 재시작 필요
|
|
|
|
---
|
|
|
|
### 2025.10.26 - 프로젝트별 순번 자동 할당 개선
|
|
|
|
**🎯 목적**: 수신함에서 진행 중/완료로 상태 변경 시 프로젝트별 순번이 자동 할당되도록 개선
|
|
|
|
#### 📁 파일 변경사항
|
|
|
|
**1. 백엔드 로직 수정**
|
|
- **파일**: `backend/routers/inbox.py`
|
|
- **변경내용**: `update_issue_status` 함수에 `project_sequence_no` 자동 할당 로직 추가
|
|
- **코드**:
|
|
```python
|
|
# 진행 중 또는 완료 상태로 변경 시 프로젝트별 순번 자동 할당
|
|
if status_request.review_status in [ReviewStatus.in_progress, ReviewStatus.completed]:
|
|
if not issue.project_sequence_no:
|
|
from sqlalchemy import text
|
|
result = db.execute(
|
|
text("SELECT generate_project_sequence_no(:project_id)"),
|
|
{"project_id": issue.project_id}
|
|
)
|
|
issue.project_sequence_no = result.scalar()
|
|
```
|
|
|
|
**2. 데이터 보정 마이그레이션**
|
|
- **파일**: `backend/migrations/017_fix_project_sequence_no.sql`
|
|
- **목적**: 기존에 진행 중/완료 상태인데 `project_sequence_no`가 누락된 데이터 보정
|
|
|
|
#### 🚀 배포 시 실행 순서
|
|
|
|
```bash
|
|
# 1. 백엔드 코드 배포
|
|
git pull origin master
|
|
|
|
# 2. DB 마이그레이션 실행 (Docker 환경)
|
|
docker-compose exec backend python -c "
|
|
import psycopg2
|
|
import os
|
|
|
|
database_url = os.getenv('DATABASE_URL', 'postgresql://postgres:password@db:5432/mproject')
|
|
conn = psycopg2.connect(database_url)
|
|
cur = conn.cursor()
|
|
|
|
with open('migrations/017_fix_project_sequence_no.sql', 'r', encoding='utf-8') as f:
|
|
cur.execute(f.read())
|
|
conn.commit()
|
|
conn.close()
|
|
print('✅ 마이그레이션 완료')
|
|
"
|
|
|
|
# 3. 서비스 재시작
|
|
docker-compose restart backend
|
|
```
|
|
|
|
#### 🔍 검증 방법
|
|
|
|
**1. DB에서 직접 확인**:
|
|
```sql
|
|
-- 관리 중인 이슈 중 순번이 누락된 것이 있는지 확인
|
|
SELECT COUNT(*) as missing_count
|
|
FROM issues
|
|
WHERE review_status IN ('in_progress', 'completed')
|
|
AND project_sequence_no IS NULL;
|
|
-- 결과: 0이어야 함
|
|
|
|
-- 프로젝트별 순번이 올바르게 할당되었는지 확인
|
|
SELECT project_id, COUNT(*) as total_issues,
|
|
MIN(project_sequence_no) as min_no,
|
|
MAX(project_sequence_no) as max_no
|
|
FROM issues
|
|
WHERE review_status IN ('in_progress', 'completed')
|
|
GROUP BY project_id
|
|
ORDER BY project_id;
|
|
-- 결과: 각 프로젝트별로 1부터 연속된 번호가 할당되어야 함
|
|
```
|
|
|
|
**2. 프론트엔드에서 확인**:
|
|
- 수신함에서 새로운 이슈를 "진행 중"으로 변경
|
|
- 현황판에서 "No.1, No.2..." 형태로 프로젝트별 순번이 표시되는지 확인
|
|
|
|
#### ⚠️ 주의사항
|
|
|
|
1. **마이그레이션 실행 전 백업**: 중요한 데이터이므로 실행 전 DB 백업 권장
|
|
2. **순서 준수**: 반드시 `016_add_management_fields.sql`이 먼저 실행된 상태여야 함
|
|
3. **Docker 환경**: 마이그레이션은 Docker 컨테이너 내에서 실행해야 함
|
|
4. **migration_log 테이블 구조**:
|
|
- 컬럼명: `migration_file` (migration_name 아님)
|
|
- 필수 컬럼: `migration_file`, `executed_at`, `status`, `notes`
|
|
5. **롤백 방법**: 문제 발생 시 `project_sequence_no` 컬럼을 NULL로 설정 후 재실행
|
|
|
|
#### 📊 예상 결과
|
|
|
|
**Before**:
|
|
```
|
|
현황판: No. (빈값)
|
|
프로젝트 A: 이슈들이 전체 통합 번호로 표시 (No.2, No.5, No.8...)
|
|
```
|
|
|
|
**After**:
|
|
```
|
|
현황판: No.1, No.2, No.3...
|
|
프로젝트 A: No.1, No.2, No.3
|
|
프로젝트 B: No.1, No.2, No.3
|
|
각 프로젝트별로 1부터 시작하는 깔끔한 순번
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 이전 변경사항
|
|
|
|
### 2025.10.25 - 관리함 필드 추가
|
|
- **파일**: `backend/migrations/016_add_management_fields.sql`
|
|
- **내용**: 관리함에서 사용할 추가 필드들 및 `generate_project_sequence_no()` 함수 생성
|
|
|
|
### 2025.10.24 - 사용자 부서 정보 추가
|
|
- **파일**: `backend/migrations/015_add_user_department.sql`
|
|
- **내용**: 사용자 테이블에 부서 정보 컬럼 추가
|
|
|
|
---
|
|
|
|
## 🔧 마이그레이션 실행 도구
|
|
|
|
**자동 마이그레이션 스크립트** (추후 개발 예정):
|
|
```bash
|
|
#!/bin/bash
|
|
# run_migrations.sh
|
|
# 모든 마이그레이션을 순서대로 실행하는 스크립트
|
|
```
|
|
|
|
**마이그레이션 상태 확인**:
|
|
```sql
|
|
-- 최근 실행된 마이그레이션 확인
|
|
SELECT migration_file, executed_at, status, notes
|
|
FROM migration_log
|
|
ORDER BY executed_at DESC
|
|
LIMIT 10;
|
|
|
|
-- 특정 마이그레이션 확인
|
|
SELECT * FROM migration_log
|
|
WHERE migration_file = '017_fix_project_sequence_no.sql';
|
|
```
|
|
|
|
#### 📋 실행 완료 상태 (2025.10.26)
|
|
|
|
✅ **마이그레이션 성공적으로 완료됨**
|
|
- **실행 시간**: 2025-10-26 11:15:44+09:00
|
|
- **상태**: SUCCESS
|
|
- **확인사항**:
|
|
- `generate_project_sequence_no()` 함수 존재 ✅
|
|
- `issues.project_sequence_no` 컬럼 존재 ✅
|
|
- 순번이 누락된 관리 중인 이슈: 0개 ✅
|
|
- 백엔드 서비스 재시작 완료 ✅
|