hgzero/notification/DB_FIX_GUIDE.md

4.3 KiB

Notification DB 체크 제약 조건 수정 가이드

🚨 문제 상황

ERROR: new row for relation "notifications" violates check constraint "notifications_notification_type_check"

Event Hub에서 메시지는 정상적으로 수신되지만, 데이터베이스 저장 시 체크 제약 조건 위반으로 실패

해결 방법

방법 1: Azure Portal 사용 (권장)

  1. Azure Portal 접속

  2. PostgreSQL 서버 찾기

    • 리소스 검색에서 "4.230.159.143" 또는 "notificationdb" 검색
  3. Query Editor 열기

    • 좌측 메뉴에서 "Query editor (preview)" 선택
    • 사용자명: hgzerouser
    • 비밀번호: Hi5Jessica!
    • 데이터베이스: notificationdb
  4. SQL 실행

    -- 기존 제약 조건 삭제
    ALTER TABLE notifications DROP CONSTRAINT IF EXISTS notifications_notification_type_check;
    
    -- 새로운 제약 조건 추가
    ALTER TABLE notifications
    ADD CONSTRAINT notifications_notification_type_check
    CHECK (notification_type IN (
        'MEETING_INVITATION',
        'TODO_ASSIGNED',
        'TODO_REMINDER',
        'MEETING_REMINDER',
        'MINUTES_UPDATED',
        'TODO_COMPLETED'
    ));
    
  5. 확인

    SELECT constraint_name, check_clause
    FROM information_schema.check_constraints
    WHERE constraint_name = 'notifications_notification_type_check';
    

방법 2: DB 관리 도구 사용

DBeaver 사용

  1. DBeaver 다운로드: https://dbeaver.io/download/
  2. 새 연결 생성:
    • Host: 4.230.159.143
    • Port: 5432
    • Database: notificationdb
    • Username: hgzerouser
    • Password: Hi5Jessica!
  3. SQL Editor에서 위의 SQL 실행

pgAdmin 사용

  1. pgAdmin 다운로드: https://www.pgadmin.org/download/
  2. 서버 등록 후 Query Tool에서 SQL 실행

방법 3: psql 직접 설치 (Mac/Linux)

# Mac (Homebrew)
brew install postgresql@15

# 실행
PGPASSWORD='Hi5Jessica!' psql -h 4.230.159.143 -p 5432 -U hgzerouser -d notificationdb -f notification/fix_constraint.sql

방법 4: Python 스크립트 사용

# psycopg2 설치
pip install psycopg2-binary

# 스크립트 실행
python3 notification/fix_db_constraint.py

📋 실행할 SQL

생성된 파일: notification/fix_constraint.sql

-- 기존 제약 조건 삭제
ALTER TABLE notifications DROP CONSTRAINT IF EXISTS notifications_notification_type_check;

-- 새로운 제약 조건 추가 (Java Enum의 모든 값 포함)
ALTER TABLE notifications
ADD CONSTRAINT notifications_notification_type_check
CHECK (notification_type IN (
    'MEETING_INVITATION',   -- 회의 초대
    'TODO_ASSIGNED',        -- Todo 할당
    'TODO_REMINDER',        -- Todo 리마인더
    'MEETING_REMINDER',     -- 회의 리마인더
    'MINUTES_UPDATED',      -- 회의록 수정
    'TODO_COMPLETED'        -- Todo 완료
));

🔍 검증 방법

1. 제약 조건 확인

SELECT constraint_name, check_clause
FROM information_schema.check_constraints
WHERE constraint_name = 'notifications_notification_type_check';

2. 서비스 재시작 후 로그 확인

# notification 서비스 재시작
cd notification
./gradlew bootRun

# 로그 모니터링
tail -f logs/notification-service.log | grep -E "ERROR|이벤트 수신|알림 발송"

3. 에러가 사라졌는지 확인

이 에러가 더 이상 나타나지 않아야 합니다:

ERROR: new row for relation "notifications" violates check constraint "notifications_notification_type_check"

📌 참고

Java Enum 정의 위치

notification/src/main/java/com/unicorn/hgzero/notification/domain/Notification.java:220-227

public enum NotificationType {
    MEETING_INVITATION, // 회의 초대
    TODO_ASSIGNED,      // Todo 할당
    TODO_REMINDER,      // Todo 리마인더
    MEETING_REMINDER,   // 회의 리마인더
    MINUTES_UPDATED,    // 회의록 수정
    TODO_COMPLETED      // Todo 완료
}

현재 상태

  • Event Hub 연결: 정상
  • 메시지 수신: 정상
  • 이메일 발송: 정상
  • DB 저장: 제약 조건 위반으로 실패 ← 해결 필요

⚠️ 주의사항

  • 프로덕션 환경이라면 백업 먼저 수행
  • 테스트 환경에서 먼저 검증 후 프로덕션 적용
  • SQL 실행 권한이 필요합니다