From acac14694b54a8ed06bfff76a4e5b1e396adedd3 Mon Sep 17 00:00:00 2001 From: poketopa Date: Wed, 29 Jul 2026 07:50:10 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EA=B8=B0=EC=88=98=EB=B3=84=20=ED=81=AC?= =?UTF-8?q?=EB=A3=A8=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20=EC=A1=B0=EC=A7=81?= =?UTF-8?q?=20=EB=AC=B8=EC=84=9C=20=EC=A0=9C=EB=AA=A9=EC=9D=84=20=EA=B7=B8?= =?UTF-8?q?=EB=8C=80=EB=A1=9C=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CrewDocumentQueryController.java | 2 +- .../service/CrewDocumentQueryService.java | 12 +++---- .../CrewDocumentQueryControllerTest.java | 30 +++++++++------- .../service/CrewDocumentQueryServiceTest.java | 35 ++++++++++--------- 4 files changed, 41 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/wooteco/wiki/document/controller/CrewDocumentQueryController.java b/src/main/java/com/wooteco/wiki/document/controller/CrewDocumentQueryController.java index a562223..d31ac48 100644 --- a/src/main/java/com/wooteco/wiki/document/controller/CrewDocumentQueryController.java +++ b/src/main/java/com/wooteco/wiki/document/controller/CrewDocumentQueryController.java @@ -23,7 +23,7 @@ public class CrewDocumentQueryController { @Operation(summary = "기수별 크루 목록 조회", description = "기수에 속한 크루의 이름, 문서 UUID, 분야를 조회합니다.") @GetMapping("/crews") public ApiResponse>> findAllByGeneration( - @RequestParam Integer generation + @RequestParam String generation ) { List response = crewDocumentQueryService.findAllByGeneration(generation); return ApiResponseGenerator.success(response); diff --git a/src/main/java/com/wooteco/wiki/document/service/CrewDocumentQueryService.java b/src/main/java/com/wooteco/wiki/document/service/CrewDocumentQueryService.java index 6dd868b..8e02472 100644 --- a/src/main/java/com/wooteco/wiki/document/service/CrewDocumentQueryService.java +++ b/src/main/java/com/wooteco/wiki/document/service/CrewDocumentQueryService.java @@ -15,27 +15,23 @@ @Service public class CrewDocumentQueryService { - private static final String GENERATION_SUFFIX = "기"; - private final GenerationCrewQueryRepository generationCrewQueryRepository; private final CrewProfileExtractor crewProfileExtractor; @Transactional(readOnly = true) - public List findAllByGeneration(Integer generation) { + public List findAllByGeneration(String generation) { validateGeneration(generation); - String generationTitle = generation + GENERATION_SUFFIX; List readModels = generationCrewQueryRepository - .findAllByGenerationTitle(generationTitle); + .findAllByGenerationTitle(generation); GenerationCrewCandidates candidates = GenerationCrewCandidates.from(readModels); List responses = candidates.extractResponses(crewProfileExtractor); responses.sort(Comparator.comparing(GenerationCrewResponse::name)); return List.copyOf(responses); } - private void validateGeneration(Integer generation) { - if (generation == null || generation <= 0) { + private void validateGeneration(String generation) { + if (generation == null || generation.isBlank()) { throw new WikiException(ErrorCode.VALIDATION_ERROR); } } - } diff --git a/src/test/java/com/wooteco/wiki/document/controller/CrewDocumentQueryControllerTest.java b/src/test/java/com/wooteco/wiki/document/controller/CrewDocumentQueryControllerTest.java index c3f7675..f82924d 100644 --- a/src/test/java/com/wooteco/wiki/document/controller/CrewDocumentQueryControllerTest.java +++ b/src/test/java/com/wooteco/wiki/document/controller/CrewDocumentQueryControllerTest.java @@ -61,7 +61,7 @@ void findAllByGeneration_success_byValidGeneration() { // when & then RestAssured.given().log().all() - .queryParam("generation", 8) + .queryParam("generation", "8기") .when() .get("/document/crews") .then().log().all() @@ -80,24 +80,28 @@ void findAllByGeneration_fail_byMissingGeneration() { } @Test - @DisplayName("기수가 문자열이면 검증 실패를 반환한다.") - void findAllByGeneration_fail_byNonNumericGeneration() { + @DisplayName("기수가 빈 문자열이면 검증 실패를 반환한다.") + void findAllByGeneration_fail_byEmptyGeneration() { // when & then - assertValidationError("/document/crews?generation=eight"); + assertValidationError("/document/crews?generation="); } @Test - @DisplayName("기수가 0이면 검증 실패를 반환한다.") - void findAllByGeneration_fail_byZeroGeneration() { - // when & then - assertValidationError("/document/crews?generation=0"); - } + @DisplayName("입력한 조직 제목과 정확히 일치하는 기수가 없으면 빈 목록을 반환한다.") + void findAllByGeneration_success_byNoExactGenerationTitle() { + // given + CrewDocument crewDocument = saveCrewDocument("가람 (8기)"); + OrganizationDocument generation = saveOrganizationDocument("8기"); + saveLink(crewDocument, generation); - @Test - @DisplayName("기수가 음수면 검증 실패를 반환한다.") - void findAllByGeneration_fail_byNegativeGeneration() { // when & then - assertValidationError("/document/crews?generation=-1"); + RestAssured.given().log().all() + .queryParam("generation", "8") + .when() + .get("/document/crews") + .then().log().all() + .statusCode(HttpStatus.OK.value()) + .body("data", hasSize(0)); } } diff --git a/src/test/java/com/wooteco/wiki/document/service/CrewDocumentQueryServiceTest.java b/src/test/java/com/wooteco/wiki/document/service/CrewDocumentQueryServiceTest.java index ce8d120..01f0722 100644 --- a/src/test/java/com/wooteco/wiki/document/service/CrewDocumentQueryServiceTest.java +++ b/src/test/java/com/wooteco/wiki/document/service/CrewDocumentQueryServiceTest.java @@ -47,18 +47,21 @@ class CrewDocumentQueryServiceTest { class FindAllByGeneration { @Test - @DisplayName("요청한 기수에 속한 크루만 반환한다.") - void findAllByGeneration_success_byMatchingGeneration() { + @DisplayName("요청한 조직 제목과 정확히 일치하는 기수의 크루만 반환한다.") + void findAllByGeneration_success_byExactGenerationTitle() { // given OrganizationDocument eighthGeneration = saveOrganizationDocument("8기"); + OrganizationDocument spacedEighthGeneration = saveOrganizationDocument("8 기"); OrganizationDocument seventhGeneration = saveOrganizationDocument("7기"); CrewDocument eighthCrew = saveCrewDocument("가람(8기)"); - CrewDocument seventhCrew = saveCrewDocument("나래(7기)"); + CrewDocument spacedEighthCrew = saveCrewDocument("나래(8기)"); + CrewDocument seventhCrew = saveCrewDocument("다온(7기)"); saveLink(eighthCrew, eighthGeneration); + saveLink(spacedEighthCrew, spacedEighthGeneration); saveLink(seventhCrew, seventhGeneration); // when - List responses = crewDocumentQueryService.findAllByGeneration(8); + List responses = crewDocumentQueryService.findAllByGeneration("8기"); // then assertSoftly(softly -> { @@ -85,7 +88,7 @@ void findAllByGeneration_success_byAllowedFields() { saveLinks(androidCrew, generation, android); // when - List responses = crewDocumentQueryService.findAllByGeneration(8); + List responses = crewDocumentQueryService.findAllByGeneration("8기"); // then assertThat(responses) @@ -109,7 +112,7 @@ void findAllByGeneration_success_byIndeterminateFields() { saveLinks(multipleFieldCrew, generation, backend, frontend); // when - List responses = crewDocumentQueryService.findAllByGeneration(8); + List responses = crewDocumentQueryService.findAllByGeneration("8기"); // then assertThat(responses) @@ -130,7 +133,7 @@ void findAllByGeneration_success_byCrewTitleFormats() { saveLink(plainCrew, generation); // when - List responses = crewDocumentQueryService.findAllByGeneration(8); + List responses = crewDocumentQueryService.findAllByGeneration("8기"); // then assertThat(responses) @@ -147,7 +150,7 @@ void findAllByGeneration_success_byBlankExtractedName() { saveLink(blankNameCrew, generation); // when - List responses = crewDocumentQueryService.findAllByGeneration(8); + List responses = crewDocumentQueryService.findAllByGeneration("8기"); // then assertThat(responses).isEmpty(); @@ -166,7 +169,7 @@ void findAllByGeneration_success_byNameAscendingOrder() { saveLink(secondCrew, generation); // when - List responses = crewDocumentQueryService.findAllByGeneration(8); + List responses = crewDocumentQueryService.findAllByGeneration("8기"); // then assertThat(responses) @@ -178,27 +181,27 @@ void findAllByGeneration_success_byNameAscendingOrder() { @DisplayName("해당 기수의 크루가 없으면 빈 목록을 반환한다.") void findAllByGeneration_success_byNoCrew() { // when - List responses = crewDocumentQueryService.findAllByGeneration(8); + List responses = crewDocumentQueryService.findAllByGeneration("8기"); // then assertThat(responses).isEmpty(); } @Test - @DisplayName("기수가 0이면 검증 예외가 발생한다.") - void findAllByGeneration_fail_byZeroGeneration() { + @DisplayName("기수가 공백이면 검증 예외가 발생한다.") + void findAllByGeneration_fail_byBlankGeneration() { // when & then - assertThatThrownBy(() -> crewDocumentQueryService.findAllByGeneration(0)) + assertThatThrownBy(() -> crewDocumentQueryService.findAllByGeneration(" ")) .isInstanceOf(WikiException.class) .extracting("errorCode") .isEqualTo(ErrorCode.VALIDATION_ERROR); } @Test - @DisplayName("기수가 음수면 검증 예외가 발생한다.") - void findAllByGeneration_fail_byNegativeGeneration() { + @DisplayName("기수가 null이면 검증 예외가 발생한다.") + void findAllByGeneration_fail_byNullGeneration() { // when & then - assertThatThrownBy(() -> crewDocumentQueryService.findAllByGeneration(-1)) + assertThatThrownBy(() -> crewDocumentQueryService.findAllByGeneration(null)) .isInstanceOf(WikiException.class) .extracting("errorCode") .isEqualTo(ErrorCode.VALIDATION_ERROR);