# API Gateway 통계 테이블 설계

## 요구사항 정리

### 수집 차원
- **시간 단위**: 분 단위
- **분류 차원**: API명, API Gateway Instance, ClientId, Inbound Adapter, Outbound Adapter, 업무구분코드 (값이 없을 경우 'NONE' 으로 대체)

### 메트릭
- **처리 건수**:
  - 총 건수
  - 성공 건수
  - 오류 건수 (Timeout / System Error / Business Error)
- **응답시간 통계**:
  - 평균 응답시간
  - 최소 응답시간
  - 최대 응답시간
- **추가 검토사항**:
  - P50, P95 백분위 응답시간

### 집계 방식
- **집계 주기**: 매분 배치 집계
- **백분위 계산**: HdrHistogram 라이브러리 사용 (근사값, 메모리 효율적)

---

## 구현 완료

### 구현 위치
- **패키지**: `com.eactive.eai.custom.statistics`
- **경로**: `eapim-online/src/main/java/com/eactive/eai/custom/statistics/`

### 주요 컴포넌트
1. **ApiStatsCollector**: 거래마다 호출되어 메모리에 집계
2. **MinuteStatsAggregator**: HdrHistogram 기반 백분위 계산
3. **ApiStatsScheduler**: 매 분 5초에 DB 저장
4. **TransactionEvent**: 거래 이벤트 DTO

### 사용법
상세한 사용법은 `eapim-online/src/main/java/com/eactive/eai/custom/statistics/README.md` 참조

---

## 테이블 DDL

```sql
-- API Gateway 분단위 통계 테이블
CREATE TABLE API_STATS_MINUTE (
    STAT_TIME        TIMESTAMP(0)   NOT NULL,  -- 통계 시간 (분 단위, 초는 00)
    API_NAME         VARCHAR2(100)  NOT NULL,  -- API명
    GW_INSTANCE_ID   VARCHAR2(50)   NOT NULL,  -- API Gateway 인스턴스 ID
    BIZ_DIV_CODE     VARCHAR2(50)   DEFAULT 'NONE' NOT NULL,  -- 업무구분코드
    CLIENT_ID        VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- 클라이언트 ID
    INBOUND_ADAPTER  VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- Inbound Adapter
    OUTBOUND_ADAPTER VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- Outbound Adapter

    -- 건수 메트릭
    TOTAL_CNT        NUMBER(12)     DEFAULT 0 NOT NULL,
    SUCCESS_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    TIMEOUT_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    SYSTEM_ERR_CNT   NUMBER(12)     DEFAULT 0 NOT NULL,
    BIZ_ERR_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,

    -- 로그 시퀀스 900 구간 에러 카운트
    SEQ900_TIMEOUT_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    SEQ900_SYSTEM_ERR_CNT   NUMBER(12)     DEFAULT 0 NOT NULL,
    SEQ900_BIZ_ERR_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,

    -- 응답시간 메트릭 (ms, 소수점 3자리)
    AVG_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    MIN_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    MAX_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    P50_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    P95_RESP_TIME    NUMBER(10,3)   DEFAULT 0,

    CONSTRAINT PK_API_STATS_MINUTE PRIMARY KEY (
        STAT_TIME, API_NAME, GW_INSTANCE_ID, BIZ_DIV_CODE, CLIENT_ID, INBOUND_ADAPTER, OUTBOUND_ADAPTER
    )
);

-- 코멘트
COMMENT ON TABLE API_STATS_MINUTE IS 'API Gateway 분단위 처리 통계';
COMMENT ON COLUMN API_STATS_MINUTE.STAT_TIME IS '통계시간(분단위, 초는 00초로 절사)';
COMMENT ON COLUMN API_STATS_MINUTE.API_NAME IS 'API 명칭';
COMMENT ON COLUMN API_STATS_MINUTE.GW_INSTANCE_ID IS 'API Gateway 인스턴스 ID';
COMMENT ON COLUMN API_STATS_MINUTE.BIZ_DIV_CODE IS '업무구분코드 (없으면 NONE)';
COMMENT ON COLUMN API_STATS_MINUTE.CLIENT_ID IS '클라이언트 ID (없으면 NONE)';
COMMENT ON COLUMN API_STATS_MINUTE.INBOUND_ADAPTER IS 'Inbound Adapter (없으면 NONE)';
COMMENT ON COLUMN API_STATS_MINUTE.OUTBOUND_ADAPTER IS 'Outbound Adapter (없으면 NONE)';
COMMENT ON COLUMN API_STATS_MINUTE.TOTAL_CNT IS '총 처리 건수';
COMMENT ON COLUMN API_STATS_MINUTE.SUCCESS_CNT IS '성공 건수';
COMMENT ON COLUMN API_STATS_MINUTE.TIMEOUT_CNT IS 'Timeout 오류 건수';
COMMENT ON COLUMN API_STATS_MINUTE.SYSTEM_ERR_CNT IS '시스템 오류 건수';
COMMENT ON COLUMN API_STATS_MINUTE.BIZ_ERR_CNT IS '업무 오류 건수';
COMMENT ON COLUMN API_STATS_MINUTE.SEQ900_TIMEOUT_CNT IS '로그시퀀스900 Timeout 오류 건수';
COMMENT ON COLUMN API_STATS_MINUTE.SEQ900_SYSTEM_ERR_CNT IS '로그시퀀스900 시스템 오류 건수';
COMMENT ON COLUMN API_STATS_MINUTE.SEQ900_BIZ_ERR_CNT IS '로그시퀀스900 업무 오류 건수';
COMMENT ON COLUMN API_STATS_MINUTE.AVG_RESP_TIME IS '평균 응답시간(ms)';
COMMENT ON COLUMN API_STATS_MINUTE.MIN_RESP_TIME IS '최소 응답시간(ms)';
COMMENT ON COLUMN API_STATS_MINUTE.MAX_RESP_TIME IS '최대 응답시간(ms)';
COMMENT ON COLUMN API_STATS_MINUTE.P50_RESP_TIME IS '50 백분위 응답시간(ms)';
COMMENT ON COLUMN API_STATS_MINUTE.P95_RESP_TIME IS '95 백분위 응답시간(ms)';
```

---

## 시간별 통계 테이블 DDL

```sql
-- API Gateway 시간별 통계 테이블
CREATE TABLE API_STATS_HOUR (
    STAT_TIME        TIMESTAMP(0)   NOT NULL,  -- 통계 시간 (시간 단위, 분/초는 00)
    API_NAME         VARCHAR2(100)  NOT NULL,  -- API명
    GW_INSTANCE_ID   VARCHAR2(50)   NOT NULL,  -- API Gateway 인스턴스 ID
    BIZ_DIV_CODE     VARCHAR2(50)   DEFAULT 'NONE' NOT NULL,  -- 업무구분코드
    CLIENT_ID        VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- 클라이언트 ID
    INBOUND_ADAPTER  VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- Inbound Adapter
    OUTBOUND_ADAPTER VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- Outbound Adapter

    -- 건수 메트릭
    TOTAL_CNT        NUMBER(12)     DEFAULT 0 NOT NULL,
    SUCCESS_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    TIMEOUT_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    SYSTEM_ERR_CNT   NUMBER(12)     DEFAULT 0 NOT NULL,
    BIZ_ERR_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,

    -- 로그 시퀀스 900 구간 에러 카운트
    SEQ900_TIMEOUT_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    SEQ900_SYSTEM_ERR_CNT   NUMBER(12)     DEFAULT 0 NOT NULL,
    SEQ900_BIZ_ERR_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,

    -- 응답시간 메트릭 (ms, 소수점 3자리)
    AVG_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    MIN_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    MAX_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    P50_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    P95_RESP_TIME    NUMBER(10,3)   DEFAULT 0,

    CONSTRAINT PK_API_STATS_HOUR PRIMARY KEY (
        STAT_TIME, API_NAME, GW_INSTANCE_ID, BIZ_DIV_CODE, CLIENT_ID, INBOUND_ADAPTER, OUTBOUND_ADAPTER
    )
);

-- 코멘트
COMMENT ON TABLE API_STATS_HOUR IS 'API Gateway 시간별 처리 통계';
COMMENT ON COLUMN API_STATS_HOUR.STAT_TIME IS '통계시간(시간단위, 분/초는 00으로 절사)';
COMMENT ON COLUMN API_STATS_HOUR.API_NAME IS 'API 명칭';
COMMENT ON COLUMN API_STATS_HOUR.GW_INSTANCE_ID IS 'API Gateway 인스턴스 ID';
COMMENT ON COLUMN API_STATS_HOUR.BIZ_DIV_CODE IS '업무구분코드 (없으면 NONE)';
COMMENT ON COLUMN API_STATS_HOUR.CLIENT_ID IS '클라이언트 ID (없으면 NONE)';
COMMENT ON COLUMN API_STATS_HOUR.INBOUND_ADAPTER IS 'Inbound Adapter (없으면 NONE)';
COMMENT ON COLUMN API_STATS_HOUR.OUTBOUND_ADAPTER IS 'Outbound Adapter (없으면 NONE)';
COMMENT ON COLUMN API_STATS_HOUR.TOTAL_CNT IS '총 처리 건수';
COMMENT ON COLUMN API_STATS_HOUR.SUCCESS_CNT IS '성공 건수';
COMMENT ON COLUMN API_STATS_HOUR.TIMEOUT_CNT IS 'Timeout 오류 건수';
COMMENT ON COLUMN API_STATS_HOUR.SYSTEM_ERR_CNT IS '시스템 오류 건수';
COMMENT ON COLUMN API_STATS_HOUR.BIZ_ERR_CNT IS '업무 오류 건수';
COMMENT ON COLUMN API_STATS_HOUR.SEQ900_TIMEOUT_CNT IS '로그시퀀스900 Timeout 오류 건수';
COMMENT ON COLUMN API_STATS_HOUR.SEQ900_SYSTEM_ERR_CNT IS '로그시퀀스900 시스템 오류 건수';
COMMENT ON COLUMN API_STATS_HOUR.SEQ900_BIZ_ERR_CNT IS '로그시퀀스900 업무 오류 건수';
COMMENT ON COLUMN API_STATS_HOUR.AVG_RESP_TIME IS '평균 응답시간(ms)';
COMMENT ON COLUMN API_STATS_HOUR.MIN_RESP_TIME IS '최소 응답시간(ms)';
COMMENT ON COLUMN API_STATS_HOUR.MAX_RESP_TIME IS '최대 응답시간(ms)';
COMMENT ON COLUMN API_STATS_HOUR.P50_RESP_TIME IS '50 백분위 응답시간(ms)';
COMMENT ON COLUMN API_STATS_HOUR.P95_RESP_TIME IS '95 백분위 응답시간(ms)';
```

---

## 일별 통계 테이블 DDL

```sql
-- API Gateway 일별 통계 테이블
CREATE TABLE API_STATS_DAY (
    STAT_TIME        DATE           NOT NULL,  -- 통계 시간 (일 단위)
    API_NAME         VARCHAR2(100)  NOT NULL,  -- API명
    GW_INSTANCE_ID   VARCHAR2(50)   NOT NULL,  -- API Gateway 인스턴스 ID
    BIZ_DIV_CODE     VARCHAR2(50)   DEFAULT 'NONE' NOT NULL,  -- 업무구분코드
    CLIENT_ID        VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- 클라이언트 ID
    INBOUND_ADAPTER  VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- Inbound Adapter
    OUTBOUND_ADAPTER VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- Outbound Adapter

    -- 건수 메트릭
    TOTAL_CNT        NUMBER(12)     DEFAULT 0 NOT NULL,
    SUCCESS_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    TIMEOUT_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    SYSTEM_ERR_CNT   NUMBER(12)     DEFAULT 0 NOT NULL,
    BIZ_ERR_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,

    -- 로그 시퀀스 900 구간 에러 카운트
    SEQ900_TIMEOUT_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    SEQ900_SYSTEM_ERR_CNT   NUMBER(12)     DEFAULT 0 NOT NULL,
    SEQ900_BIZ_ERR_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,

    -- 응답시간 메트릭 (ms, 소수점 3자리)
    AVG_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    MIN_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    MAX_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    P50_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    P95_RESP_TIME    NUMBER(10,3)   DEFAULT 0,

    CONSTRAINT PK_API_STATS_DAY PRIMARY KEY (
        STAT_TIME, API_NAME, GW_INSTANCE_ID, BIZ_DIV_CODE, CLIENT_ID, INBOUND_ADAPTER, OUTBOUND_ADAPTER
    )
);

-- 코멘트
COMMENT ON TABLE API_STATS_DAY IS 'API Gateway 일별 처리 통계';
COMMENT ON COLUMN API_STATS_DAY.STAT_TIME IS '통계시간(일단위)';
COMMENT ON COLUMN API_STATS_DAY.API_NAME IS 'API 명칭';
COMMENT ON COLUMN API_STATS_DAY.GW_INSTANCE_ID IS 'API Gateway 인스턴스 ID';
COMMENT ON COLUMN API_STATS_DAY.BIZ_DIV_CODE IS '업무구분코드 (없으면 NONE)';
COMMENT ON COLUMN API_STATS_DAY.CLIENT_ID IS '클라이언트 ID (없으면 NONE)';
COMMENT ON COLUMN API_STATS_DAY.INBOUND_ADAPTER IS 'Inbound Adapter (없으면 NONE)';
COMMENT ON COLUMN API_STATS_DAY.OUTBOUND_ADAPTER IS 'Outbound Adapter (없으면 NONE)';
COMMENT ON COLUMN API_STATS_DAY.TOTAL_CNT IS '총 처리 건수';
COMMENT ON COLUMN API_STATS_DAY.SUCCESS_CNT IS '성공 건수';
COMMENT ON COLUMN API_STATS_DAY.TIMEOUT_CNT IS 'Timeout 오류 건수';
COMMENT ON COLUMN API_STATS_DAY.SYSTEM_ERR_CNT IS '시스템 오류 건수';
COMMENT ON COLUMN API_STATS_DAY.BIZ_ERR_CNT IS '업무 오류 건수';
COMMENT ON COLUMN API_STATS_DAY.SEQ900_TIMEOUT_CNT IS '로그시퀀스900 Timeout 오류 건수';
COMMENT ON COLUMN API_STATS_DAY.SEQ900_SYSTEM_ERR_CNT IS '로그시퀀스900 시스템 오류 건수';
COMMENT ON COLUMN API_STATS_DAY.SEQ900_BIZ_ERR_CNT IS '로그시퀀스900 업무 오류 건수';
COMMENT ON COLUMN API_STATS_DAY.AVG_RESP_TIME IS '평균 응답시간(ms)';
COMMENT ON COLUMN API_STATS_DAY.MIN_RESP_TIME IS '최소 응답시간(ms)';
COMMENT ON COLUMN API_STATS_DAY.MAX_RESP_TIME IS '최대 응답시간(ms)';
COMMENT ON COLUMN API_STATS_DAY.P50_RESP_TIME IS '50 백분위 응답시간(ms)';
COMMENT ON COLUMN API_STATS_DAY.P95_RESP_TIME IS '95 백분위 응답시간(ms)';
```

---

## 월별 통계 테이블 DDL

```sql
-- API Gateway 월별 통계 테이블
CREATE TABLE API_STATS_MONTH (
    STAT_TIME        VARCHAR2(6)    NOT NULL,  -- 통계 시간 (YYYYMM 형식)
    API_NAME         VARCHAR2(100)  NOT NULL,  -- API명
    GW_INSTANCE_ID   VARCHAR2(50)   NOT NULL,  -- API Gateway 인스턴스 ID
    BIZ_DIV_CODE     VARCHAR2(50)   DEFAULT 'NONE' NOT NULL,  -- 업무구분코드
    CLIENT_ID        VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- 클라이언트 ID
    INBOUND_ADAPTER  VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- Inbound Adapter
    OUTBOUND_ADAPTER VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- Outbound Adapter

    -- 건수 메트릭
    TOTAL_CNT        NUMBER(12)     DEFAULT 0 NOT NULL,
    SUCCESS_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    TIMEOUT_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    SYSTEM_ERR_CNT   NUMBER(12)     DEFAULT 0 NOT NULL,
    BIZ_ERR_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,

    -- 로그 시퀀스 900 구간 에러 카운트
    SEQ900_TIMEOUT_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    SEQ900_SYSTEM_ERR_CNT   NUMBER(12)     DEFAULT 0 NOT NULL,
    SEQ900_BIZ_ERR_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,

    -- 응답시간 메트릭 (ms, 소수점 3자리)
    AVG_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    MIN_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    MAX_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    P50_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    P95_RESP_TIME    NUMBER(10,3)   DEFAULT 0,

    CONSTRAINT PK_API_STATS_MONTH PRIMARY KEY (
        STAT_TIME, API_NAME, GW_INSTANCE_ID, BIZ_DIV_CODE, CLIENT_ID, INBOUND_ADAPTER, OUTBOUND_ADAPTER
    )
);

-- 코멘트
COMMENT ON TABLE API_STATS_MONTH IS 'API Gateway 월별 처리 통계';
COMMENT ON COLUMN API_STATS_MONTH.STAT_TIME IS '통계시간(월단위, YYYYMM 형식)';
COMMENT ON COLUMN API_STATS_MONTH.API_NAME IS 'API 명칭';
COMMENT ON COLUMN API_STATS_MONTH.GW_INSTANCE_ID IS 'API Gateway 인스턴스 ID';
COMMENT ON COLUMN API_STATS_MONTH.BIZ_DIV_CODE IS '업무구분코드 (없으면 NONE)';
COMMENT ON COLUMN API_STATS_MONTH.CLIENT_ID IS '클라이언트 ID (없으면 NONE)';
COMMENT ON COLUMN API_STATS_MONTH.INBOUND_ADAPTER IS 'Inbound Adapter (없으면 NONE)';
COMMENT ON COLUMN API_STATS_MONTH.OUTBOUND_ADAPTER IS 'Outbound Adapter (없으면 NONE)';
COMMENT ON COLUMN API_STATS_MONTH.TOTAL_CNT IS '총 처리 건수';
COMMENT ON COLUMN API_STATS_MONTH.SUCCESS_CNT IS '성공 건수';
COMMENT ON COLUMN API_STATS_MONTH.TIMEOUT_CNT IS 'Timeout 오류 건수';
COMMENT ON COLUMN API_STATS_MONTH.SYSTEM_ERR_CNT IS '시스템 오류 건수';
COMMENT ON COLUMN API_STATS_MONTH.BIZ_ERR_CNT IS '업무 오류 건수';
COMMENT ON COLUMN API_STATS_MONTH.SEQ900_TIMEOUT_CNT IS '로그시퀀스900 Timeout 오류 건수';
COMMENT ON COLUMN API_STATS_MONTH.SEQ900_SYSTEM_ERR_CNT IS '로그시퀀스900 시스템 오류 건수';
COMMENT ON COLUMN API_STATS_MONTH.SEQ900_BIZ_ERR_CNT IS '로그시퀀스900 업무 오류 건수';
COMMENT ON COLUMN API_STATS_MONTH.AVG_RESP_TIME IS '평균 응답시간(ms)';
COMMENT ON COLUMN API_STATS_MONTH.MIN_RESP_TIME IS '최소 응답시간(ms)';
COMMENT ON COLUMN API_STATS_MONTH.MAX_RESP_TIME IS '최대 응답시간(ms)';
COMMENT ON COLUMN API_STATS_MONTH.P50_RESP_TIME IS '50 백분위 응답시간(ms)';
COMMENT ON COLUMN API_STATS_MONTH.P95_RESP_TIME IS '95 백분위 응답시간(ms)';
```

---

## 연도별 통계 테이블 DDL

```sql
-- API Gateway 연도별 통계 테이블
CREATE TABLE API_STATS_YEAR (
    STAT_TIME        VARCHAR2(4)    NOT NULL,  -- 통계 시간 (YYYY 형식)
    API_NAME         VARCHAR2(100)  NOT NULL,  -- API명
    GW_INSTANCE_ID   VARCHAR2(50)   NOT NULL,  -- API Gateway 인스턴스 ID
    BIZ_DIV_CODE     VARCHAR2(50)   DEFAULT 'NONE' NOT NULL,  -- 업무구분코드
    CLIENT_ID        VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- 클라이언트 ID
    INBOUND_ADAPTER  VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- Inbound Adapter
    OUTBOUND_ADAPTER VARCHAR2(100)  DEFAULT 'NONE' NOT NULL,  -- Outbound Adapter

    -- 건수 메트릭
    TOTAL_CNT        NUMBER(12)     DEFAULT 0 NOT NULL,
    SUCCESS_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    TIMEOUT_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    SYSTEM_ERR_CNT   NUMBER(12)     DEFAULT 0 NOT NULL,
    BIZ_ERR_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,

    -- 로그 시퀀스 900 구간 에러 카운트
    SEQ900_TIMEOUT_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,
    SEQ900_SYSTEM_ERR_CNT   NUMBER(12)     DEFAULT 0 NOT NULL,
    SEQ900_BIZ_ERR_CNT      NUMBER(12)     DEFAULT 0 NOT NULL,

    -- 응답시간 메트릭 (ms, 소수점 3자리)
    AVG_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    MIN_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    MAX_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    P50_RESP_TIME    NUMBER(10,3)   DEFAULT 0,
    P95_RESP_TIME    NUMBER(10,3)   DEFAULT 0,

    CONSTRAINT PK_API_STATS_YEAR PRIMARY KEY (
        STAT_TIME, API_NAME, GW_INSTANCE_ID, BIZ_DIV_CODE, CLIENT_ID, INBOUND_ADAPTER, OUTBOUND_ADAPTER
    )
);

-- 코멘트
COMMENT ON TABLE API_STATS_YEAR IS 'API Gateway 연도별 처리 통계';
COMMENT ON COLUMN API_STATS_YEAR.STAT_TIME IS '통계시간(연도단위, YYYY 형식)';
COMMENT ON COLUMN API_STATS_YEAR.API_NAME IS 'API 명칭';
COMMENT ON COLUMN API_STATS_YEAR.GW_INSTANCE_ID IS 'API Gateway 인스턴스 ID';
COMMENT ON COLUMN API_STATS_YEAR.BIZ_DIV_CODE IS '업무구분코드 (없으면 NONE)';
COMMENT ON COLUMN API_STATS_YEAR.CLIENT_ID IS '클라이언트 ID (없으면 NONE)';
COMMENT ON COLUMN API_STATS_YEAR.INBOUND_ADAPTER IS 'Inbound Adapter (없으면 NONE)';
COMMENT ON COLUMN API_STATS_YEAR.OUTBOUND_ADAPTER IS 'Outbound Adapter (없으면 NONE)';
COMMENT ON COLUMN API_STATS_YEAR.TOTAL_CNT IS '총 처리 건수';
COMMENT ON COLUMN API_STATS_YEAR.SUCCESS_CNT IS '성공 건수';
COMMENT ON COLUMN API_STATS_YEAR.TIMEOUT_CNT IS 'Timeout 오류 건수';
COMMENT ON COLUMN API_STATS_YEAR.SYSTEM_ERR_CNT IS '시스템 오류 건수';
COMMENT ON COLUMN API_STATS_YEAR.BIZ_ERR_CNT IS '업무 오류 건수';
COMMENT ON COLUMN API_STATS_YEAR.SEQ900_TIMEOUT_CNT IS '로그시퀀스900 Timeout 오류 건수';
COMMENT ON COLUMN API_STATS_YEAR.SEQ900_SYSTEM_ERR_CNT IS '로그시퀀스900 시스템 오류 건수';
COMMENT ON COLUMN API_STATS_YEAR.SEQ900_BIZ_ERR_CNT IS '로그시퀀스900 업무 오류 건수';
COMMENT ON COLUMN API_STATS_YEAR.AVG_RESP_TIME IS '평균 응답시간(ms)';
COMMENT ON COLUMN API_STATS_YEAR.MIN_RESP_TIME IS '최소 응답시간(ms)';
COMMENT ON COLUMN API_STATS_YEAR.MAX_RESP_TIME IS '최대 응답시간(ms)';
COMMENT ON COLUMN API_STATS_YEAR.P50_RESP_TIME IS '50 백분위 응답시간(ms)';
COMMENT ON COLUMN API_STATS_YEAR.P95_RESP_TIME IS '95 백분위 응답시간(ms)';
```

---

## 샘플 데이터 (테스트용)

```sql
-- 월별 통계 샘플 데이터
INSERT INTO API_STATS_MONTH (
    STAT_TIME, API_NAME, GW_INSTANCE_ID, BIZ_DIV_CODE, CLIENT_ID,
    INBOUND_ADAPTER, OUTBOUND_ADAPTER, TOTAL_CNT, SUCCESS_CNT,
    TIMEOUT_CNT, SYSTEM_ERR_CNT, BIZ_ERR_CNT,
    SEQ900_TIMEOUT_CNT, SEQ900_SYSTEM_ERR_CNT, SEQ900_BIZ_ERR_CNT,
    AVG_RESP_TIME, MIN_RESP_TIME, MAX_RESP_TIME, P50_RESP_TIME, P95_RESP_TIME
) VALUES (
    '202512', 'TEST_API', 'GW01', 'MOBILE', 'CLIENT01',
    'HTTP', 'REST', 30000, 29400, 300, 150, 150, 60, 30, 60,
    120.500, 8.000, 600.000, 95.000, 280.000
);

-- 연도별 통계 샘플 데이터
INSERT INTO API_STATS_YEAR (
    STAT_TIME, API_NAME, GW_INSTANCE_ID, BIZ_DIV_CODE, CLIENT_ID,
    INBOUND_ADAPTER, OUTBOUND_ADAPTER, TOTAL_CNT, SUCCESS_CNT,
    TIMEOUT_CNT, SYSTEM_ERR_CNT, BIZ_ERR_CNT,
    SEQ900_TIMEOUT_CNT, SEQ900_SYSTEM_ERR_CNT, SEQ900_BIZ_ERR_CNT,
    AVG_RESP_TIME, MIN_RESP_TIME, MAX_RESP_TIME, P50_RESP_TIME, P95_RESP_TIME
) VALUES (
    '2025', 'TEST_API', 'GW01', 'MOBILE', 'CLIENT01',
    'HTTP', 'REST', 365000, 357700, 3650, 1825, 1825, 730, 365, 730,
    118.750, 5.000, 700.000, 90.000, 270.000
);

COMMIT;
```

---
