From 21b917cd2db4f9d2af1275edef62de927d33642f Mon Sep 17 00:00:00 2001 From: shinae1023 Date: Fri, 22 May 2026 16:37:43 +0900 Subject: [PATCH] =?UTF-8?q?[Refactor]=20=EC=B1=84=EC=9A=A9=EA=B3=B5?= =?UTF-8?q?=EA=B3=A0=20=EC=B6=94=EC=B6=9C=20=EA=B2=80=EC=83=89=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20(#27)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JobPostingClassificationService.java | 3 +- .../jobdri_api/domain/user/entity/User.java | 4 +- .../JobPostingClassificationServiceTest.java | 58 +++++++++++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingClassificationServiceTest.java diff --git a/src/main/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingClassificationService.java b/src/main/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingClassificationService.java index b48be9c..0e02c6a 100644 --- a/src/main/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingClassificationService.java +++ b/src/main/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingClassificationService.java @@ -30,8 +30,7 @@ private String buildSearchQuery(JobPostingExtractResponse extracted) { normalize(extracted.jobTitle()), normalize(extracted.task()), normalize(extracted.requirements()), - normalize(extracted.preferredQualifications()), - normalize(extracted.rawText()) + normalize(extracted.preferredQualifications()) ).trim(); } diff --git a/src/main/java/com/jobdri/jobdri_api/domain/user/entity/User.java b/src/main/java/com/jobdri/jobdri_api/domain/user/entity/User.java index e6d4b70..aaccabb 100644 --- a/src/main/java/com/jobdri/jobdri_api/domain/user/entity/User.java +++ b/src/main/java/com/jobdri/jobdri_api/domain/user/entity/User.java @@ -74,7 +74,7 @@ public static User signup( .role(UserRole.USER) .socialType(SocialType.LOCAL) .socialId(null) - .credit(0) + .credit(1) .build(); } @@ -92,7 +92,7 @@ public static User createSocialUser( .socialType(socialType) .socialId(socialId) .role(UserRole.USER) - .credit(0) + .credit(1) .build(); } diff --git a/src/test/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingClassificationServiceTest.java b/src/test/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingClassificationServiceTest.java new file mode 100644 index 0000000..97348bb --- /dev/null +++ b/src/test/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingClassificationServiceTest.java @@ -0,0 +1,58 @@ +package com.jobdri.jobdri_api.domain.jobposting.service; + +import com.jobdri.jobdri_api.domain.classification.repository.DetailClassificationRepository; +import com.jobdri.jobdri_api.domain.jobposting.dto.response.JobPostingExtractResponse; +import com.jobdri.jobdri_api.domain.jobposting.repository.JobPostingClassificationCandidateProjection; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class JobPostingClassificationServiceTest { + + @Mock + private DetailClassificationRepository detailClassificationRepository; + + @InjectMocks + private JobPostingClassificationService jobPostingClassificationService; + + @Test + @DisplayName("후보 검색 쿼리는 rawText를 제외한 구조화 필드만 사용한다") + void findCandidatesUsesStructuredFieldsOnly() { + JobPostingExtractResponse extracted = new JobPostingExtractResponse( + "해커스 교육그룹", + "클라우드 엔지니어 (CLOUD Engineer)", + "클라우드 운영 및 관리", + "1. 리눅스 환경 사용 경험 필수\n2. 네트워크 지식 필수", + "1. AWS, NCP, GCP, azure 클라우드 운영 경험", + "해커스 교육그룹 개발자 RECRUIT 소프트웨어 교육 교육 기획", + 0.9 + ); + when(detailClassificationRepository.findTopCandidatesByTrigram(org.mockito.ArgumentMatchers.anyString(), org.mockito.ArgumentMatchers.eq(5))) + .thenReturn(List.of()); + + jobPostingClassificationService.findCandidates(extracted, 5); + + ArgumentCaptor queryCaptor = ArgumentCaptor.forClass(String.class); + verify(detailClassificationRepository).findTopCandidatesByTrigram(queryCaptor.capture(), org.mockito.ArgumentMatchers.eq(5)); + + String query = queryCaptor.getValue(); + assertThat(query).contains("클라우드 엔지니어 (CLOUD Engineer)"); + assertThat(query).contains("클라우드 운영 및 관리"); + assertThat(query).contains("리눅스 환경 사용 경험 필수"); + assertThat(query).contains("AWS, NCP, GCP, azure 클라우드 운영 경험"); + assertThat(query).doesNotContain("해커스 교육그룹"); + assertThat(query).doesNotContain("소프트웨어 교육"); + assertThat(query).doesNotContain("교육 기획"); + } +}