mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 21:56:24 +00:00
174 lines
4.3 KiB
Markdown
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 실행 권한이 필요합니다
|