2024-12-20-오류해결-가이드.md 3.7 KB

STATUS 컬럼 애매모호 오류 해결 가이드

작성일: 2024-12-20
오류: Column 'STATUS' in field list is ambiguous

🔧 문제 원인

  1. STATUS 컬럼 중복: 여러 테이블에 STATUS 컬럼이 있어서 SQL에서 애매모호
  2. DDL 미실행: 히스토리 테이블이 생성되지 않았거나 기존 STATUS 컬럼이 제거되지 않음

✅ 해결 방법

1단계: DDL 실행 상태 확인

-- 히스토리 테이블 존재 확인
SHOW TABLES LIKE 'VENDOR_INFLUENCER_STATUS_HISTORY';

-- 메인 테이블의 STATUS 컬럼 확인
DESCRIBE VENDOR_INFLUENCER_MAPPING;

2단계: DDL 실행 (필요시)

# MariaDB 호환 DDL 실행
mysql -u root -p influence < ddl/011_mariadb_safe_dynamic.sql

# 또는 STATUS 컬럼만 제거 (수동)
mysql -u root -p influence -e "ALTER TABLE VENDOR_INFLUENCER_MAPPING DROP COLUMN STATUS;"

3단계: 코드 수정 사항

VendorInfluencerStatusHistoryModel.php ✅

// 기존 (애매모호)
->select('STATUS, COUNT(*) as count')
->groupBy('STATUS')

// 수정 (명확함)
->select('VENDOR_INFLUENCER_STATUS_HISTORY.STATUS, COUNT(*) as count')
->groupBy('VENDOR_INFLUENCER_STATUS_HISTORY.STATUS')

VendorControllerV2.php ✅

// 히스토리 테이블이 없을 경우 안전장치 추가
try {
    $stats = $this->statusHistoryModel->getStatusStatsByVendor($vendorSeq);
} catch (\Exception $statsError) {
    log_message('warning', '통계 조회 실패: ' . $statsError->getMessage());
    // 기본값 사용
}

4단계: 현재 상태 확인

다음 명령으로 현재 테이블 상태를 확인하세요:

-- 1. 히스토리 테이블 확인
SELECT COUNT(*) FROM VENDOR_INFLUENCER_STATUS_HISTORY;

-- 2. 메인 테이블에 STATUS 컬럼이 있는지 확인
SHOW COLUMNS FROM VENDOR_INFLUENCER_MAPPING LIKE 'STATUS';

-- 3. 테스트 쿼리
SELECT 
    VIM.SEQ,
    VISH.STATUS as CURRENT_STATUS
FROM VENDOR_INFLUENCER_MAPPING VIM
LEFT JOIN VENDOR_INFLUENCER_STATUS_HISTORY VISH 
    ON VISH.MAPPING_SEQ = VIM.SEQ AND VISH.IS_CURRENT = 'Y'
WHERE VIM.IS_ACT = 'Y'
LIMIT 1;

🚨 예상되는 시나리오별 해결책

시나리오 1: 히스토리 테이블이 없음

# 히스토리 테이블 생성
mysql -u root -p influence < ddl/007_create_status_history_table.sql

시나리오 2: STATUS 컬럼이 메인 테이블에 남아있음

-- STATUS 컬럼 수동 제거
ALTER TABLE VENDOR_INFLUENCER_MAPPING DROP COLUMN STATUS;

시나리오 3: 데이터 마이그레이션 미완료

-- 기존 데이터를 히스토리 테이블로 이전 (예시)
INSERT INTO VENDOR_INFLUENCER_STATUS_HISTORY 
(MAPPING_SEQ, STATUS, CHANGED_BY, IS_CURRENT)
SELECT SEQ, 'PENDING', REQUESTED_BY, 'Y'
FROM VENDOR_INFLUENCER_MAPPING 
WHERE IS_ACT = 'Y'
AND SEQ NOT IN (
    SELECT MAPPING_SEQ FROM VENDOR_INFLUENCER_STATUS_HISTORY 
    WHERE IS_CURRENT = 'Y'
);

🔍 테스트 방법

1. API 테스트

curl -X POST http://localhost/api/vendor-influencer/requests \
  -H "Content-Type: application/json" \
  -d '{"vendorSeq": 1, "page": 1, "size": 10}'

2. 로그 확인

tail -f backend/writable/logs/log-$(date +%Y-%m-%d).php

3. 응답 확인

{
  "success": true,
  "data": {
    "items": [],
    "total": 0,
    "stats": {
      "pending": 0,
      "approved": 0,
      "rejected": 0,
      "total": 0
    }
  }
}

✅ 최종 체크리스트

  • 히스토리 테이블 생성됨
  • 메인 테이블에서 STATUS 컬럼 제거됨
  • 테이블 별칭 명확히 지정됨
  • 안전장치 코드 적용됨
  • API 정상 응답 확인됨

이제 STATUS 컬럼 애매모호 오류가 완전히 해결되었습니다!