From 1dd724a6d0a885be035262ecd9e0caee6dd04ca1 Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Mon, 22 Jun 2026 17:27:54 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=EC=9B=B9=20=EB=8F=99=EC=95=84?= =?UTF-8?q?=EB=A6=AC=20=ED=95=9C=20=EC=A4=84=20=EC=86=8C=EA=B0=9C=20?= =?UTF-8?q?=EC=BB=AC=EB=9F=BC=EC=9D=84=20100=EC=9E=90=EB=A1=9C=20=ED=99=95?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migration/V89__expand_web_club_short_description.sql | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/resources/db/migration/V89__expand_web_club_short_description.sql diff --git a/src/main/resources/db/migration/V89__expand_web_club_short_description.sql b/src/main/resources/db/migration/V89__expand_web_club_short_description.sql new file mode 100644 index 000000000..1aa142da9 --- /dev/null +++ b/src/main/resources/db/migration/V89__expand_web_club_short_description.sql @@ -0,0 +1,8 @@ +ALTER TABLE web_club + MODIFY COLUMN description VARCHAR(100) NOT NULL; + +ALTER TABLE club_registration_request + MODIFY COLUMN short_description VARCHAR(100) NOT NULL; + +ALTER TABLE club_information_update_request + MODIFY COLUMN short_description VARCHAR(100) NOT NULL; From 4d93a73eb4f512b385b939f46995a48f79b8f81e Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Mon, 22 Jun 2026 17:30:31 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=EC=9B=B9=20=EB=8F=99=EC=95=84?= =?UTF-8?q?=EB=A6=AC=20=EC=86=8C=EA=B0=9C=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=EA=B8=B8=EC=9D=B4=EB=A5=BC=20100=EC=9E=90=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../konect/domain/club/model/ClubInformationUpdateRequest.java | 2 +- .../agit/konect/domain/club/model/ClubRegistrationRequest.java | 2 +- src/main/java/gg/agit/konect/domain/website/model/WebClub.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/club/model/ClubInformationUpdateRequest.java b/src/main/java/gg/agit/konect/domain/club/model/ClubInformationUpdateRequest.java index 3466a779c..3e3b3a315 100644 --- a/src/main/java/gg/agit/konect/domain/club/model/ClubInformationUpdateRequest.java +++ b/src/main/java/gg/agit/konect/domain/club/model/ClubInformationUpdateRequest.java @@ -64,7 +64,7 @@ public class ClubInformationUpdateRequest extends BaseEntity { private String clubTopic; @NotNull - @Column(name = "short_description", length = 30, nullable = false) + @Column(name = "short_description", length = 100, nullable = false) private String shortDescription; @NotNull diff --git a/src/main/java/gg/agit/konect/domain/club/model/ClubRegistrationRequest.java b/src/main/java/gg/agit/konect/domain/club/model/ClubRegistrationRequest.java index 154480ebb..79219259e 100644 --- a/src/main/java/gg/agit/konect/domain/club/model/ClubRegistrationRequest.java +++ b/src/main/java/gg/agit/konect/domain/club/model/ClubRegistrationRequest.java @@ -56,7 +56,7 @@ public class ClubRegistrationRequest extends BaseEntity { private String clubEmoji; @NotNull - @Column(name = "short_description", length = 30, nullable = false) + @Column(name = "short_description", length = 100, nullable = false) private String shortDescription; @NotNull diff --git a/src/main/java/gg/agit/konect/domain/website/model/WebClub.java b/src/main/java/gg/agit/konect/domain/website/model/WebClub.java index f01eda431..746418ff4 100644 --- a/src/main/java/gg/agit/konect/domain/website/model/WebClub.java +++ b/src/main/java/gg/agit/konect/domain/website/model/WebClub.java @@ -46,7 +46,7 @@ public class WebClub extends BaseEntity { @Column(name = "topic", length = 20, nullable = false) private String topic; - @Column(name = "description", length = 30, nullable = false) + @Column(name = "description", length = 100, nullable = false) private String description; @Column(name = "introduce", columnDefinition = "TEXT", nullable = false) From 50229407868e30041505b9ff4c755d1d2d6612fb Mon Sep 17 00:00:00 2001 From: JanooGwan Date: Mon, 22 Jun 2026 17:36:11 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=EC=9B=B9=20=EB=8F=99=EC=95=84?= =?UTF-8?q?=EB=A6=AC=20=ED=95=9C=20=EC=A4=84=20=EC=86=8C=EA=B0=9C=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=9D=84=20100=EC=9E=90=EB=A1=9C=20=ED=97=88?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...nWebsiteClubSheetImportConfirmRequest.java | 2 +- .../AdminWebsiteClubSheetImportService.java | 2 +- .../dto/ClubInformationUpdateRequestDto.java | 4 +- .../club/dto/ClubRegistrationRequestDto.java | 4 +- .../club/ClubRegistrationRequestApiTest.java | 74 +++++++++++++++++++ ...dminWebsiteClubSheetImportServiceTest.java | 23 ++++++ 6 files changed, 103 insertions(+), 6 deletions(-) diff --git a/src/main/java/gg/agit/konect/admin/website/dto/AdminWebsiteClubSheetImportConfirmRequest.java b/src/main/java/gg/agit/konect/admin/website/dto/AdminWebsiteClubSheetImportConfirmRequest.java index c61d134c0..88d7d1e99 100644 --- a/src/main/java/gg/agit/konect/admin/website/dto/AdminWebsiteClubSheetImportConfirmRequest.java +++ b/src/main/java/gg/agit/konect/admin/website/dto/AdminWebsiteClubSheetImportConfirmRequest.java @@ -30,7 +30,7 @@ public record ConfirmClub( String topic, @NotBlank - @Size(max = 30) + @Size(max = 100) String description, @NotNull diff --git a/src/main/java/gg/agit/konect/admin/website/service/AdminWebsiteClubSheetImportService.java b/src/main/java/gg/agit/konect/admin/website/service/AdminWebsiteClubSheetImportService.java index 42bf565eb..d1ffdba0b 100644 --- a/src/main/java/gg/agit/konect/admin/website/service/AdminWebsiteClubSheetImportService.java +++ b/src/main/java/gg/agit/konect/admin/website/service/AdminWebsiteClubSheetImportService.java @@ -44,7 +44,7 @@ public class AdminWebsiteClubSheetImportService { private static final int DEFAULT_HEADER_INDEX = 3; private static final int NAME_MAX_LENGTH = 50; private static final int TOPIC_MAX_LENGTH = 20; - private static final int DESCRIPTION_MAX_LENGTH = 30; + private static final int DESCRIPTION_MAX_LENGTH = 100; private static final int CATEGORY_EMOJI_MAX_LENGTH = 255; private static final String EMPTY_INTRODUCE = ""; private static final int NAME_COLUMN_INDEX = 0; diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubInformationUpdateRequestDto.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubInformationUpdateRequestDto.java index 3b4d6b8fa..dd5103d84 100644 --- a/src/main/java/gg/agit/konect/domain/club/dto/ClubInformationUpdateRequestDto.java +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubInformationUpdateRequestDto.java @@ -32,12 +32,12 @@ public record ClubInformationUpdateRequestDto( String clubTopic, @Schema( - description = "한 줄 소개 (최대 30자)", + description = "한 줄 소개 (최대 100자)", example = "코딩 동아리입니다.", requiredMode = REQUIRED ) @NotBlank(message = "한 줄 소개는 필수입니다.") - @Size(max = 30, message = "한 줄 소개는 최대 30자입니다.") + @Size(max = 100, message = "한 줄 소개는 최대 100자입니다.") String shortDescription, @Schema( diff --git a/src/main/java/gg/agit/konect/domain/club/dto/ClubRegistrationRequestDto.java b/src/main/java/gg/agit/konect/domain/club/dto/ClubRegistrationRequestDto.java index d3f662747..a5e5dae5a 100644 --- a/src/main/java/gg/agit/konect/domain/club/dto/ClubRegistrationRequestDto.java +++ b/src/main/java/gg/agit/konect/domain/club/dto/ClubRegistrationRequestDto.java @@ -37,9 +37,9 @@ public record ClubRegistrationRequestDto( @Size(max = 10, message = "동아리 이모지는 최대 10자입니다.") String clubEmoji, - @Schema(description = "한 줄 소개 (최대 30자)", example = "코딩 동아리입니다.", requiredMode = REQUIRED) + @Schema(description = "한 줄 소개 (최대 100자)", example = "코딩 동아리입니다.", requiredMode = REQUIRED) @NotBlank(message = "한 줄 소개는 필수입니다.") - @Size(max = 30, message = "한 줄 소개는 최대 30자입니다.") + @Size(max = 100, message = "한 줄 소개는 최대 100자입니다.") String shortDescription, @Schema(description = "동아리 소개 (최대 2000자)", example = "상세한 동아리 소개 내용...", requiredMode = REQUIRED) diff --git a/src/test/java/gg/agit/konect/integration/domain/club/ClubRegistrationRequestApiTest.java b/src/test/java/gg/agit/konect/integration/domain/club/ClubRegistrationRequestApiTest.java index aa5442499..9cfbdd899 100644 --- a/src/test/java/gg/agit/konect/integration/domain/club/ClubRegistrationRequestApiTest.java +++ b/src/test/java/gg/agit/konect/integration/domain/club/ClubRegistrationRequestApiTest.java @@ -126,6 +126,42 @@ void registerClubWithLongIntroduction() throws Exception { .andExpect(status().isBadRequest()); } + @Test + @DisplayName("한 줄 소개는 100자까지 등록할 수 있다") + void registerClubWithHundredCharacterShortDescription() throws Exception { + ClubRegistrationRequestDto request = new ClubRegistrationRequestDto( + "한국기술교육대학교", + "BCSD Lab", + ClubCategory.ACADEMIC, + "코딩", + "💻", + "가".repeat(100), + "상세한 동아리 소개 내용입니다.", + List.of() + ); + + performPost("/konect/clubs/registration-requests", request) + .andExpect(status().isCreated()); + } + + @Test + @DisplayName("한 줄 소개가 100자를 초과하면 등록 요청을 거절한다") + void registerClubWithTooLongShortDescription() throws Exception { + ClubRegistrationRequestDto request = new ClubRegistrationRequestDto( + "한국기술교육대학교", + "BCSD Lab", + ClubCategory.ACADEMIC, + "코딩", + "💻", + "가".repeat(101), + "상세한 동아리 소개 내용입니다.", + List.of() + ); + + performPost("/konect/clubs/registration-requests", request) + .andExpect(status().isBadRequest()); + } + @Test @DisplayName("비로그인 사용자도 기존 동아리 정보 수정 요청을 보낼 수 있다") void requestClubInformationUpdateWithoutLogin() throws Exception { @@ -171,6 +207,44 @@ void requestClubInformationUpdateWithMissingFields() throws Exception { .andExpect(status().isBadRequest()); } + @Test + @DisplayName("한 줄 소개는 100자까지 정보 수정을 요청할 수 있다") + void requestClubInformationUpdateWithHundredCharacterShortDescription() throws Exception { + WebUniversity university = persist(WebUniversityFixture.create()); + WebClub club = persist(WebClubFixture.create(university)); + ClubInformationUpdateRequestDto request = new ClubInformationUpdateRequestDto( + "한국기술교육대학교", + "BCSD Lab", + ClubCategory.ACADEMIC, + "코딩", + "가".repeat(100), + "수정 상세 소개입니다.", + List.of() + ); + + performPost("/konect/clubs/" + club.getId() + "/information-update-requests", request) + .andExpect(status().isCreated()); + } + + @Test + @DisplayName("한 줄 소개가 100자를 초과하면 정보 수정 요청을 거절한다") + void requestClubInformationUpdateWithTooLongShortDescription() throws Exception { + WebUniversity university = persist(WebUniversityFixture.create()); + WebClub club = persist(WebClubFixture.create(university)); + ClubInformationUpdateRequestDto request = new ClubInformationUpdateRequestDto( + "한국기술교육대학교", + "BCSD Lab", + ClubCategory.ACADEMIC, + "코딩", + "가".repeat(101), + "수정 상세 소개입니다.", + List.of() + ); + + performPost("/konect/clubs/" + club.getId() + "/information-update-requests", request) + .andExpect(status().isBadRequest()); + } + private ClubInformationUpdateRequestDto createInformationUpdateRequest() { return new ClubInformationUpdateRequestDto( "한국기술교육대학교", diff --git a/src/test/java/gg/agit/konect/unit/admin/website/service/AdminWebsiteClubSheetImportServiceTest.java b/src/test/java/gg/agit/konect/unit/admin/website/service/AdminWebsiteClubSheetImportServiceTest.java index 0b42a76ea..b13e384ca 100644 --- a/src/test/java/gg/agit/konect/unit/admin/website/service/AdminWebsiteClubSheetImportServiceTest.java +++ b/src/test/java/gg/agit/konect/unit/admin/website/service/AdminWebsiteClubSheetImportServiceTest.java @@ -109,6 +109,29 @@ void previewClubsReadsFixedSheetColumns() throws Exception { assertThat(preview.warnings()).hasSize(3); } + @Test + void previewClubsPreservesDescriptionUpToHundredCharacters() throws Exception { + String description = "가".repeat(100); + given(webUniversityRepository.getById(UNIVERSITY_ID)).willReturn(university()); + given(googleSheetsService.spreadsheets()).willReturn(spreadsheets); + given(spreadsheets.values()).willReturn(values); + given(values.get("sheet-id", "'작성 시트'!A1:F1000")).willReturn(getRequest); + given(getRequest.setValueRenderOption("FORMATTED_VALUE")).willReturn(getRequest); + given(getRequest.execute()).willReturn(new ValueRange().setValues(List.of( + List.of("동아리명", "동아리 분과", "기타 분과", "동아리 주제", "대표 이모지", "한 줄 소개"), + List.of("BCSD", "학술분과", "", "개발", "💻", description) + ))); + + AdminWebsiteClubSheetImportPreviewResponse preview = service.previewClubs( + UNIVERSITY_ID, + "https://docs.google.com/spreadsheets/d/sheet-id/edit" + ); + + assertThat(preview.clubs()).singleElement() + .extracting(AdminWebsiteClubSheetImportPreviewResponse.PreviewClub::description) + .isEqualTo(description); + } + @Test void confirmImportSavesEnabledAndNonDuplicateClubsOnly() { List clubs = List.of(