메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

DBA Tune

데브카페
Devcafe (토론 | 기여)님의 2025년 11월 12일 (수) 21:50 판

DBA Tunes

    1. 프로그램 수정 가이드 - 핵심 요약
      1. 1. 프로그램 구조

app.py                    # Flask 백엔드 서버 (API, 데이터베이스)
templates/index_ag.html   # 프론트엔드 메인 페이지
instance/sql_tuning.db    # SQLite 데이터베이스
uploads/                  # 첨부파일 저장 폴더
      1. 2. 주요 수정 포인트
        1. 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,
    }


        1. B. 프론트엔드 컬럼 추가

위치: `index_ag.html` 227-238줄 (basicColumnDefs)


const basicColumnDefs = [
    // ... 기존 컬럼들
    { headerName: '새 컬럼', field: 'NEW_FIELD', width: 100, editable: true },
];


        1. C. 새 요청 모달에 입력 필드 추가

위치: `index_ag.html` 113-197줄 (새 요청 추가 모달)


<div class="form-field">
    <label>새 필드</label>
    <input type="text" id="formNewField" placeholder="새 필드 입력">
</div>


        1. D. 파일 크기 제한 변경

위치: `app.py` 15줄


app.config['MAX_CONTENT_LENGTH'] = 50 * 1024 * 1024  # 50MB로 변경


        1. 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


      1. 3. 주요 함수 위치
        1. 백엔드 (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`)

        1. 프론트엔드 (index_ag.html)

- 데이터 로드: 342-397줄 (`loadData`) - 새 요청 추가: 402-425줄 (`addRow`) - 새 요청 저장: 497-579줄 (`saveNewRequest`) - 파일 업로드: 471-495줄 (`uploadFiles`) - 상세 패널 표시: 809-1016줄 (`showDetailPanel`) - 상세 정보 저장: 757-807줄 (`saveDetailChanges`)

      1. 4. 스타일 수정

위치: `index_ag.html` 9-76줄 (`<style>` 섹션)


/* 색상 변경 */
.btn-primary {
    background:#2563eb;  /* 파란색 */
}

/* 폰트 크기 변경 */
body {
    font-size: 14px;
}


      1. 5. 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                   # 샘플 데이터 초기화


      1. 6. 데이터베이스 테이블
        1. TN_REQ (TuningRequest)

- 주요 필드: REQ_NO, REQ_USER, REQ_DT, SQL_PROGRAM_ID 등 - 관계: 첨부파일(1:N), 액션(1:1)

        1. TN_ATTACH (Attachment)

- 주요 필드: ATTACH_NO, REQ_NO, ORIGINAL_FILENAME, STORED_FILENAME - 관계: 요청(N:1)

        1. TN_ACTN (TuningAction)

- 주요 필드: REQ_NO, ACTION_DATE, ACTION_USER - 관계: 요청(1:1)

      1. 7. 수정 시 주의사항

1. 데이터베이스 필드 추가 시

  - 기존 데이터는 NULL로 설정됨
  - 백업 후 수정 권장

2. 파일 업로드 시

  - 파일 크기 제한 확인 (기본 16MB)
  - 업로드 폴더 권한 확인

3. 프론트엔드 수정 시

  - JavaScript 함수명 중복 주의
  - HTML ID 중복 주의

4. API 수정 시

  - 응답 형식 일관성 유지
  - 에러 처리 추가 권장
      1. 8. 빠른 수정 예시
        1. 예시 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>


        1. 예시 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

Comments