다른 명령
DBA Tunes
- 프로그램 수정 가이드 - 핵심 요약
프로그램 구조
app.py # Flask 백엔드 서버 (API, 데이터베이스) templates/index_ag.html # 프론트엔드 메인 페이지 instance/sql_tuning.db # SQLite 데이터베이스 uploads/ # 첨부파일 저장 폴더 DBATunePjt/ ├── app.py # Flask 백엔드 애플리케이션 메인 파일 ├── requirements.txt # Python 의존성 패키지 목록 ├── init_db.py # 데이터베이스 초기화 스크립트 ├── reset_db.py # 데이터베이스 초기화/리셋 스크립트 │ ├── templates/ # HTML 템플릿 디렉토리 (백엔드에서 렌더링) │ ├── index_ag.html # ⭐ 메인 UI (AG Grid 사용) │ └── index_simple.html # 간단한 대체 UI │ ├── static/ # 정적 리소스 디렉토리 │ └── luckysheet/ # Luckysheet 라이브러리 (현재 미사용) │ ├── instance/ # 인스턴스 데이터 디렉토리 │ └── sql_tuning.db # SQLite 데이터베이스 파일
주요 수정 포인트
A. 데이터베이스 필드 추가
위치: `app.py` 24-82줄 (TuningRequest 클래스)
# 1. 필드 추가
class TuningRequest(db.Model):
# ... 기존 필드들
NEW_FIELD = db.Column(db.String(100)) # 새 필드 추가
# 2. to_dict() 메서드에 추가
def to_dict(self):
return {
# ... 기존 필드들
'NEW_FIELD': self.NEW_FIELD,
}
- B. 프론트엔드 컬럼 추가
위치: `index_ag.html` 227-238줄 (basicColumnDefs)
const basicColumnDefs = [
// ... 기존 컬럼들
{ headerName: '새 컬럼', field: 'NEW_FIELD', width: 100, editable: true },
];
- C. 새 요청 모달에 입력 필드 추가
위치: `index_ag.html` 113-197줄 (새 요청 추가 모달)
<div class="form-field">
<label>새 필드</label>
<input type="text" id="formNewField" placeholder="새 필드 입력">
</div>
- D. 파일 크기 제한 변경
위치: `app.py` 15줄
app.config['MAX_CONTENT_LENGTH'] = 50 * 1024 * 1024 # 50MB로 변경
- E. 파일 타입 제한 추가
위치: `app.py` 276-318줄 (upload_attachment 함수)
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'sql'}
file_extension = os.path.splitext(original_filename)[1][1:].lower()
if file_extension not in ALLOWED_EXTENSIONS:
return jsonify({'error': '허용되지 않는 파일 타입입니다.'}), 400
주요 함수 위치
- 백엔드 (app.py)
- 요청 생성: 156-188줄 (`create_request`) - 요청 수정: 190-225줄 (`update_request`) - 요청 삭제: 227-232줄 (`delete_request`) - 파일 업로드: 276-318줄 (`upload_attachment`) - 파일 다운로드: 329-341줄 (`download_attachment`) - 파일 삭제: 343-361줄 (`delete_attachment`)
- 프론트엔드 (index_ag.html)
- 데이터 로드: 342-397줄 (`loadData`) - 새 요청 추가: 402-425줄 (`addRow`) - 새 요청 저장: 497-579줄 (`saveNewRequest`) - 파일 업로드: 471-495줄 (`uploadFiles`) - 상세 패널 표시: 809-1016줄 (`showDetailPanel`) - 상세 정보 저장: 757-807줄 (`saveDetailChanges`)
스타일 수정
위치: `index_ag.html` 9-76줄 (`<style>` 섹션)
/* 색상 변경 */
.btn-primary {
background:#2563eb; /* 파란색 */
}
/* 폰트 크기 변경 */
body {
font-size: 14px;
}
API 엔드포인트 목록
GET /api/requests # 요청 목록 조회 POST /api/requests # 새 요청 생성 PUT /api/requests/<req_no> # 요청 수정 DELETE /api/requests/<req_no> # 요청 삭제 GET /api/requests/<req_no>/sql-text # SQL 텍스트 조회 PUT /api/requests/<req_no>/sql-text # SQL 텍스트 수정 POST /api/requests/<req_no>/attachments # 파일 업로드 GET /api/requests/<req_no>/attachments # 파일 목록 조회 GET /api/attachments/<attach_no> # 파일 다운로드 DELETE /api/attachments/<attach_no> # 파일 삭제 POST /api/init-data # 샘플 데이터 초기화
데이터베이스 테이블
- TN_REQ (TuningRequest)
- 주요 필드: REQ_NO, REQ_USER, REQ_DT, SQL_PROGRAM_ID 등 - 관계: 첨부파일(1:N), 액션(1:1)
- TN_ATTACH (Attachment)
- 주요 필드: ATTACH_NO, REQ_NO, ORIGINAL_FILENAME, STORED_FILENAME - 관계: 요청(N:1)
- TN_ACTN (TuningAction)
- 주요 필드: REQ_NO, ACTION_DATE, ACTION_USER - 관계: 요청(1:1)
수정 시 주의사항
1. 데이터베이스 필드 추가 시
- 기존 데이터는 NULL로 설정됨 - 백업 후 수정 권장
2. 파일 업로드 시
- 파일 크기 제한 확인 (기본 16MB) - 업로드 폴더 권한 확인
3. 프론트엔드 수정 시
- JavaScript 함수명 중복 주의 - HTML ID 중복 주의
4. API 수정 시
- 응답 형식 일관성 유지 - 에러 처리 추가 권장
빠른 수정 예시
- 예시 1: 새 필드 추가
# app.py - TuningRequest 클래스에 필드 추가
PRIORITY = db.Column(db.String(10)) # 우선순위
# app.py - to_dict() 메서드에 추가
'PRIORITY': self.PRIORITY,
# index_ag.html - 컬럼 추가
{ headerName: '우선순위', field: 'PRIORITY', width: 100, editable: true },
# index_ag.html - 모달에 입력 필드 추가
<div class="form-field">
<label>우선순위</label>
<select id="formPriority">
<option value="높음">높음</option>
<option value="보통">보통</option>
<option value="낮음">낮음</option>
</select>
</div>
- 예시 2: 파일 타입 제한
# app.py - upload_attachment 함수에 추가
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'sql', 'jpg', 'png'}
file_extension = os.path.splitext(original_filename)[1][1:].lower()
if file_extension not in ALLOWED_EXTENSIONS:
return jsonify({'error': f'{file_extension} 파일은 허용되지 않습니다.'}), 400