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

DBA Tune

데브카페
Devcafe (토론 | 기여)님의 2025년 11월 12일 (수) 21:45 판 (새 문서: == DBA Tunes == 프로그램 수정 가이드를 작성했습니다. 핵심만 간단 요약합니다. ## 프로그램 수정 가이드 - 핵심 요약 ### 1. 프로그램 구조 ``` app.py # Flask 백엔드 서버 (API, 데이터베이스) templates/index_ag.html # 프론트엔드 메인 페이지 instance/sql_tuning.db # SQLite 데이터베이스 uploads/ # 첨부파일 저장 폴더 ``` ### 2. 주요 수정 포인트 #### A. 데...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

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 클래스)

```python

  1. 1. 필드 추가

class TuningRequest(db.Model):

   # ... 기존 필드들
   NEW_FIELD = db.Column(db.String(100))  # 새 필드 추가
  1. 2. to_dict() 메서드에 추가

def to_dict(self):

   return {
       # ... 기존 필드들
       'NEW_FIELD': self.NEW_FIELD,
   }

```

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

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

```javascript const basicColumnDefs = [

   // ... 기존 컬럼들
   { headerName: '새 컬럼', field: 'NEW_FIELD', width: 100, editable: true },

]; ```

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

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

```html

   <label>새 필드</label>
   <input type="text" id="formNewField" placeholder="새 필드 입력">

```

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

위치: `app.py` 15줄

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

        1. E. 파일 타입 제한 추가

위치: `app.py` 276-318줄 (upload_attachment 함수)

```python 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>` 섹션)

```css /* 색상 변경 */ .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: 새 필드 추가

```python

  1. app.py - TuningRequest 클래스에 필드 추가

PRIORITY = db.Column(db.String(10)) # 우선순위

  1. app.py - to_dict() 메서드에 추가

'PRIORITY': self.PRIORITY,

  1. index_ag.html - 컬럼 추가

{ headerName: '우선순위', field: 'PRIORITY', width: 100, editable: true },

  1. index_ag.html - 모달에 입력 필드 추가
   <label>우선순위</label>
   <select id="formPriority">
       <option value="높음">높음</option>
       <option value="보통">보통</option>
       <option value="낮음">낮음</option>
   </select>

```

        1. 예시 2: 파일 타입 제한

```python

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

```

상세 가이드는 `프로그램_수정_가이드.md` 파일에 있습니다. 특정 부분을 더 설명해야 하면 알려주세요.

Comments