### 1.1 고급 데이터 비교 기법
**퍼지 매칭 비교 (Fuzzy Matching Comparison)**
- **Levenshtein Distance**: 문자열 간 편집 거리 계산하여 유사도 측정
- **Jaro-Winkler Distance**: 문자열 시작 부분 일치도에 높은 가중치 부여
- **Soundex Algorithm**: 발음 기반 유사성 비교 (한국어는 초성/중성/종성 분리)
- **N-Gram Similarity**: 연속된 n개 문자 시퀀스로 유사도 계산
- 사용 사례: 고객명, 주소, 제품명 등의 오타나 표기 차이 허용 비교
**데이터 프로파일링 비교 (Data Profiling Comparison)**
- **통계적 비교**: MIN, MAX, AVG, COUNT, DISTINCT 값 비교
- **분포 비교**: 데이터 분포도 및 빈도 분석 비교
- **널값 비교**: NULL 값 개수 및 패턴 비교
- **유니크 값 비교**: 고유값 개수 및 중복도 비교
- 사용 사례: 대용량 데이터 마이그레이션 시 전체 데이터 품질 검증
### 1.2 테스트 단계별 비교 방법
**샘플링 비교 (Sampling Comparison)**
- 전체 데이터의 일정 비율(예: 1%, 5%) 추출하여 비교
- 계층화 샘플링으로 각 카테고리별 대표성 확보
- 시간/비용 효율성과 정확성의 균형점 제공
[Monte Carlo Data](https://www.montecarlodata.com/blog-data-validation-testing/)
**스모크 테스트 비교 (Smoke Test Comparison)**
- 합성 데이터를 이용한 파이프라인 무결성 검증
- 핵심 기능의 기본 동작 여부만 빠르게 확인
- 전체 테스트 실행 전 사전 검증 단계로 활용
**델타 비교 (Delta Comparison)**
- 변경된 데이터만 추출하여 집중 비교
- CDC(Change Data Capture) 기법 활용
- 증분 데이터 처리 시나리오에 최적화
### 1.3 실시간 및 배치 비교
**실시간 검증 비교 (Real-time Validation)**
- API 호출 시점에서 즉시 데이터 검증
- 사용자 입력 데이터의 즉시 피드백
- 오류 데이터의 다운스트림 전파 방지
[Monte Carlo Data](https://www.montecarlodata.com/blog-data-validation-testing/)
**배치 검증 비교 (Batch Validation)**
- 대용량 데이터셋의 관계성 및 패턴 분석
- 야간 배치 작업으로 시스템 부하 분산
- 복잡한 비즈니스 룰 검증에 적합
### 1.4 비즈니스 룰 기반 비교
**이상 탐지 비교 (Anomaly Detection)**
- 머신러닝 기반 패턴 분석으로 비정상 데이터 탐지
- 임계값 기반 룰보다 유연한 검증
- 계절성, 트렌드 고려한 동적 기준 적용
**참조 무결성 비교 (Referential Integrity)**
- 부모-자식 테이블 간 관계 무결성 검증
- 고아 레코드(Orphan Records) 탐지
- 외래키 제약조건 준수 여부 확인
[DataGaps](https://www.datagaps.com/data-testing-concepts/etl-testing/)
---
## 2. 표준화된 테스트 관리 시스템 기능 정의서
### 2.1 표준 용어 및 구조 (ISO 29119 기반)
[ISO](https://www.iso.org/obp/ui/#iso:std:iso-iec-ieee:29119:-1:ed-1:en) 및 [Federal Student Aid](https://studentaid.gov/sites/default/files/fsawg/static/gw/docs/ciolibrary/FSA_Enterprise_Test_Management_Standards.pdf) 표준을 기반으로 다음과 같이 표준화합니다:
#### 2.1.1 핵심 엔티티 정의
| 기존 용어 | 표준화된 용어 | 영문 | 설명 |
|---------|-------------|-----|-----|
| 테스트 | Test Plan | TEST_PLAN | 테스트 목표와 수행 방법을 정의한 최상위 계획서 |
| 시나리오 | Test Suite | TEST_SUITE | 관련된 테스트 케이스들의 논리적 그룹 |
| 테스트 케이스 | Test Case | TEST_CASE | 특정 요구사항을 검증하기 위한 실행 가능한 단위 |
| 액티비티 | Test Step | TEST_STEP | 테스트 케이스 내의 개별 실행 단계 |
| 테스트 수행 | Test Execution | TEST_EXECUTION | 테스트 계획의 실제 실행 인스턴스 |
| 정답지 | Test Oracle | TEST_ORACLE | 예상 결과를 정의한 참조 데이터 |
| 알림 | Test Notification | TEST_NOTIFICATION | 테스트 결과 기반 자동 알림 |
#### 2.1.2 시스템 아키텍처
```
┌─────────────────────────────────────────────────┐
│ TEP (중앙 관리) │
├─────────────────────────────────────────────────┤
│ • 테스트 계획 관리 (Test Plan Management) │
│ • 요구사항 추적성 매트릭스 (RTM) │
│ • 통합 대시보드 (Unified Dashboard) │
│ • 보고서 및 메트릭스 (Reports & Metrics) │
└─────────────────────────────────────────────────┘
│
REST API 통신
│
┌─────────────────────────────────────────────────┐
│ 각 시스템별 실행 엔진 │
├─────────────────────────────────────────────────┤
│ • 테스트 실행 관리 (Test Execution Management) │
│ • SQL 실행 엔진 (SQL Execution Engine) │
│ • 결과 수집 및 전송 (Result Collection) │
│ • 로컬 알림 처리 (Local Notification) │
└─────────────────────────────────────────────────┘
```
### 2.2 주요 기능 모듈
#### 2.2.1 테스트 계획 관리 (Test Plan Management)
- **기능**: 재사용 가능한 테스트 템플릿 생성 및 관리
- **주요 기능**:
- 계층적 구조 관리 (Plan → Suite → Case → Step)
- 버전 관리 및 변경 이력 추적
- 요구사항 연결 및 추적성 매트릭스 자동 생성
- 테스트 커버리지 분석
#### 2.2.2 테스트 실행 관리 (Test Execution Management)
- **기능**: 계획된 테스트의 실제 실행 및 결과 관리
- **주요 기능**:
- 자동/수동 테스트 실행 지원
- 실시간 실행 상태 모니터링
- 병렬 실행 및 의존성 관리
- 실행 결과 자동 수집 및 분석
#### 2.2.3 데이터 검증 엔진 (Data Validation Engine)
- **기능**: 다양한 비교 알고리즘을 통한 데이터 검증
- **주요 기능**:
- 단순/매핑/참조/퍼지 매칭 비교 지원
- SQL 기반 대용량 데이터 검증
- 실시간/배치 검증 모드 제공
- 이상 탐지 및 통계적 검증
#### 2.2.4 통합 대시보드 (Unified Dashboard)
- **기능**: 다중 시스템의 테스트 현황 통합 모니터링
- **주요 기능**:
- 실시간 테스트 진행률 표시
- 성공률 및 실패 원인 분석
- 시스템별/프로젝트별 성과 비교
- 커스터마이징 가능한 위젯
#### 2.2.5 알림 및 모니터링 (Notification & Monitoring)
- **기능**: 테스트 결과 기반 자동 알림 및 지속적 모니터링
- **주요 기능**:
- 테스트 완료 시 자동 이메일 발송
- 독립적 스케줄 기반 모니터링
- 임계값 기반 알람 및 에스컬레이션
- 다채널 알림 지원 (이메일, 웹훅, SMS)
---
## 3. MariaDB 데이터베이스 설계
### 3.1 핵심 테이블 구조
```sql
-- =====================================
-- 테스트 관리 시스템 MariaDB DDL
-- 버전: 1.0
-- 작성일: 2025-01-07
-- 표준: ISO 29119, IEEE 829 준수
-- =====================================
-- 1. 조직 및 프로젝트 관리
-- =====================================
-- 조직 테이블
CREATE TABLE TB_ORGANIZATION (
ORG_ID VARCHAR(20) PRIMARY KEY COMMENT '조직 ID',
ORG_NAME VARCHAR(100) NOT NULL COMMENT '조직명',
ORG_DESC TEXT COMMENT '조직 설명',
PARENT_ORG_ID VARCHAR(20) COMMENT '상위 조직 ID',
ORG_TYPE VARCHAR(20) NOT NULL DEFAULT 'DEPT' COMMENT '조직 유형 (COMPANY/DEPT/TEAM)',
STATUS VARCHAR(10) NOT NULL DEFAULT 'ACTIVE' COMMENT '상태 (ACTIVE/INACTIVE)',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (PARENT_ORG_ID) REFERENCES TB_ORGANIZATION(ORG_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='조직 정보 관리';
-- 프로젝트/시스템 테이블
CREATE TABLE TB_PROJECT (
PROJECT_ID VARCHAR(20) PRIMARY KEY COMMENT '프로젝트 ID',
PROJECT_NAME VARCHAR(100) NOT NULL COMMENT '프로젝트명',
PROJECT_DESC TEXT COMMENT '프로젝트 설명',
ORG_ID VARCHAR(20) NOT NULL COMMENT '소속 조직 ID',
PROJECT_TYPE VARCHAR(20) NOT NULL DEFAULT 'SYSTEM' COMMENT '프로젝트 유형 (SYSTEM/APPLICATION/MODULE)',
PROJECT_STATUS VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT '프로젝트 상태',
START_DATE DATE COMMENT '시작일',
END_DATE DATE COMMENT '종료일',
PROJECT_MANAGER VARCHAR(50) COMMENT '프로젝트 매니저',
TECH_LEADER VARCHAR(50) COMMENT '기술 리더',
QA_LEADER VARCHAR(50) COMMENT 'QA 리더',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (ORG_ID) REFERENCES TB_ORGANIZATION(ORG_ID),
INDEX IDX_PROJECT_ORG (ORG_ID),
INDEX IDX_PROJECT_STATUS (PROJECT_STATUS)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='프로젝트/시스템 정보';
-- 2. 테스트 계획 관리 (Test Plan Management)
-- =====================================
-- 테스트 계획 마스터
CREATE TABLE TB_TEST_PLAN (
PLAN_ID VARCHAR(30) PRIMARY KEY COMMENT '테스트 계획 ID',
PLAN_NAME VARCHAR(200) NOT NULL COMMENT '테스트 계획명',
PLAN_DESC TEXT COMMENT '테스트 계획 설명',
PROJECT_ID VARCHAR(20) NOT NULL COMMENT '프로젝트 ID',
PLAN_TYPE VARCHAR(20) NOT NULL DEFAULT 'FUNCTIONAL' COMMENT '계획 유형 (FUNCTIONAL/PERFORMANCE/SECURITY/INTEGRATION)',
PLAN_PHASE VARCHAR(20) NOT NULL DEFAULT 'SYSTEM' COMMENT '테스트 단계 (UNIT/INTEGRATION/SYSTEM/UAT/REGRESSION)',
PLAN_VERSION VARCHAR(10) NOT NULL DEFAULT '1.0' COMMENT '계획 버전',
PLAN_STATUS VARCHAR(20) NOT NULL DEFAULT 'DRAFT' COMMENT '계획 상태 (DRAFT/APPROVED/ACTIVE/INACTIVE)',
RISK_LEVEL VARCHAR(10) NOT NULL DEFAULT 'MEDIUM' COMMENT '리스크 수준 (LOW/MEDIUM/HIGH/CRITICAL)',
START_DATE DATE COMMENT '계획 시작일',
END_DATE DATE COMMENT '계획 종료일',
PLAN_OWNER VARCHAR(50) NOT NULL COMMENT '계획 담당자',
APPROVED_BY VARCHAR(50) COMMENT '승인자',
APPROVED_DATE DATETIME COMMENT '승인일시',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (PROJECT_ID) REFERENCES TB_PROJECT(PROJECT_ID),
INDEX IDX_PLAN_PROJECT (PROJECT_ID),
INDEX IDX_PLAN_STATUS (PLAN_STATUS),
INDEX IDX_PLAN_PHASE (PLAN_PHASE)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='테스트 계획 마스터';
-- 테스트 스위트 (시나리오)
CREATE TABLE TB_TEST_SUITE (
SUITE_ID VARCHAR(30) PRIMARY KEY COMMENT '테스트 스위트 ID',
SUITE_NAME VARCHAR(200) NOT NULL COMMENT '테스트 스위트명',
SUITE_DESC TEXT COMMENT '테스트 스위트 설명',
PLAN_ID VARCHAR(30) NOT NULL COMMENT '테스트 계획 ID',
SUITE_TYPE VARCHAR(20) NOT NULL DEFAULT 'FUNCTIONAL' COMMENT '스위트 유형 (FUNCTIONAL/API/DATABASE/UI)',
EXECUTION_ORDER INT NOT NULL DEFAULT 1 COMMENT '실행 순서',
PREREQUISITE TEXT COMMENT '전제 조건',
IS_PARALLEL VARCHAR(1) NOT NULL DEFAULT 'N' COMMENT '병렬 실행 가능 여부 (Y/N)',
ESTIMATED_TIME INT COMMENT '예상 실행 시간 (분)',
SUITE_STATUS VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT '스위트 상태 (ACTIVE/INACTIVE)',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (PLAN_ID) REFERENCES TB_TEST_PLAN(PLAN_ID) ON DELETE CASCADE,
INDEX IDX_SUITE_PLAN (PLAN_ID),
INDEX IDX_SUITE_ORDER (PLAN_ID, EXECUTION_ORDER)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='테스트 스위트 (시나리오)';
-- 테스트 케이스
CREATE TABLE TB_TEST_CASE (
CASE_ID VARCHAR(40) PRIMARY KEY COMMENT '테스트 케이스 ID',
CASE_NAME VARCHAR(300) NOT NULL COMMENT '테스트 케이스명',
CASE_DESC TEXT COMMENT '테스트 케이스 설명',
SUITE_ID VARCHAR(30) NOT NULL COMMENT '테스트 스위트 ID',
CASE_TYPE VARCHAR(20) NOT NULL DEFAULT 'PROCESS' COMMENT '케이스 유형 (PROCESS/ANSWER_SHEET/NOTIFICATION)',
CASE_PRIORITY VARCHAR(10) NOT NULL DEFAULT 'MEDIUM' COMMENT '우선순위 (LOW/MEDIUM/HIGH/CRITICAL)',
EXECUTION_ORDER INT NOT NULL DEFAULT 1 COMMENT '실행 순서',
PREREQUISITE TEXT COMMENT '전제 조건',
EXPECTED_RESULT TEXT COMMENT '예상 결과',
TEST_DATA TEXT COMMENT '테스트 데이터',
IS_AUTOMATED VARCHAR(1) NOT NULL DEFAULT 'Y' COMMENT '자동화 여부 (Y/N)',
ESTIMATED_TIME INT COMMENT '예상 실행 시간 (분)',
CASE_STATUS VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT '케이스 상태 (ACTIVE/INACTIVE)',
TAGS VARCHAR(500) COMMENT '태그 (쉼표 구분)',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (SUITE_ID) REFERENCES TB_TEST_SUITE(SUITE_ID) ON DELETE CASCADE,
INDEX IDX_CASE_SUITE (SUITE_ID),
INDEX IDX_CASE_TYPE (CASE_TYPE),
INDEX IDX_CASE_ORDER (SUITE_ID, EXECUTION_ORDER),
INDEX IDX_CASE_PRIORITY (CASE_PRIORITY)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='테스트 케이스';
-- 테스트 스텝 (액티비티)
CREATE TABLE TB_TEST_STEP (
STEP_ID VARCHAR(50) PRIMARY KEY COMMENT '테스트 스텝 ID',
STEP_NAME VARCHAR(300) NOT NULL COMMENT '테스트 스텝명',
STEP_DESC TEXT COMMENT '테스트 스텝 설명',
CASE_ID VARCHAR(40) NOT NULL COMMENT '테스트 케이스 ID',
STEP_NO INT NOT NULL DEFAULT 1 COMMENT '스텝 번호',
STEP_TYPE VARCHAR(20) NOT NULL DEFAULT 'SQL' COMMENT '스텝 유형 (SQL/API/MANUAL/VALIDATION)',
ACTION_TYPE VARCHAR(20) NOT NULL DEFAULT 'EXECUTE' COMMENT '실행 유형 (EXECUTE/VALIDATE/COMPARE)',
SQL_STATEMENT TEXT COMMENT 'SQL 문장',
API_ENDPOINT VARCHAR(500) COMMENT 'API 엔드포인트',
API_METHOD VARCHAR(10) COMMENT 'API 메소드 (GET/POST/PUT/DELETE)',
API_HEADERS TEXT COMMENT 'API 헤더',
API_BODY TEXT COMMENT 'API 바디',
VALIDATION_RULE TEXT COMMENT '검증 규칙',
COMPARISON_TYPE VARCHAR(20) COMMENT '비교 유형 (SIMPLE/MAPPING/REFERENCE/FUZZY)',
EXPECTED_VALUE TEXT COMMENT '예상 값',
IS_CRITICAL VARCHAR(1) NOT NULL DEFAULT 'N' COMMENT '필수 여부 (Y/N)',
TIMEOUT_SECONDS INT DEFAULT 300 COMMENT '타임아웃 (초)',
RETRY_COUNT INT DEFAULT 0 COMMENT '재시도 횟수',
STEP_STATUS VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT '스텝 상태 (ACTIVE/INACTIVE)',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (CASE_ID) REFERENCES TB_TEST_CASE(CASE_ID) ON DELETE CASCADE,
INDEX IDX_STEP_CASE (CASE_ID),
INDEX IDX_STEP_NO (CASE_ID, STEP_NO),
INDEX IDX_STEP_TYPE (STEP_TYPE)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='테스트 스텝 (액티비티)';
-- 3. 테스트 실행 관리 (Test Execution Management)
-- =====================================
-- 테스트 실행 인스턴스
CREATE TABLE TB_TEST_EXECUTION (
EXECUTION_ID VARCHAR(40) PRIMARY KEY COMMENT '실행 인스턴스 ID',
EXECUTION_NAME VARCHAR(200) NOT NULL COMMENT '실행 인스턴스명',
PLAN_ID VARCHAR(30) NOT NULL COMMENT '테스트 계획 ID',
EXECUTION_ROUND INT NOT NULL DEFAULT 1 COMMENT '실행 차수',
EXECUTION_TYPE VARCHAR(20) NOT NULL DEFAULT 'MANUAL' COMMENT '실행 유형 (MANUAL/SCHEDULED/TRIGGERED)',
EXECUTION_MODE VARCHAR(20) NOT NULL DEFAULT 'FULL' COMMENT '실행 모드 (FULL/PARTIAL/RERUN)',
ENVIRONMENT VARCHAR(50) NOT NULL COMMENT '테스트 환경 (DEV/QA/STG/PROD)',
EXECUTION_STATUS VARCHAR(20) NOT NULL DEFAULT 'READY' COMMENT '실행 상태 (READY/RUNNING/COMPLETED/FAILED/CANCELLED)',
START_TIME DATETIME COMMENT '시작 시간',
END_TIME DATETIME COMMENT '종료 시간',
DURATION_MINUTES INT COMMENT '실행 시간 (분)',
TOTAL_CASES INT DEFAULT 0 COMMENT '전체 케이스 수',
PASSED_CASES INT DEFAULT 0 COMMENT '성공 케이스 수',
FAILED_CASES INT DEFAULT 0 COMMENT '실패 케이스 수',
SKIPPED_CASES INT DEFAULT 0 COMMENT '건너뛴 케이스 수',
ERROR_CASES INT DEFAULT 0 COMMENT '오류 케이스 수',
PASS_RATE DECIMAL(5,2) DEFAULT 0.00 COMMENT '성공률 (%)',
EXECUTED_BY VARCHAR(50) NOT NULL COMMENT '실행자',
EXECUTION_NOTES TEXT COMMENT '실행 노트',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (PLAN_ID) REFERENCES TB_TEST_PLAN(PLAN_ID),
INDEX IDX_EXECUTION_PLAN (PLAN_ID),
INDEX IDX_EXECUTION_STATUS (EXECUTION_STATUS),
INDEX IDX_EXECUTION_DATE (CREATED_DATE),
INDEX IDX_EXECUTION_ROUND (PLAN_ID, EXECUTION_ROUND)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='테스트 실행 인스턴스';
-- 테스트 실행 결과
CREATE TABLE TB_TEST_EXECUTION_RESULT (
RESULT_ID VARCHAR(50) PRIMARY KEY COMMENT '실행 결과 ID',
EXECUTION_ID VARCHAR(40) NOT NULL COMMENT '실행 인스턴스 ID',
CASE_ID VARCHAR(40) NOT NULL COMMENT '테스트 케이스 ID',
SUITE_ID VARCHAR(30) NOT NULL COMMENT '테스트 스위트 ID',
EXECUTION_ORDER INT NOT NULL COMMENT '실행 순서',
RESULT_STATUS VARCHAR(20) NOT NULL DEFAULT 'NOT_RUN' COMMENT '결과 상태 (NOT_RUN/RUNNING/PASSED/FAILED/ERROR/SKIPPED)',
START_TIME DATETIME COMMENT '시작 시간',
END_TIME DATETIME COMMENT '종료 시간',
DURATION_SECONDS INT COMMENT '실행 시간 (초)',
ERROR_MESSAGE TEXT COMMENT '오류 메시지',
ACTUAL_RESULT TEXT COMMENT '실제 결과',
COMPARISON_RESULT TEXT COMMENT '비교 결과 상세',
SCREENSHOTS JSON COMMENT '스크린샷 정보 (JSON)',
LOGS TEXT COMMENT '실행 로그',
RETRY_COUNT INT DEFAULT 0 COMMENT '재시도 횟수',
EXECUTED_BY VARCHAR(50) COMMENT '실행자',
VALIDATED_BY VARCHAR(50) COMMENT '검증자',
VALIDATION_DATE DATETIME COMMENT '검증일시',
COMMENTS TEXT COMMENT '코멘트',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (EXECUTION_ID) REFERENCES TB_TEST_EXECUTION(EXECUTION_ID) ON DELETE CASCADE,
FOREIGN KEY (CASE_ID) REFERENCES TB_TEST_CASE(CASE_ID),
FOREIGN KEY (SUITE_ID) REFERENCES TB_TEST_SUITE(SUITE_ID),
INDEX IDX_RESULT_EXECUTION (EXECUTION_ID),
INDEX IDX_RESULT_CASE (CASE_ID),
INDEX IDX_RESULT_STATUS (RESULT_STATUS),
INDEX IDX_RESULT_DATE (CREATED_DATE)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='테스트 실행 결과';
-- 테스트 스텝 실행 결과
CREATE TABLE TB_TEST_STEP_RESULT (
STEP_RESULT_ID VARCHAR(60) PRIMARY KEY COMMENT '스텝 실행 결과 ID',
RESULT_ID VARCHAR(50) NOT NULL COMMENT '케이스 실행 결과 ID',
STEP_ID VARCHAR(50) NOT NULL COMMENT '테스트 스텝 ID',
STEP_NO INT NOT NULL COMMENT '스텝 번호',
STEP_STATUS VARCHAR(20) NOT NULL DEFAULT 'NOT_RUN' COMMENT '스텝 상태 (NOT_RUN/RUNNING/PASSED/FAILED/ERROR/SKIPPED)',
START_TIME DATETIME COMMENT '시작 시간',
END_TIME DATETIME COMMENT '종료 시간',
DURATION_MILLISECONDS INT COMMENT '실행 시간 (밀리초)',
EXECUTED_SQL TEXT COMMENT '실행된 SQL',
SQL_RESULT TEXT COMMENT 'SQL 실행 결과',
COMPARISON_TYPE VARCHAR(20) COMMENT '적용된 비교 유형',
EXPECTED_VALUE TEXT COMMENT '예상 값',
ACTUAL_VALUE TEXT COMMENT '실제 값',
COMPARISON_RESULT VARCHAR(20) COMMENT '비교 결과 (MATCH/MISMATCH/ERROR)',
SIMILARITY_SCORE DECIMAL(5,2) COMMENT '유사도 점수 (퍼지 매칭)',
ERROR_MESSAGE TEXT COMMENT '오류 메시지',
API_REQUEST TEXT COMMENT 'API 요청 내용',
API_RESPONSE TEXT COMMENT 'API 응답 내용',
HTTP_STATUS_CODE INT COMMENT 'HTTP 상태 코드',
VALIDATION_DETAILS JSON COMMENT '검증 상세 정보 (JSON)',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
FOREIGN KEY (RESULT_ID) REFERENCES TB_TEST_EXECUTION_RESULT(RESULT_ID) ON DELETE CASCADE,
FOREIGN KEY (STEP_ID) REFERENCES TB_TEST_STEP(STEP_ID),
INDEX IDX_STEP_RESULT_MAIN (RESULT_ID),
INDEX IDX_STEP_RESULT_STEP (STEP_ID),
INDEX IDX_STEP_RESULT_STATUS (STEP_STATUS)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='테스트 스텝 실행 결과';
-- 4. 결함 관리 (Defect Management)
-- =====================================
-- 결함 정보
CREATE TABLE TB_DEFECT (
DEFECT_ID VARCHAR(30) PRIMARY KEY COMMENT '결함 ID',
DEFECT_TITLE VARCHAR(300) NOT NULL COMMENT '결함 제목',
DEFECT_DESC TEXT NOT NULL COMMENT '결함 설명',
PROJECT_ID VARCHAR(20) NOT NULL COMMENT '프로젝트 ID',
EXECUTION_ID VARCHAR(40) COMMENT '관련 실행 인스턴스 ID',
CASE_ID VARCHAR(40) COMMENT '관련 테스트 케이스 ID',
DEFECT_TYPE VARCHAR(20) NOT NULL DEFAULT 'FUNCTIONAL' COMMENT '결함 유형 (FUNCTIONAL/PERFORMANCE/UI/DATA/SECURITY)',
SEVERITY VARCHAR(10) NOT NULL DEFAULT 'MEDIUM' COMMENT '심각도 (LOW/MEDIUM/HIGH/CRITICAL)',
PRIORITY VARCHAR(10) NOT NULL DEFAULT 'MEDIUM' COMMENT '우선순위 (LOW/MEDIUM/HIGH/URGENT)',
DEFECT_STATUS VARCHAR(20) NOT NULL DEFAULT 'NEW' COMMENT '결함 상태 (NEW/ASSIGNED/IN_PROGRESS/RESOLVED/VERIFIED/CLOSED/REOPENED)',
ENVIRONMENT VARCHAR(50) COMMENT '발생 환경',
STEPS_TO_REPRODUCE TEXT COMMENT '재현 단계',
ACTUAL_RESULT TEXT COMMENT '실제 결과',
EXPECTED_RESULT TEXT COMMENT '예상 결과',
WORKAROUND TEXT COMMENT '임시 해결방안',
ROOT_CAUSE TEXT COMMENT '근본 원인',
RESOLUTION TEXT COMMENT '해결 방법',
ATTACHMENTS JSON COMMENT '첨부파일 정보 (JSON)',
REPORTER VARCHAR(50) NOT NULL COMMENT '신고자',
ASSIGNEE VARCHAR(50) COMMENT '담당자',
VERIFIER VARCHAR(50) COMMENT '검증자',
REPORTED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '신고일시',
ASSIGNED_DATE DATETIME COMMENT '할당일시',
RESOLVED_DATE DATETIME COMMENT '해결일시',
VERIFIED_DATE DATETIME COMMENT '검증일시',
CLOSED_DATE DATETIME COMMENT '종료일시',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (PROJECT_ID) REFERENCES TB_PROJECT(PROJECT_ID),
FOREIGN KEY (EXECUTION_ID) REFERENCES TB_TEST_EXECUTION(EXECUTION_ID),
FOREIGN KEY (CASE_ID) REFERENCES TB_TEST_CASE(CASE_ID),
INDEX IDX_DEFECT_PROJECT (PROJECT_ID),
INDEX IDX_DEFECT_STATUS (DEFECT_STATUS),
INDEX IDX_DEFECT_SEVERITY (SEVERITY),
INDEX IDX_DEFECT_ASSIGNEE (ASSIGNEE),
INDEX IDX_DEFECT_REPORTED_DATE (REPORTED_DATE)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='결함 정보';
-- 5. 요구사항 추적성 (Requirements Traceability)
-- =====================================
-- 요구사항 정보
CREATE TABLE TB_REQUIREMENT (
REQ_ID VARCHAR(30) PRIMARY KEY COMMENT '요구사항 ID',
REQ_NAME VARCHAR(300) NOT NULL COMMENT '요구사항명',
REQ_DESC TEXT COMMENT '요구사항 설명',
PROJECT_ID VARCHAR(20) NOT NULL COMMENT '프로젝트 ID',
REQ_TYPE VARCHAR(20) NOT NULL DEFAULT 'FUNCTIONAL' COMMENT '요구사항 유형 (FUNCTIONAL/NON_FUNCTIONAL/BUSINESS/TECHNICAL)',
REQ_CATEGORY VARCHAR(50) COMMENT '요구사항 카테고리',
REQ_PRIORITY VARCHAR(10) NOT NULL DEFAULT 'MEDIUM' COMMENT '우선순위 (LOW/MEDIUM/HIGH/CRITICAL)',
REQ_STATUS VARCHAR(20) NOT NULL DEFAULT 'DRAFT' COMMENT '요구사항 상태 (DRAFT/APPROVED/IMPLEMENTED/VERIFIED)',
PARENT_REQ_ID VARCHAR(30) COMMENT '상위 요구사항 ID',
REQ_SOURCE VARCHAR(100) COMMENT '요구사항 출처',
ACCEPTANCE_CRITERIA TEXT COMMENT '수용 기준',
BUSINESS_VALUE TEXT COMMENT '비즈니스 가치',
REQ_OWNER VARCHAR(50) NOT NULL COMMENT '요구사항 담당자',
APPROVED_BY VARCHAR(50) COMMENT '승인자',
APPROVED_DATE DATETIME COMMENT '승인일시',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (PROJECT_ID) REFERENCES TB_PROJECT(PROJECT_ID),
FOREIGN KEY (PARENT_REQ_ID) REFERENCES TB_REQUIREMENT(REQ_ID),
INDEX IDX_REQ_PROJECT (PROJECT_ID),
INDEX IDX_REQ_STATUS (REQ_STATUS),
INDEX IDX_REQ_TYPE (REQ_TYPE),
INDEX IDX_REQ_PARENT (PARENT_REQ_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='요구사항 정보';
-- 요구사항-테스트케이스 추적성 매트릭스
CREATE TABLE TB_REQUIREMENT_TRACE (
TRACE_ID VARCHAR(40) PRIMARY KEY COMMENT '추적성 ID',
REQ_ID VARCHAR(30) NOT NULL COMMENT '요구사항 ID',
CASE_ID VARCHAR(40) NOT NULL COMMENT '테스트 케이스 ID',
TRACE_TYPE VARCHAR(20) NOT NULL DEFAULT 'VERIFY' COMMENT '추적 유형 (VERIFY/VALIDATE/SUPPORT)',
COVERAGE_PERCENTAGE DECIMAL(5,2) DEFAULT 100.00 COMMENT '커버리지 비율 (%)',
TRACE_STATUS VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT '추적 상태 (ACTIVE/INACTIVE)',
TRACE_NOTES TEXT COMMENT '추적 노트',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (REQ_ID) REFERENCES TB_REQUIREMENT(REQ_ID) ON DELETE CASCADE,
FOREIGN KEY (CASE_ID) REFERENCES TB_TEST_CASE(CASE_ID) ON DELETE CASCADE,
UNIQUE KEY UK_REQ_CASE (REQ_ID, CASE_ID),
INDEX IDX_TRACE_REQ (REQ_ID),
INDEX IDX_TRACE_CASE (CASE_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='요구사항-테스트케이스 추적성 매트릭스';
-- 6. 환경 및 설정 관리
-- =====================================
-- 테스트 환경 정보
CREATE TABLE TB_TEST_ENVIRONMENT (
ENV_ID VARCHAR(20) PRIMARY KEY COMMENT '환경 ID',
ENV_NAME VARCHAR(100) NOT NULL COMMENT '환경명',
ENV_DESC TEXT COMMENT '환경 설명',
PROJECT_ID VARCHAR(20) NOT NULL COMMENT '프로젝트 ID',
ENV_TYPE VARCHAR(20) NOT NULL DEFAULT 'QA' COMMENT '환경 유형 (DEV/QA/STG/PROD/LOCAL)',
DATABASE_URL VARCHAR(500) COMMENT '데이터베이스 URL',
DATABASE_NAME VARCHAR(100) COMMENT '데이터베이스명',
DATABASE_USER VARCHAR(100) COMMENT '데이터베이스 사용자',
DATABASE_PASSWORD VARCHAR(200) COMMENT '데이터베이스 비밀번호 (암호화)',
API_BASE_URL VARCHAR(500) COMMENT 'API 기본 URL',
WEB_URL VARCHAR(500) COMMENT '웹 애플리케이션 URL',
ENV_STATUS VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT '환경 상태 (ACTIVE/INACTIVE/MAINTENANCE)',
MAINTENANCE_WINDOW TEXT COMMENT '유지보수 시간',
ACCESS_CREDENTIALS JSON COMMENT '접근 자격증명 (JSON, 암호화)',
ENVIRONMENT_VARIABLES JSON COMMENT '환경 변수 (JSON)',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (PROJECT_ID) REFERENCES TB_PROJECT(PROJECT_ID),
INDEX IDX_ENV_PROJECT (PROJECT_ID),
INDEX IDX_ENV_TYPE (ENV_TYPE),
INDEX IDX_ENV_STATUS (ENV_STATUS)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='테스트 환경 정보';
-- 시스템 변수 및 파라미터
CREATE TABLE TB_SYSTEM_PARAMETER (
PARAM_ID VARCHAR(50) PRIMARY KEY COMMENT '파라미터 ID',
PARAM_NAME VARCHAR(100) NOT NULL COMMENT '파라미터명',
PARAM_DESC TEXT COMMENT '파라미터 설명',
PROJECT_ID VARCHAR(20) COMMENT '프로젝트 ID (전역인 경우 NULL)',
PARAM_CATEGORY VARCHAR(50) NOT NULL DEFAULT 'SYSTEM' COMMENT '파라미터 카테고리 (SYSTEM/PROJECT/TEST/ENVIRONMENT)',
PARAM_TYPE VARCHAR(20) NOT NULL DEFAULT 'STRING' COMMENT '파라미터 유형 (STRING/NUMBER/DATE/BOOLEAN/JSON)',
PARAM_VALUE TEXT NOT NULL COMMENT '파라미터 값',
DEFAULT_VALUE TEXT COMMENT '기본값',
IS_ENCRYPTED VARCHAR(1) NOT NULL DEFAULT 'N' COMMENT '암호화 여부 (Y/N)',
IS_EDITABLE VARCHAR(1) NOT NULL DEFAULT 'Y' COMMENT '편집 가능 여부 (Y/N)',
VALIDATION_RULE VARCHAR(500) COMMENT '검증 규칙 (정규식 등)',
PARAM_ORDER INT DEFAULT 1 COMMENT '정렬 순서',
PARAM_STATUS VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT '파라미터 상태 (ACTIVE/INACTIVE)',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (PROJECT_ID) REFERENCES TB_PROJECT(PROJECT_ID),
INDEX IDX_PARAM_PROJECT (PROJECT_ID),
INDEX IDX_PARAM_CATEGORY (PARAM_CATEGORY),
INDEX IDX_PARAM_NAME (PARAM_NAME)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='시스템 파라미터';
-- 7. 알림 및 모니터링
-- =====================================
-- 알림 설정
CREATE TABLE TB_NOTIFICATION_CONFIG (
CONFIG_ID VARCHAR(30) PRIMARY KEY COMMENT '알림 설정 ID',
CONFIG_NAME VARCHAR(200) NOT NULL COMMENT '알림 설정명',
PROJECT_ID VARCHAR(20) NOT NULL COMMENT '프로젝트 ID',
NOTIFICATION_TYPE VARCHAR(20) NOT NULL DEFAULT 'EMAIL' COMMENT '알림 유형 (EMAIL/WEBHOOK/SMS/TEAMS)',
TRIGGER_EVENT VARCHAR(30) NOT NULL COMMENT '트리거 이벤트 (TEST_COMPLETED/TEST_FAILED/DEFECT_CREATED/SCHEDULE)',
TRIGGER_CONDITION TEXT COMMENT '트리거 조건 (JSON)',
RECIPIENTS TEXT NOT NULL COMMENT '수신자 목록 (쉼표 구분)',
MESSAGE_TEMPLATE TEXT COMMENT '메시지 템플릿',
SCHEDULE_CRON VARCHAR(100) COMMENT '스케줄 (cron 표현식)',
IS_ACTIVE VARCHAR(1) NOT NULL DEFAULT 'Y' COMMENT '활성화 여부 (Y/N)',
LAST_SENT_DATE DATETIME COMMENT '마지막 발송일시',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (PROJECT_ID) REFERENCES TB_PROJECT(PROJECT_ID),
INDEX IDX_NOTIFICATION_PROJECT (PROJECT_ID),
INDEX IDX_NOTIFICATION_TYPE (NOTIFICATION_TYPE),
INDEX IDX_NOTIFICATION_EVENT (TRIGGER_EVENT)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='알림 설정';
-- 알림 발송 이력
CREATE TABLE TB_NOTIFICATION_HISTORY (
HISTORY_ID VARCHAR(40) PRIMARY KEY COMMENT '발송 이력 ID',
CONFIG_ID VARCHAR(30) NOT NULL COMMENT '알림 설정 ID',
TRIGGER_SOURCE_ID VARCHAR(50) COMMENT '트리거 소스 ID (실행 ID, 결함 ID 등)',
NOTIFICATION_TYPE VARCHAR(20) NOT NULL COMMENT '알림 유형',
RECIPIENTS TEXT NOT NULL COMMENT '실제 수신자',
SUBJECT VARCHAR(500) COMMENT '제목',
MESSAGE_CONTENT TEXT COMMENT '메시지 내용',
SEND_STATUS VARCHAR(20) NOT NULL DEFAULT 'PENDING' COMMENT '발송 상태 (PENDING/SENT/FAILED)',
SEND_TIME DATETIME COMMENT '발송 시간',
ERROR_MESSAGE TEXT COMMENT '오류 메시지',
EXTERNAL_ID VARCHAR(200) COMMENT '외부 시스템 ID',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
FOREIGN KEY (CONFIG_ID) REFERENCES TB_NOTIFICATION_CONFIG(CONFIG_ID),
INDEX IDX_HISTORY_CONFIG (CONFIG_ID),
INDEX IDX_HISTORY_STATUS (SEND_STATUS),
INDEX IDX_HISTORY_DATE (CREATED_DATE)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='알림 발송 이력';
-- 8. 사용자 및 권한 관리
-- =====================================
-- 사용자 정보
CREATE TABLE TB_USER (
USER_ID VARCHAR(50) PRIMARY KEY COMMENT '사용자 ID',
USER_NAME VARCHAR(100) NOT NULL COMMENT '사용자명',
EMAIL VARCHAR(200) NOT NULL COMMENT '이메일',
PHONE VARCHAR(20) COMMENT '전화번호',
ORG_ID VARCHAR(20) NOT NULL COMMENT '소속 조직 ID',
USER_ROLE VARCHAR(20) NOT NULL DEFAULT 'TESTER' COMMENT '사용자 역할 (ADMIN/PM/QA_LEAD/TESTER/DEVELOPER/VIEWER)',
USER_STATUS VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT '사용자 상태 (ACTIVE/INACTIVE/LOCKED)',
LAST_LOGIN_DATE DATETIME COMMENT '마지막 로그인 일시',
PASSWORD_HASH VARCHAR(255) COMMENT '비밀번호 해시',
PASSWORD_CHANGED_DATE DATETIME COMMENT '비밀번호 변경일시',
ACCOUNT_LOCKED_DATE DATETIME COMMENT '계정 잠금일시',
PREFERENCES JSON COMMENT '사용자 설정 (JSON)',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (ORG_ID) REFERENCES TB_ORGANIZATION(ORG_ID),
UNIQUE KEY UK_USER_EMAIL (EMAIL),
INDEX IDX_USER_ORG (ORG_ID),
INDEX IDX_USER_ROLE (USER_ROLE),
INDEX IDX_USER_STATUS (USER_STATUS)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='사용자 정보';
-- 프로젝트별 사용자 권한
CREATE TABLE TB_PROJECT_USER_ROLE (
ROLE_ID VARCHAR(40) PRIMARY KEY COMMENT '역할 ID',
PROJECT_ID VARCHAR(20) NOT NULL COMMENT '프로젝트 ID',
USER_ID VARCHAR(50) NOT NULL COMMENT '사용자 ID',
PROJECT_ROLE VARCHAR(20) NOT NULL DEFAULT 'TESTER' COMMENT '프로젝트 내 역할 (PM/QA_LEAD/TESTER/DEVELOPER/VIEWER)',
PERMISSIONS JSON COMMENT '상세 권한 (JSON)',
ROLE_STATUS VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT '역할 상태 (ACTIVE/INACTIVE)',
ASSIGNED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '할당일시',
ASSIGNED_BY VARCHAR(50) NOT NULL COMMENT '할당자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
FOREIGN KEY (PROJECT_ID) REFERENCES TB_PROJECT(PROJECT_ID),
FOREIGN KEY (USER_ID) REFERENCES TB_USER(USER_ID),
UNIQUE KEY UK_PROJECT_USER (PROJECT_ID, USER_ID),
INDEX IDX_ROLE_PROJECT (PROJECT_ID),
INDEX IDX_ROLE_USER (USER_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='프로젝트별 사용자 권한';
-- 9. 메트릭 및 보고서
-- =====================================
-- 테스트 메트릭 집계
CREATE TABLE TB_TEST_METRICS (
METRIC_ID VARCHAR(40) PRIMARY KEY COMMENT '메트릭 ID',
PROJECT_ID VARCHAR(20) NOT NULL COMMENT '프로젝트 ID',
EXECUTION_ID VARCHAR(40) COMMENT '실행 인스턴스 ID',
METRIC_DATE DATE NOT NULL COMMENT '메트릭 일자',
METRIC_TYPE VARCHAR(30) NOT NULL COMMENT '메트릭 유형 (DAILY/WEEKLY/MONTHLY/EXECUTION)',
TOTAL_PLANS INT DEFAULT 0 COMMENT '전체 계획 수',
ACTIVE_PLANS INT DEFAULT 0 COMMENT '활성 계획 수',
TOTAL_SUITES INT DEFAULT 0 COMMENT '전체 스위트 수',
TOTAL_CASES INT DEFAULT 0 COMMENT '전체 케이스 수',
AUTOMATED_CASES INT DEFAULT 0 COMMENT '자동화 케이스 수',
EXECUTED_CASES INT DEFAULT 0 COMMENT '실행된 케이스 수',
PASSED_CASES INT DEFAULT 0 COMMENT '성공 케이스 수',
FAILED_CASES INT DEFAULT 0 COMMENT '실패 케이스 수',
BLOCKED_CASES INT DEFAULT 0 COMMENT '블록된 케이스 수',
PASS_RATE DECIMAL(5,2) DEFAULT 0.00 COMMENT '성공률 (%)',
AUTOMATION_RATE DECIMAL(5,2) DEFAULT 0.00 COMMENT '자동화율 (%)',
EXECUTION_TIME_MINUTES INT DEFAULT 0 COMMENT '총 실행 시간 (분)',
AVG_EXECUTION_TIME DECIMAL(8,2) DEFAULT 0.00 COMMENT '평균 실행 시간 (초)',
DEFECT_COUNT INT DEFAULT 0 COMMENT '결함 수',
CRITICAL_DEFECTS INT DEFAULT 0 COMMENT '심각한 결함 수',
DEFECT_DENSITY DECIMAL(8,4) DEFAULT 0.0000 COMMENT '결함 밀도 (결함수/케이스수)',
REQUIREMENT_COVERAGE DECIMAL(5,2) DEFAULT 0.00 COMMENT '요구사항 커버리지 (%)',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
FOREIGN KEY (PROJECT_ID) REFERENCES TB_PROJECT(PROJECT_ID),
FOREIGN KEY (EXECUTION_ID) REFERENCES TB_TEST_EXECUTION(EXECUTION_ID),
INDEX IDX_METRICS_PROJECT (PROJECT_ID),
INDEX IDX_METRICS_DATE (METRIC_DATE),
INDEX IDX_METRICS_TYPE (METRIC_TYPE)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='테스트 메트릭 집계';
-- 10. 외부 시스템 연동
-- =====================================
-- 외부 시스템 정보
CREATE TABLE TB_EXTERNAL_SYSTEM (
SYSTEM_ID VARCHAR(20) PRIMARY KEY COMMENT '외부 시스템 ID',
SYSTEM_NAME VARCHAR(100) NOT NULL COMMENT '시스템명',
SYSTEM_DESC TEXT COMMENT '시스템 설명',
SYSTEM_TYPE VARCHAR(20) NOT NULL DEFAULT 'REST_API' COMMENT '시스템 유형 (REST_API/SOAP/DATABASE/FILE)',
BASE_URL VARCHAR(500) COMMENT '기본 URL',
AUTH_TYPE VARCHAR(20) DEFAULT 'NONE' COMMENT '인증 유형 (NONE/BASIC/BEARER/OAUTH2/API_KEY)',
AUTH_CONFIG JSON COMMENT '인증 설정 (JSON, 암호화)',
CONNECTION_TIMEOUT INT DEFAULT 30 COMMENT '연결 타임아웃 (초)',
READ_TIMEOUT INT DEFAULT 60 COMMENT '읽기 타임아웃 (초)',
RETRY_COUNT INT DEFAULT 3 COMMENT '재시도 횟수',
SYSTEM_STATUS VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT '시스템 상태 (ACTIVE/INACTIVE/MAINTENANCE)',
HEALTH_CHECK_URL VARCHAR(500) COMMENT '헬스체크 URL',
LAST_HEALTH_CHECK DATETIME COMMENT '마지막 헬스체크 시간',
HEALTH_STATUS VARCHAR(20) DEFAULT 'UNKNOWN' COMMENT '헬스 상태 (HEALTHY/UNHEALTHY/UNKNOWN)',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
INDEX IDX_EXTERNAL_TYPE (SYSTEM_TYPE),
INDEX IDX_EXTERNAL_STATUS (SYSTEM_STATUS)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='외부 시스템 정보';
-- API 테스트 정보
CREATE TABLE TB_API_TEST (
API_TEST_ID VARCHAR(40) PRIMARY KEY COMMENT 'API 테스트 ID',
TEST_NAME VARCHAR(200) NOT NULL COMMENT '테스트명',
SYSTEM_ID VARCHAR(20) NOT NULL COMMENT '대상 시스템 ID',
API_ENDPOINT VARCHAR(500) NOT NULL COMMENT 'API 엔드포인트',
HTTP_METHOD VARCHAR(10) NOT NULL DEFAULT 'GET' COMMENT 'HTTP 메소드',
REQUEST_HEADERS JSON COMMENT '요청 헤더 (JSON)',
REQUEST_BODY TEXT COMMENT '요청 바디',
QUERY_PARAMETERS JSON COMMENT '쿼리 파라미터 (JSON)',
EXPECTED_STATUS_CODE INT DEFAULT 200 COMMENT '예상 HTTP 상태 코드',
EXPECTED_RESPONSE TEXT COMMENT '예상 응답',
RESPONSE_VALIDATION JSON COMMENT '응답 검증 규칙 (JSON)',
TIMEOUT_SECONDS INT DEFAULT 30 COMMENT '타임아웃 (초)',
IS_ACTIVE VARCHAR(1) NOT NULL DEFAULT 'Y' COMMENT '활성화 여부 (Y/N)',
CREATED_BY VARCHAR(50) NOT NULL COMMENT '생성자',
CREATED_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '생성일시',
UPDATED_BY VARCHAR(50) COMMENT '수정자',
UPDATED_DATE DATETIME COMMENT '수정일시',
FOREIGN KEY (SYSTEM_ID) REFERENCES TB_EXTERNAL_SYSTEM(SYSTEM_ID),
INDEX IDX_API_SYSTEM (SYSTEM_ID),
INDEX IDX_API_METHOD (HTTP_METHOD)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='API 테스트 정보';
-- =====================================
-- 뷰(View) 생성
-- =====================================
-- 테스트 실행 현황 뷰
CREATE VIEW VW_TEST_EXECUTION_STATUS AS
SELECT
te.EXECUTION_ID,
te.EXECUTION_NAME,
tp.PLAN_NAME,
tp.PROJECT_ID,
pr.PROJECT_NAME,
te.EXECUTION_ROUND,
te.ENVIRONMENT,
te.EXECUTION_STATUS,
te.START_TIME,
te.END_TIME,
te.DURATION_MINUTES,
te.TOTAL_CASES,
te.PASSED_CASES,
te.FAILED_CASES,
te.ERROR_CASES,
te.PASS_RATE,
te.EXECUTED_BY,
COUNT(ter.RESULT_ID) as ACTUAL_EXECUTED_CASES,
COUNT(CASE WHEN ter.RESULT_STATUS = 'PASSED' THEN 1 END) as ACTUAL_PASSED_CASES,
COUNT(CASE WHEN ter.RESULT_STATUS = 'FAILED' THEN 1 END) as ACTUAL_FAILED_CASES
FROM TB_TEST_EXECUTION te
INNER JOIN TB_TEST_PLAN tp ON te.PLAN_ID = tp.PLAN_ID
INNER JOIN TB_PROJECT pr ON tp.PROJECT_ID = pr.PROJECT_ID
LEFT JOIN TB_TEST_EXECUTION_RESULT ter ON te.EXECUTION_ID = ter.EXECUTION_ID
GROUP BY te.EXECUTION_ID, te.EXECUTION_NAME, tp.PLAN_NAME, tp.PROJECT_ID, pr.PROJECT_NAME,
te.EXECUTION_ROUND, te.ENVIRONMENT, te.EXECUTION_STATUS, te.START_TIME, te.END_TIME,
te.DURATION_MINUTES, te.TOTAL_CASES, te.PASSED_CASES, te.FAILED_CASES,
te.ERROR_CASES, te.PASS_RATE, te.EXECUTED_BY;
-- 요구사항 커버리지 뷰
CREATE VIEW VW_REQUIREMENT_COVERAGE AS
SELECT
r.REQ_ID,
r.REQ_NAME,
r.PROJECT_ID,
p.PROJECT_NAME,
r.REQ_TYPE,
r.REQ_PRIORITY,
r.REQ_STATUS,
COUNT(rt.CASE_ID) as LINKED_TEST_CASES,
COUNT(CASE WHEN tc.CASE_STATUS = 'ACTIVE' THEN 1 END) as ACTIVE_TEST_CASES,
CASE
WHEN COUNT(rt.CASE_ID) > 0 THEN 'COVERED'
ELSE 'NOT_COVERED'
END as COVERAGE_STATUS,
AVG(rt.COVERAGE_PERCENTAGE) as AVG_COVERAGE_PERCENTAGE
FROM TB_REQUIREMENT r
INNER JOIN TB_PROJECT p ON r.PROJECT_ID = p.PROJECT_ID
LEFT JOIN TB_REQUIREMENT_TRACE rt ON r.REQ_ID = rt.REQ_ID AND rt.TRACE_STATUS = 'ACTIVE'
LEFT JOIN TB_TEST_CASE tc ON rt.CASE_ID = tc.CASE_ID
GROUP BY r.REQ_ID, r.REQ_NAME, r.PROJECT_ID, p.PROJECT_NAME, r.REQ_TYPE, r.REQ_PRIORITY, r.REQ_STATUS;
-- 결함 통계 뷰
CREATE VIEW VW_DEFECT_STATISTICS AS
SELECT
d.PROJECT_ID,
p.PROJECT_NAME,
d.DEFECT_TYPE,
d.SEVERITY,
d.DEFECT_STATUS,
COUNT(*) as DEFECT_COUNT,
COUNT(CASE WHEN d.DEFECT_STATUS IN ('NEW', 'ASSIGNED', 'IN_PROGRESS') THEN 1 END) as OPEN_DEFECTS,
COUNT(CASE WHEN d.DEFECT_STATUS IN ('RESOLVED', 'VERIFIED', 'CLOSED') THEN 1 END) as CLOSED_DEFECTS,
AVG(CASE
WHEN d.RESOLVED_DATE IS NOT NULL AND d.REPORTED_DATE IS NOT NULL
THEN TIMESTAMPDIFF(HOUR, d.REPORTED_DATE, d.RESOLVED_DATE)
END) as AVG_RESOLUTION_TIME_HOURS
FROM TB_DEFECT d
INNER JOIN TB_PROJECT p ON d.PROJECT_ID = p.PROJECT_ID
GROUP BY d.PROJECT_ID, p.PROJECT_NAME, d.DEFECT_TYPE, d.SEVERITY, d.DEFECT_STATUS;
-- =====================================
-- 인덱스 최적화
-- =====================================
-- 복합 인덱스 추가 (성능 최적화)
CREATE INDEX IDX_EXECUTION_RESULT_COMPOSITE ON TB_TEST_EXECUTION_RESULT (EXECUTION_ID, RESULT_STATUS, CREATED_DATE);
CREATE INDEX IDX_STEP_RESULT_COMPOSITE ON TB_TEST_STEP_RESULT (RESULT_ID, STEP_STATUS, STEP_NO);
CREATE INDEX IDX_DEFECT_COMPOSITE ON TB_DEFECT (PROJECT_ID, DEFECT_STATUS, SEVERITY, REPORTED_DATE);
CREATE INDEX IDX_METRICS_COMPOSITE ON TB_TEST_METRICS (PROJECT_ID, METRIC_DATE, METRIC_TYPE);
-- =====================================
-- 테이블 코멘트 및 제약조건 추가
-- =====================================
-- 체크 제약조건 추가
ALTER TABLE TB_TEST_PLAN ADD CONSTRAINT CHK_PLAN_RISK_LEVEL
CHECK (RISK_LEVEL IN ('LOW', 'MEDIUM', 'HIGH', 'CRITICAL'));
ALTER TABLE TB_TEST_CASE ADD CONSTRAINT CHK_CASE_PRIORITY
CHECK (CASE_PRIORITY IN ('LOW', 'MEDIUM', 'HIGH', 'CRITICAL'));
ALTER TABLE TB_DEFECT ADD CONSTRAINT CHK_DEFECT_SEVERITY
CHECK (SEVERITY IN ('LOW', 'MEDIUM', 'HIGH', 'CRITICAL'));
ALTER TABLE TB_DEFECT ADD CONSTRAINT CHK_DEFECT_PRIORITY
CHECK (PRIORITY IN ('LOW', 'MEDIUM', 'HIGH', 'URGENT'));
-- =====================================
-- 초기 데이터 삽입
-- =====================================
-- 기본 조직 데이터
INSERT INTO TB_ORGANIZATION (ORG_ID, ORG_NAME, ORG_TYPE, CREATED_BY) VALUES
('ORG001', 'QA 본부', 'COMPANY', 'SYSTEM'),
('ORG002', '개발 1팀', 'DEPT', 'SYSTEM'),
('ORG003', '개발 2팀', 'DEPT', 'SYSTEM');
-- 기본 시스템 파라미터
INSERT INTO TB_SYSTEM_PARAMETER (PARAM_ID, PARAM_NAME, PARAM_CATEGORY, PARAM_TYPE, PARAM_VALUE, CREATED_BY) VALUES
('SYS001', 'DEFAULT_TIMEOUT', 'SYSTEM', 'NUMBER', '300', 'SYSTEM'),
('SYS002', 'MAX_RETRY_COUNT', 'SYSTEM', 'NUMBER', '3', 'SYSTEM'),
('SYS003', 'EMAIL_SMTP_SERVER', 'SYSTEM', 'STRING', 'smtp.company.com', 'SYSTEM'),
('SYS004', 'DEFAULT_PAGE_SIZE', 'SYSTEM', 'NUMBER', '50', 'SYSTEM'),
('SYS005', 'FUZZY_MATCH_THRESHOLD', 'SYSTEM', 'NUMBER', '0.8', 'SYSTEM');
-- =====================================
-- 저장 프로시저 생성
-- =====================================
DELIMITER //
-- 테스트 실행 생성 프로시저
CREATE PROCEDURE SP_CREATE_TEST_EXECUTION(
IN p_plan_id VARCHAR(30),
IN p_execution_name VARCHAR(200),
IN p_environment VARCHAR(50),
IN p_executed_by VARCHAR(50),
OUT p_execution_id VARCHAR(40)
)
BEGIN
DECLARE v_execution_round INT DEFAULT 1;
DECLARE v_total_cases INT DEFAULT 0;
-- 다음 실행 차수 계산
SELECT IFNULL(MAX(EXECUTION_ROUND), 0) + 1
INTO v_execution_round
FROM TB_TEST_EXECUTION
WHERE PLAN_ID = p_plan_id;
-- 전체 테스트 케이스 수 계산
SELECT COUNT(*)
INTO v_total_cases
FROM TB_TEST_CASE tc
INNER JOIN TB_TEST_SUITE ts ON tc.SUITE_ID = ts.SUITE_ID
WHERE ts.PLAN_ID = p_plan_id AND tc.CASE_STATUS = 'ACTIVE';
-- 실행 ID 생성
SET p_execution_id = CONCAT('EXE_', p_plan_id, '_', LPAD(v_execution_round, 3, '0'));
-- 테스트 실행 인스턴스 생성
INSERT INTO TB_TEST_EXECUTION (
EXECUTION_ID, EXECUTION_NAME, PLAN_ID, EXECUTION_ROUND,
ENVIRONMENT, TOTAL_CASES, EXECUTED_BY, CREATED_BY
) VALUES (
p_execution_id, p_execution_name, p_plan_id, v_execution_round,
p_environment, v_total_cases, p_executed_by, p_executed_by
);
-- 테스트 실행 결과 레코드 생성
INSERT INTO TB_TEST_EXECUTION_RESULT (
RESULT_ID, EXECUTION_ID, CASE_ID, SUITE_ID, EXECUTION_ORDER, CREATED_BY
)
SELECT
CONCAT(p_execution_id, '_', tc.CASE_ID),
p_execution_id,
tc.CASE_ID,
tc.SUITE_ID,
ROW_NUMBER() OVER (ORDER BY ts.EXECUTION_ORDER, tc.EXECUTION_ORDER),
p_executed_by
FROM TB_TEST_CASE tc
INNER JOIN TB_TEST_SUITE ts ON tc.SUITE_ID = ts.SUITE_ID
WHERE ts.PLAN_ID = p_plan_id
AND tc.CASE_STATUS = 'ACTIVE'
AND ts.SUITE_STATUS = 'ACTIVE';
END //
-- 테스트 메트릭 계산 프로시저
CREATE PROCEDURE SP_CALCULATE_TEST_METRICS(
IN p_project_id VARCHAR(20),
IN p_metric_date DATE
)
BEGIN
DECLARE v_metric_id VARCHAR(40);
SET v_metric_id = CONCAT('MTR_', p_project_id, '_', DATE_FORMAT(p_metric_date, '%Y%m%d'));
INSERT INTO TB_TEST_METRICS (
METRIC_ID, PROJECT_ID, METRIC_DATE, METRIC_TYPE,
TOTAL_PLANS, ACTIVE_PLANS, TOTAL_SUITES, TOTAL_CASES, AUTOMATED_CASES,
EXECUTED_CASES, PASSED_CASES, FAILED_CASES,
PASS_RATE, AUTOMATION_RATE, DEFECT_COUNT, CRITICAL_DEFECTS
)
SELECT
v_metric_id,
p_project_id,
p_metric_date,
'DAILY',
COUNT(DISTINCT tp.PLAN_ID),
COUNT(DISTINCT CASE WHEN tp.PLAN_STATUS = 'ACTIVE' THEN tp.PLAN_ID END),
COUNT(DISTINCT ts.SUITE_ID),
COUNT(DISTINCT tc.CASE_ID),
COUNT(DISTINCT CASE WHEN tc.IS_AUTOMATED = 'Y' THEN tc.CASE_ID END),
COUNT(DISTINCT CASE WHEN ter.RESULT_STATUS IN ('PASSED', 'FAILED') THEN ter.CASE_ID END),
COUNT(DISTINCT CASE WHEN ter.RESULT_STATUS = 'PASSED' THEN ter.CASE_ID END),
COUNT(DISTINCT CASE WHEN ter.RESULT_STATUS = 'FAILED' THEN ter.CASE_ID END),
CASE
WHEN COUNT(DISTINCT CASE WHEN ter.RESULT_STATUS IN ('PASSED', 'FAILED') THEN ter.CASE_ID END) > 0
THEN ROUND(
COUNT(DISTINCT CASE WHEN ter.RESULT_STATUS = 'PASSED' THEN ter.CASE_ID END) * 100.0 /
COUNT(DISTINCT CASE WHEN ter.RESULT_STATUS IN ('PASSED', 'FAILED') THEN ter.CASE_ID END), 2
)
ELSE 0
END,
CASE
WHEN COUNT(DISTINCT tc.CASE_ID) > 0
THEN ROUND(
COUNT(DISTINCT CASE WHEN tc.IS_AUTOMATED = 'Y' THEN tc.CASE_ID END) * 100.0 /
COUNT(DISTINCT tc.CASE_ID), 2
)
ELSE 0
END,
(SELECT COUNT(*) FROM TB_DEFECT d WHERE d.PROJECT_ID = p_project_id AND DATE(d.REPORTED_DATE) = p_metric_date),
(SELECT COUNT(*) FROM TB_DEFECT d WHERE d.PROJECT_ID = p_project_id AND DATE(d.REPORTED_DATE) = p_metric_date AND d.SEVERITY = 'CRITICAL')
FROM TB_TEST_PLAN tp
LEFT JOIN TB_TEST_SUITE ts ON tp.PLAN_ID = ts.PLAN_ID
LEFT JOIN TB_TEST_CASE tc ON ts.SUITE_ID = tc.SUITE_ID
LEFT JOIN TB_TEST_EXECUTION_RESULT ter ON tc.CASE_ID = ter.CASE_ID
LEFT JOIN TB_TEST_EXECUTION te ON ter.EXECUTION_ID = te.EXECUTION_ID AND DATE(te.CREATED_DATE) = p_metric_date
WHERE tp.PROJECT_ID = p_project_id
ON DUPLICATE KEY UPDATE
TOTAL_PLANS = VALUES(TOTAL_PLANS),
ACTIVE_PLANS = VALUES(ACTIVE_PLANS),
TOTAL_SUITES = VALUES(TOTAL_SUITES),
TOTAL_CASES = VALUES(TOTAL_CASES),
AUTOMATED_CASES = VALUES(AUTOMATED_CASES),
EXECUTED_CASES = VALUES(EXECUTED_CASES),
PASSED_CASES = VALUES(PASSED_CASES),
FAILED_CASES = VALUES(FAILED_CASES),
PASS_RATE = VALUES(PASS_RATE),
AUTOMATION_RATE = VALUES(AUTOMATION_RATE),
DEFECT_COUNT = VALUES(DEFECT_COUNT),
CRITICAL_DEFECTS = VALUES(CRITICAL_DEFECTS);
END //
DELIMITER ;
-- =====================================
-- 트리거 생성
-- =====================================
DELIMITER //
-- 테스트 실행 결과 업데이트 트리거
CREATE TRIGGER TR_UPDATE_EXECUTION_STATS
AFTER UPDATE ON TB_TEST_EXECUTION_RESULT
FOR EACH ROW
BEGIN
IF NEW.RESULT_STATUS != OLD.RESULT_STATUS THEN
UPDATE TB_TEST_EXECUTION
SET
PASSED_CASES = (
SELECT COUNT(*) FROM TB_TEST_EXECUTION_RESULT
WHERE EXECUTION_ID = NEW.EXECUTION_ID AND RESULT_STATUS = 'PASSED'
),
FAILED_CASES = (
SELECT COUNT(*) FROM TB_TEST_EXECUTION_RESULT
WHERE EXECUTION_ID = NEW.EXECUTION_ID AND RESULT_STATUS = 'FAILED'
),
ERROR_CASES = (
SELECT COUNT(*) FROM TB_TEST_EXECUTION_RESULT
WHERE EXECUTION_ID = NEW.EXECUTION_ID AND RESULT_STATUS = 'ERROR'
),
SKIPPED_CASES = (
SELECT COUNT(*) FROM TB_TEST_EXECUTION_RESULT
WHERE EXECUTION_ID = NEW.EXECUTION_ID AND RESULT_STATUS = 'SKIPPED'
),
UPDATED_DATE = CURRENT_TIMESTAMP
WHERE EXECUTION_ID = NEW.EXECUTION_ID;
-- 성공률 계산
UPDATE TB_TEST_EXECUTION
SET PASS_RATE = CASE
WHEN (PASSED_CASES + FAILED_CASES + ERROR_CASES) > 0
THEN ROUND(PASSED_CASES * 100.0 / (PASSED_CASES + FAILED_CASES + ERROR_CASES), 2)
ELSE 0
END
WHERE EXECUTION_ID = NEW.EXECUTION_ID;
END IF;
END //
-- 결함 생성 시 알림 트리거
CREATE TRIGGER TR_DEFECT_NOTIFICATION
AFTER INSERT ON TB_DEFECT
FOR EACH ROW
BEGIN
-- 심각한 결함인 경우 즉시 알림 생성
IF NEW.SEVERITY IN ('HIGH', 'CRITICAL') THEN
INSERT INTO TB_NOTIFICATION_HISTORY (
HISTORY_ID, CONFIG_ID, TRIGGER_SOURCE_ID, NOTIFICATION_TYPE,
RECIPIENTS, SUBJECT, MESSAGE_CONTENT, SEND_STATUS
)
SELECT
CONCAT('NTF_', NEW.DEFECT_ID, '_', UNIX_TIMESTAMP()),
nc.CONFIG_ID,
NEW.DEFECT_ID,
nc.NOTIFICATION_TYPE,
nc.RECIPIENTS,
CONCAT('[', NEW.SEVERITY, '] 새로운 결함 발견: ', NEW.DEFECT_TITLE),
CONCAT('프로젝트: ', p.PROJECT_NAME, '\n결함 ID: ', NEW.DEFECT_ID, '\n심각도: ', NEW.SEVERITY, '\n설명: ', NEW.DEFECT_DESC),
'PENDING'
FROM TB_NOTIFICATION_CONFIG nc
INNER JOIN TB_PROJECT p ON nc.PROJECT_ID = p.PROJECT_ID
WHERE nc.PROJECT_ID = NEW.PROJECT_ID
AND nc.TRIGGER_EVENT = 'DEFECT_CREATED'
AND nc.IS_ACTIVE = 'Y';
END IF;
END //
DELIMITER ;
-- =====================================
-- 권한 설정 및 사용자 생성
-- =====================================
-- 애플리케이션 사용자 생성
CREATE USER 'test_app_user'@'%' IDENTIFIED BY 'SecurePassword123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON test_management.* TO 'test_app_user'@'%';
-- 읽기 전용 사용자 생성 (보고서용)
CREATE USER 'test_readonly_user'@'%' IDENTIFIED BY 'ReadOnlyPassword123!';
GRANT SELECT ON test_management.* TO 'test_readonly_user'@'%';
-- 관리자 사용자 생성
CREATE USER 'test_admin_user'@'%' IDENTIFIED BY 'AdminPassword123!';
GRANT ALL PRIVILEGES ON test_management.* TO 'test_admin_user'@'%';
FLUSH PRIVILEGES;
-- =====================================
-- 데이터베이스 설정 최적화
-- =====================================
-- InnoDB 설정 (my.cnf에 추가 권장)
-- innodb_buffer_pool_size = 1G
-- innodb_log_file_size = 256M
-- innodb_flush_log_at_trx_commit = 2
-- max_connections = 200
-- query_cache_size = 64M
-- =====================================
-- 백업 및 유지보수 스크립트
-- =====================================
-- 파티셔닝 설정 (대용량 데이터 처리용)
-- 이력 테이블의 경우 월별 파티셔닝 권장
-- 정리 작업용 이벤트 스케줄러
SET GLOBAL event_scheduler = ON;
DELIMITER //
CREATE EVENT EV_CLEANUP_OLD_NOTIFICATIONS
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP
DO
BEGIN
-- 30일 이전 알림 이력 삭제
DELETE FROM TB_NOTIFICATION_HISTORY
WHERE CREATED_DATE < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- 90일 이전 테스트 실행 결과 아카이브 (선택적)
-- INSERT INTO TB_TEST_EXECUTION_RESULT_ARCHIVE
-- SELECT * FROM TB_TEST_EXECUTION_RESULT
-- WHERE CREATED_DATE < DATE_SUB(NOW(), INTERVAL 90 DAY);
END //
DELIMITER ;
-- =====================================
-- 완료 메시지
-- =====================================
SELECT 'Test Management System Database Schema Created Successfully!' as STATUS;
```
### 3.2 주요 설계 특징
#### 3.2.1 표준 준수
- **ISO 29119** 및 **FBI 829** 표준 용어 적용
- **RBAC(Role-Based Access Control)** 보안 모델 구현
- **RESTful API** 지원을 위한 JSON 필드 활용
#### 3.2.2 확장성 및 성능
- **계층적 인덱스 구조**로 빠른 검색 지원
- **뷰(View)** 활용한 복잡한 쿼리 단순화
- **저장 프로시저**로 비즈니스 로직 캡슐화
- **트리거**를 통한 실시간 통계 업데이트
#### 3.2.3 데이터 무결성
- **외래키 제약조건**으로 참조 무결성 보장
- **체크 제약조건**으로 도메인 무결성 확보
- **트랜잭션 지원**으로 데이터 일관성 유지
---
## 4. 시스템 구현 권고사항
### 4.1 개발 단계별 접근법
1. **1단계: 핵심 모듈** - 테스트 계획 관리, 실행 관리
2. **2단계: 고급 기능** - 데이터 검증 엔진, 알림 시스템
3. **3단계: 확장 기능** - API 테스트, 외부 연동, 고급 분석
### 4.2 기술 스택 권고
- **백엔드**: Spring Boot 3.x, JPA/Hibernate
- **데이터베이스**: MariaDB 10.6+, Redis (캐시)
- **프론트엔드**: React/Vue.js, Chart.js (대시보드)
- **API**: RESTful API, OpenAPI 3.0 문서화
- **배포**: Docker, Kubernetes, CI/CD 파이프라인
### 4.3 보안 및 운영
- **데이터 암호화**: 민감정보 AES-256 암호화
- **접근 제어**: JWT 기반 인증, RBAC 권한 관리
- **모니터링**: ELK Stack, Prometheus + Grafana
- **백업**: 일일 풀백업, 증분 백업 자동화
이러한 표준화된 설계를 통해 엔터프라이즈급 테스트 관리 시스템을 구축할 수 있으며, 다양한 AS-IS/TO-BE 비교 방법을 효과적으로 지원할 수 있습니다.
'테스트 플렛폼' 카테고리의 다른 글
Vinci: 테스트 중심 ALM/DevOps 플랫폼 세부 설계서 (6) | 2025.08.08 |
---|---|
zentao pms 데이터 베이스 생성문 (1) | 2025.08.06 |
소프트웨어 개발 전주기 상용 통합 서비스 (1) | 2025.08.06 |
테스트 관련 오픈소스 & 상용 서비스 정리 (2) | 2025.08.06 |
React 17.0.2, TypeScript 4.3.5, Recharts 2.1.5 환경에서 사용할 수 있는 Recharts 라이브러리를 이용하여 구현 가능한 차트 종류를 정리 (1) | 2025.07.21 |