hgzero/notification/DB_FIX_GUIDE.md

174 lines
4.3 KiB
Markdown

# Notification DB 체크 제약 조건 수정 가이드
## 🚨 문제 상황
```
ERROR: new row for relation "notifications" violates check constraint "notifications_notification_type_check"
```
Event Hub에서 메시지는 정상적으로 수신되지만, 데이터베이스 저장 시 체크 제약 조건 위반으로 실패
## ✅ 해결 방법
### 방법 1: Azure Portal 사용 (권장)
1. **Azure Portal 접속**
- https://portal.azure.com 접속
2. **PostgreSQL 서버 찾기**
- 리소스 검색에서 "4.230.159.143" 또는 "notificationdb" 검색
3. **Query Editor 열기**
- 좌측 메뉴에서 "Query editor (preview)" 선택
- 사용자명: `hgzerouser`
- 비밀번호: `Hi5Jessica!`
- 데이터베이스: `notificationdb`
4. **SQL 실행**
```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. **확인**
```sql
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)
```bash
# 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 스크립트 사용
```bash
# psycopg2 설치
pip install psycopg2-binary
# 스크립트 실행
python3 notification/fix_db_constraint.py
```
---
## 📋 실행할 SQL
생성된 파일: `notification/fix_constraint.sql`
```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. 제약 조건 확인
```sql
SELECT constraint_name, check_clause
FROM information_schema.check_constraints
WHERE constraint_name = 'notifications_notification_type_check';
```
### 2. 서비스 재시작 후 로그 확인
```bash
# 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`
```java
public enum NotificationType {
MEETING_INVITATION, // 회의 초대
TODO_ASSIGNED, // Todo 할당
TODO_REMINDER, // Todo 리마인더
MEETING_REMINDER, // 회의 리마인더
MINUTES_UPDATED, // 회의록 수정
TODO_COMPLETED // Todo 완료
}
```
### 현재 상태
- ✅ Event Hub 연결: 정상
- ✅ 메시지 수신: 정상
- ✅ 이메일 발송: 정상
- ❌ DB 저장: 제약 조건 위반으로 실패 ← **해결 필요**
---
## ⚠️ 주의사항
- 프로덕션 환경이라면 백업 먼저 수행
- 테스트 환경에서 먼저 검증 후 프로덕션 적용
- SQL 실행 권한이 필요합니다