From d31a0c4214ce9a68f174fbfde97efd68c6afe413 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Sun, 20 Sep 2026 01:04:27 +0900 Subject: [PATCH 1/5] =?UTF-8?q?build:=20=EC=9A=B4=EC=98=81=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=20=EB=8C=80=EA=B8=B0=20=EC=A4=91=EC=9D=B8=20=EC=8A=A4?= =?UTF-8?q?=ED=82=A4=EB=A7=88=20=EB=A7=88=EC=9D=B4=EA=B7=B8=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EB=8F=99=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 정규 릴리즈에 포함될 V12~V14를 핫픽스에 함께 담는다. 핫픽스가 먼저 나가는데 V15만 적용하면 운영 이력이 V1~V11, V15가 되어 이후 정규 릴리즈에서 V12~V14가 out-of-order로 판정돼 기동에 실패한다 (spring.flyway.out-of-order 미설정, 기본 false). 파일은 dev에서 그대로 가져와 체크섬이 동일하다. 세 마이그레이션 모두 기본값을 가진 컬럼 추가/확장이라 해당 기능 코드가 없어도 무해하다. Refs: WTH-508 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01FUfuUw4qjjHWfZKiyqgADJ --- .../migration/V12__add_club_warning_and_penalty_rule.sql | 9 +++++++++ .../db/migration/V13__add_user_privacy_settings.sql | 4 ++++ .../db/migration/V14__fix_penalty_type_column.sql | 2 ++ 3 files changed, 15 insertions(+) create mode 100644 src/main/resources/db/migration/V12__add_club_warning_and_penalty_rule.sql create mode 100644 src/main/resources/db/migration/V13__add_user_privacy_settings.sql create mode 100644 src/main/resources/db/migration/V14__fix_penalty_type_column.sql diff --git a/src/main/resources/db/migration/V12__add_club_warning_and_penalty_rule.sql b/src/main/resources/db/migration/V12__add_club_warning_and_penalty_rule.sql new file mode 100644 index 00000000..c1fa3759 --- /dev/null +++ b/src/main/resources/db/migration/V12__add_club_warning_and_penalty_rule.sql @@ -0,0 +1,9 @@ +ALTER TABLE club + ADD COLUMN warning_enabled BOOLEAN NOT NULL DEFAULT FALSE, + ADD COLUMN penalty_rule VARCHAR(500); + +ALTER TABLE club_member + ADD COLUMN warning_count INT NOT NULL DEFAULT 0; + +ALTER TABLE penalty + ADD COLUMN score INT NOT NULL DEFAULT 1; diff --git a/src/main/resources/db/migration/V13__add_user_privacy_settings.sql b/src/main/resources/db/migration/V13__add_user_privacy_settings.sql new file mode 100644 index 00000000..05d228f9 --- /dev/null +++ b/src/main/resources/db/migration/V13__add_user_privacy_settings.sql @@ -0,0 +1,4 @@ +ALTER TABLE users + ADD COLUMN tel_public TINYINT(1) NOT NULL DEFAULT 1, + ADD COLUMN email_public TINYINT(1) NOT NULL DEFAULT 1, + ADD COLUMN student_info_public TINYINT(1) NOT NULL DEFAULT 1; diff --git a/src/main/resources/db/migration/V14__fix_penalty_type_column.sql b/src/main/resources/db/migration/V14__fix_penalty_type_column.sql new file mode 100644 index 00000000..e986a563 --- /dev/null +++ b/src/main/resources/db/migration/V14__fix_penalty_type_column.sql @@ -0,0 +1,2 @@ +ALTER TABLE penalty + MODIFY COLUMN penalty_type ENUM ('PENALTY', 'WARNING') NOT NULL DEFAULT 'PENALTY'; From 0a7d84f5eb595094adf0b435b20ae6c9ff2c7492 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Sat, 19 Sep 2026 11:58:09 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20=EC=9D=BC=EC=A0=95=C2=B7?= =?UTF-8?q?=EC=84=B8=EC=85=98=20=EB=82=B4=EC=9A=A9=20=EC=BB=AC=EB=9F=BC?= =?UTF-8?q?=EC=9D=84=20TEXT=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit V3 마이그레이션 대상 데이터의 event.content 최대 길이가 632자로 기존 varchar(500) 한도를 초과해 잘림이 발생한다. session.content(최대 431자)도 여유가 적어 함께 TEXT로 통일한다. Refs: WTH-508 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01FUfuUw4qjjHWfZKiyqgADJ (cherry picked from commit d17ce27208b7a15287d141271aa9280c83864476) --- .../kotlin/com/weeth/domain/schedule/domain/entity/Event.kt | 2 +- .../kotlin/com/weeth/domain/session/domain/entity/Session.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/weeth/domain/schedule/domain/entity/Event.kt b/src/main/kotlin/com/weeth/domain/schedule/domain/entity/Event.kt index 7d2c05f9..c98895af 100644 --- a/src/main/kotlin/com/weeth/domain/schedule/domain/entity/Event.kt +++ b/src/main/kotlin/com/weeth/domain/schedule/domain/entity/Event.kt @@ -17,7 +17,7 @@ import java.time.LocalDateTime class Event( club: Club, var title: String, - @Column(length = 500) + @Column(columnDefinition = "TEXT") var content: String? = null, var location: String? = null, var cardinal: Int, diff --git a/src/main/kotlin/com/weeth/domain/session/domain/entity/Session.kt b/src/main/kotlin/com/weeth/domain/session/domain/entity/Session.kt index 4df5bfd0..0a71cd67 100644 --- a/src/main/kotlin/com/weeth/domain/session/domain/entity/Session.kt +++ b/src/main/kotlin/com/weeth/domain/session/domain/entity/Session.kt @@ -56,7 +56,7 @@ class Session( var title: String = title private set - @Column(length = 500) + @Column(columnDefinition = "TEXT") var content: String? = content private set From 19c7628e0f83a109b8324006fb2e2ee00b53bbee Mon Sep 17 00:00:00 2001 From: hyxklee Date: Sat, 19 Sep 2026 12:02:13 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20=EC=9D=BC=EC=A0=95=C2=B7?= =?UTF-8?q?=EC=84=B8=EC=85=98=20=EB=82=B4=EC=9A=A9=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EC=A0=9C=ED=95=9C=EC=9D=84=201000=EC=9E=90=EB=A1=9C=20?= =?UTF-8?q?=EC=83=81=ED=96=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 엔티티 컬럼을 TEXT로 넓혔으나 요청 DTO가 500자로 막고 있어, 마이그레이션된 632자 일정을 수정할 때 검증에 걸린다. V3는 해당 필드에 길이 제약이 없었다. Refs: WTH-508 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01FUfuUw4qjjHWfZKiyqgADJ (cherry picked from commit 39fc573230a31c8aab1cac723ed54975827116b0) --- .../schedule/application/dto/request/ScheduleSaveRequest.kt | 2 +- .../schedule/application/dto/request/ScheduleUpdateRequest.kt | 2 +- .../session/application/dto/request/SessionCreateRequest.kt | 2 +- .../session/application/dto/request/SessionUpdateRequest.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/com/weeth/domain/schedule/application/dto/request/ScheduleSaveRequest.kt b/src/main/kotlin/com/weeth/domain/schedule/application/dto/request/ScheduleSaveRequest.kt index d32c6b91..91fa4066 100644 --- a/src/main/kotlin/com/weeth/domain/schedule/application/dto/request/ScheduleSaveRequest.kt +++ b/src/main/kotlin/com/weeth/domain/schedule/application/dto/request/ScheduleSaveRequest.kt @@ -12,7 +12,7 @@ data class ScheduleSaveRequest( @field:NotBlank val title: String, @field:Schema(description = "일정 내용", example = "1박 2일 MT입니다.") - @field:Size(max = 500) + @field:Size(max = 1000) val content: String? = null, @field:Schema(description = "장소", example = "가평") val location: String? = null, diff --git a/src/main/kotlin/com/weeth/domain/schedule/application/dto/request/ScheduleUpdateRequest.kt b/src/main/kotlin/com/weeth/domain/schedule/application/dto/request/ScheduleUpdateRequest.kt index 93c6799b..0e9aee3b 100644 --- a/src/main/kotlin/com/weeth/domain/schedule/application/dto/request/ScheduleUpdateRequest.kt +++ b/src/main/kotlin/com/weeth/domain/schedule/application/dto/request/ScheduleUpdateRequest.kt @@ -8,7 +8,7 @@ data class ScheduleUpdateRequest( @field:Schema(description = "일정 제목 (null=변경 안 함)", example = "MT") val title: String?, @field:Schema(description = "일정 내용 (null=변경 안 함)", example = "1박 2일 MT입니다.") - @field:Size(max = 500) + @field:Size(max = 1000) val content: String?, @field:Schema(description = "장소 (null=변경 안 함)", example = "가평") val location: String?, diff --git a/src/main/kotlin/com/weeth/domain/session/application/dto/request/SessionCreateRequest.kt b/src/main/kotlin/com/weeth/domain/session/application/dto/request/SessionCreateRequest.kt index 3acb49a1..aae9578b 100644 --- a/src/main/kotlin/com/weeth/domain/session/application/dto/request/SessionCreateRequest.kt +++ b/src/main/kotlin/com/weeth/domain/session/application/dto/request/SessionCreateRequest.kt @@ -12,7 +12,7 @@ data class SessionCreateRequest( @field:NotBlank val title: String, @field:Schema(description = "세션 내용", example = "OT 및 자기소개") - @field:Size(max = 500) + @field:Size(max = 1000) val content: String?, @field:Schema(description = "모임 장소", example = "공학관 401호") val location: String?, diff --git a/src/main/kotlin/com/weeth/domain/session/application/dto/request/SessionUpdateRequest.kt b/src/main/kotlin/com/weeth/domain/session/application/dto/request/SessionUpdateRequest.kt index 9c14f0ee..414652c3 100644 --- a/src/main/kotlin/com/weeth/domain/session/application/dto/request/SessionUpdateRequest.kt +++ b/src/main/kotlin/com/weeth/domain/session/application/dto/request/SessionUpdateRequest.kt @@ -8,7 +8,7 @@ data class SessionUpdateRequest( @field:Schema(description = "세션 제목 (null=변경 안 함)", example = "1차 정기모임") val title: String?, @field:Schema(description = "세션 내용 (null=변경 안 함)", example = "OT 및 자기소개") - @field:Size(max = 500) + @field:Size(max = 1000) val content: String?, @field:Schema(description = "모임 장소 (null=변경 안 함)", example = "공학관 401호") val location: String?, From 89677b7aebd7e87d5bbe692fea56f446d13fc42d Mon Sep 17 00:00:00 2001 From: hyxklee Date: Sat, 19 Sep 2026 12:12:54 +0900 Subject: [PATCH 4/5] =?UTF-8?q?build:=20=EC=9D=BC=EC=A0=95=C2=B7=EC=84=B8?= =?UTF-8?q?=EC=85=98=20=EB=82=B4=EC=9A=A9=20=EC=BB=AC=EB=9F=BC=20TEXT=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=A7=88=EC=9D=B4=EA=B7=B8=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flyway로 스키마를 관리하므로 엔티티 변경에 대응하는 V15를 추가한다. prod는 ddl-auto가 validate라 마이그레이션 없이는 기동에 실패한다. Refs: WTH-508 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01FUfuUw4qjjHWfZKiyqgADJ (cherry picked from commit 6b780d82e3cb963b6f9c57886c01fe01dba11c43) --- .../migration/V15__alter_event_session_content_to_text.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/resources/db/migration/V15__alter_event_session_content_to_text.sql diff --git a/src/main/resources/db/migration/V15__alter_event_session_content_to_text.sql b/src/main/resources/db/migration/V15__alter_event_session_content_to_text.sql new file mode 100644 index 00000000..aeb091bb --- /dev/null +++ b/src/main/resources/db/migration/V15__alter_event_session_content_to_text.sql @@ -0,0 +1,7 @@ +-- V3 마이그레이션 대상 데이터의 event.content 최대 길이가 632자로 varchar(500) 한도를 초과한다. +-- session.content(최대 431자)도 여유가 적어 함께 TEXT로 통일한다. +ALTER TABLE event + MODIFY COLUMN content TEXT; + +ALTER TABLE session + MODIFY COLUMN content TEXT; From b67d17f305936eb19aa7e967a890ed9da8b0f80e Mon Sep 17 00:00:00 2001 From: hyxklee Date: Sun, 20 Sep 2026 01:04:51 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=EC=B2=A8=EB=B6=80=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=ED=97=88=EC=9A=A9=20=ED=98=95=EC=8B=9D=EC=97=90=20?= =?UTF-8?q?pptx,=20docx=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit V3 마이그레이션 대상에 세션 자료(pptx 27건)와 문서(docx 2건)가 있어 현행 허용 목록(jpg/jpeg/png/webp/pdf)으로는 이전할 수 없다. FileContentType이 @JvmInline value class의 init에서 검증하므로 별도 컨버터 없이 조회 시점에도 생성자를 통과한다. 즉 이 변경이 배포되기 전에 pptx/docx 행을 넣으면 해당 게시글 조회에서 예외가 난다. 마이그레이션보다 먼저 나가야 하는 이유다. svg는 추가하지 않는다. XML이라