From c63cf950eb986993f4b5f21b5f5fabf3f5374d6b Mon Sep 17 00:00:00 2001 From: merrycoral Date: Fri, 24 Oct 2025 13:22:14 +0900 Subject: [PATCH] =?UTF-8?q?Event=20Service=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=EC=99=80=20DDL=20=ED=98=95=EC=83=81=20=EC=9D=BC=EC=B9=98?= =?UTF-8?q?=ED=99=94=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Critical 및 High 우선순위 이슈 수정: 1. Event 엔티티 nullable 필드 변경 - eventName: nullable로 변경 (AI 추천 후 설정) - startDate, endDate: nullable로 변경 (AI 추천 후 설정) 2. Event.publish() 검증 로직 강화 - eventName 필수 검증 추가 - startDate, endDate 필수 검증 추가 - 기간 유효성 검증 추가 (시작일 <= 종료일) 3. DDL 스키마 수정 - event_name NOT NULL 제거 - start_date, end_date NOT NULL 제거 - chk_event_period 제약조건 수정 (NULL 허용) 4. jobs 테이블 외래키 추가 - event_id에 대한 외래키 제약조건 추가 - ON DELETE CASCADE 설정으로 데이터 무결성 보장 영향: - 이벤트 생성 시 eventName, startDate, endDate를 NULL로 허용 - 배포(publish) 시점에 필수 필드 검증으로 데이터 무결성 보장 - 이벤트 삭제 시 관련 Job 자동 삭제로 고아 레코드 방지 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- develop/database/sql/event-service-ddl.sql | 10 ++++++---- .../event/eventservice/domain/entity/Event.java | 15 ++++++++++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/develop/database/sql/event-service-ddl.sql b/develop/database/sql/event-service-ddl.sql index e2c0ae2..7081213 100644 --- a/develop/database/sql/event-service-ddl.sql +++ b/develop/database/sql/event-service-ddl.sql @@ -22,11 +22,11 @@ CREATE TABLE IF NOT EXISTS events ( event_id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL, store_id UUID NOT NULL, - event_name VARCHAR(200) NOT NULL, + event_name VARCHAR(200), description TEXT, objective VARCHAR(100) NOT NULL, - start_date DATE NOT NULL, - end_date DATE NOT NULL, + start_date DATE, + end_date DATE, status VARCHAR(20) NOT NULL DEFAULT 'DRAFT', selected_image_id UUID, selected_image_url VARCHAR(500), @@ -34,7 +34,7 @@ CREATE TABLE IF NOT EXISTS events ( updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 제약조건 - CONSTRAINT chk_event_period CHECK (start_date <= end_date), + CONSTRAINT chk_event_period CHECK (start_date IS NULL OR end_date IS NULL OR start_date <= end_date), CONSTRAINT chk_event_status CHECK (status IN ('DRAFT', 'PUBLISHED', 'ENDED')) ); @@ -185,6 +185,8 @@ CREATE TABLE IF NOT EXISTS jobs ( updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 제약조건 + CONSTRAINT fk_jobs_event FOREIGN KEY (event_id) + REFERENCES events(event_id) ON DELETE CASCADE, CONSTRAINT chk_job_type CHECK (job_type IN ('AI_RECOMMENDATION', 'IMAGE_GENERATION')), CONSTRAINT chk_job_status CHECK (status IN ('PENDING', 'PROCESSING', 'COMPLETED', 'FAILED')), CONSTRAINT chk_job_progress CHECK (progress >= 0 AND progress <= 100) diff --git a/event-service/src/main/java/com/kt/event/eventservice/domain/entity/Event.java b/event-service/src/main/java/com/kt/event/eventservice/domain/entity/Event.java index ecf592f..f205540 100644 --- a/event-service/src/main/java/com/kt/event/eventservice/domain/entity/Event.java +++ b/event-service/src/main/java/com/kt/event/eventservice/domain/entity/Event.java @@ -43,7 +43,7 @@ public class Event extends BaseTimeEntity { @Column(name = "store_id", nullable = false, columnDefinition = "uuid") private UUID storeId; - @Column(name = "event_name", nullable = false, length = 200) + @Column(name = "event_name", length = 200) private String eventName; @Column(name = "description", columnDefinition = "TEXT") @@ -52,10 +52,10 @@ public class Event extends BaseTimeEntity { @Column(name = "objective", nullable = false, length = 100) private String objective; - @Column(name = "start_date", nullable = false) + @Column(name = "start_date") private LocalDate startDate; - @Column(name = "end_date", nullable = false) + @Column(name = "end_date") private LocalDate endDate; @Enumerated(EnumType.STRING) @@ -147,6 +147,15 @@ public class Event extends BaseTimeEntity { } // 필수 데이터 검증 + if (eventName == null || eventName.trim().isEmpty()) { + throw new IllegalStateException("이벤트명을 입력해야 합니다."); + } + if (startDate == null || endDate == null) { + throw new IllegalStateException("이벤트 기간을 설정해야 합니다."); + } + if (startDate.isAfter(endDate)) { + throw new IllegalStateException("시작일은 종료일보다 이전이어야 합니다."); + } if (selectedImageId == null) { throw new IllegalStateException("이미지를 선택해야 합니다."); }