From 2b8dca4effaec6e8819134372d7694d3c4f9fbc8 Mon Sep 17 00:00:00 2001 From: Suhun0331 Date: Tue, 3 Jun 2025 13:37:07 +0900 Subject: [PATCH] =?UTF-8?q?Refactor=20:=20=EC=9E=90=EC=86=8C=EC=84=9C=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20fetch=20join=20=EC=A0=81=EC=9A=A9=20?= =?UTF-8?q?=EB=B0=8F=20=EC=BF=BC=EB=A6=AC=20=EB=B0=A9=EC=8B=9D=EC=9C=BC?= =?UTF-8?q?=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 --- .../response/FindIntroduceResponse.java | 14 +++-- .../response/FindMasterIntroduceResponse.java | 14 +++-- .../response/SearchResultResponse.java | 7 +++ .../repository/IntroduceRepository.java | 7 ++- .../repository/MasterIntroduceRepository.java | 8 +-- .../service/IntroduceServiceImpl.java | 54 +++++++++++++++++-- 6 files changed, 85 insertions(+), 19 deletions(-) create mode 100644 src/main/java/umc/kkijuk/server/introduce/controller/response/SearchResultResponse.java diff --git a/src/main/java/umc/kkijuk/server/introduce/controller/response/FindIntroduceResponse.java b/src/main/java/umc/kkijuk/server/introduce/controller/response/FindIntroduceResponse.java index 366977c3..85a159b7 100644 --- a/src/main/java/umc/kkijuk/server/introduce/controller/response/FindIntroduceResponse.java +++ b/src/main/java/umc/kkijuk/server/introduce/controller/response/FindIntroduceResponse.java @@ -5,13 +5,21 @@ import java.time.LocalDate; import java.time.LocalDateTime; -@Data +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDate; + @Getter @Builder -@AllArgsConstructor -public class FindIntroduceResponse { +public class FindIntroduceResponse implements SearchResultResponse { private Long introId; private String title; private String content; private LocalDate createdDate; + + @Override + public LocalDate getCreatedDate() { + return createdDate; + } } diff --git a/src/main/java/umc/kkijuk/server/introduce/controller/response/FindMasterIntroduceResponse.java b/src/main/java/umc/kkijuk/server/introduce/controller/response/FindMasterIntroduceResponse.java index 437b32dd..dcf377aa 100644 --- a/src/main/java/umc/kkijuk/server/introduce/controller/response/FindMasterIntroduceResponse.java +++ b/src/main/java/umc/kkijuk/server/introduce/controller/response/FindMasterIntroduceResponse.java @@ -5,13 +5,21 @@ import java.time.LocalDate; import java.time.LocalDateTime; -@Data +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDate; + @Getter @Builder -@AllArgsConstructor -public class FindMasterIntroduceResponse { +public class FindMasterIntroduceResponse implements SearchResultResponse { private Long masterIntroId; private String title; private String content; private LocalDate createdDate; + + @Override + public LocalDate getCreatedDate() { + return createdDate; + } } diff --git a/src/main/java/umc/kkijuk/server/introduce/controller/response/SearchResultResponse.java b/src/main/java/umc/kkijuk/server/introduce/controller/response/SearchResultResponse.java new file mode 100644 index 00000000..7e8d7d7e --- /dev/null +++ b/src/main/java/umc/kkijuk/server/introduce/controller/response/SearchResultResponse.java @@ -0,0 +1,7 @@ +package umc.kkijuk.server.introduce.controller.response; + +import java.time.LocalDate; + +public interface SearchResultResponse { + LocalDate getCreatedDate(); +} diff --git a/src/main/java/umc/kkijuk/server/introduce/repository/IntroduceRepository.java b/src/main/java/umc/kkijuk/server/introduce/repository/IntroduceRepository.java index 303817b4..8248c71a 100644 --- a/src/main/java/umc/kkijuk/server/introduce/repository/IntroduceRepository.java +++ b/src/main/java/umc/kkijuk/server/introduce/repository/IntroduceRepository.java @@ -18,10 +18,9 @@ public interface IntroduceRepository extends JpaRepository { @Query("SELECT i FROM Introduce i WHERE i.memberId = :memberId AND i.state = :state AND i.recruit.endTime > CURRENT_TIMESTAMP ORDER BY i.recruit.endTime ASC") Page findActiveIntroduces(@Param("memberId") Long memberId, @Param("state") int state, Pageable pageable); - @Query("SELECT i FROM Introduce i " + - "JOIN i.questions q " + - "WHERE i.memberId = :memberId AND q.content LIKE %:keyword%") - List searchIntroduceByKeywordForMember(String keyword, Long memberId); + + @Query("SELECT i FROM Introduce i JOIN FETCH i.questions q WHERE i.memberId = :memberId AND q.content LIKE %:keyword%") + List searchIntroduceByKeywordForMember(@Param("keyword") String keyword, @Param("memberId") Long memberId); } diff --git a/src/main/java/umc/kkijuk/server/introduce/repository/MasterIntroduceRepository.java b/src/main/java/umc/kkijuk/server/introduce/repository/MasterIntroduceRepository.java index 31eff56a..cb4ccff6 100644 --- a/src/main/java/umc/kkijuk/server/introduce/repository/MasterIntroduceRepository.java +++ b/src/main/java/umc/kkijuk/server/introduce/repository/MasterIntroduceRepository.java @@ -3,6 +3,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import umc.kkijuk.server.introduce.domain.Introduce; import umc.kkijuk.server.introduce.domain.MasterIntroduce; import java.util.List; @@ -10,9 +11,8 @@ public interface MasterIntroduceRepository extends JpaRepository { Optional findByMemberId(Long memberId); - @Query("SELECT m FROM MasterIntroduce m " + - "JOIN m.masterQuestion mq " + - "WHERE m.memberId = :memberId AND mq.content LIKE %:keyword%") - List searchMasterIntroduceByKeywordForMember(String keyword, Long memberId); + + @Query("SELECT DISTINCT m FROM MasterIntroduce m JOIN FETCH m.masterQuestion q WHERE m.memberId = :memberId AND q.content LIKE %:keyword%") + List searchMasterIntroduceByKeywordForMember(@Param("keyword") String keyword, @Param("memberId") Long memberId); } diff --git a/src/main/java/umc/kkijuk/server/introduce/service/IntroduceServiceImpl.java b/src/main/java/umc/kkijuk/server/introduce/service/IntroduceServiceImpl.java index 1adf9af0..b488f250 100644 --- a/src/main/java/umc/kkijuk/server/introduce/service/IntroduceServiceImpl.java +++ b/src/main/java/umc/kkijuk/server/introduce/service/IntroduceServiceImpl.java @@ -228,12 +228,52 @@ public Long deleteIntro(Member requestMember, Long introId, Long recruitId) { return introduce.getId(); } +// @Override +// public Map searchIntroduceAndMasterByKeyword(String keyword, Member requestMember) { +// List introduceList = introduceRepository.searchIntroduceByKeywordForMember(keyword, requestMember.getId()) +// .stream() +// .flatMap(introduce -> introduce.getQuestions().stream() +// .filter(q -> q.getContent().contains(keyword)) +// .map(q -> FindIntroduceResponse.builder() +// .introId(introduce.getId()) +// .title(introduce.getRecruit().getTitle()) +// .content(q.getContent()) +// .createdDate(introduce.getCreatedAt().toLocalDate()) +// .build())) +// .collect(Collectors.toList()); +// +// List masterIntroduceList = masterIntroduceRepository.searchMasterIntroduceByKeywordForMember(keyword, requestMember.getId()) +// .stream() +// .flatMap(masterIntroduce -> masterIntroduce.getMasterQuestion().stream() +// .filter(mq -> mq.getContent().contains(keyword)) +// .map(mq -> FindMasterIntroduceResponse.builder() +// .masterIntroId(masterIntroduce.getId()) +// .title("Master") +// .content(mq.getContent()) +// .createdDate(masterIntroduce.getCreatedAt().toLocalDate()) +// .build())) +// .collect(Collectors.toList()); +// +// List result = new ArrayList<>(); +// result.addAll(masterIntroduceList); +// result.addAll(introduceList); +// +// int count = result.size(); +// +// Map response = new LinkedHashMap<>(); +// response.put("count", count); +// response.put("data", result); +// +// return response; +// } + @Override public Map searchIntroduceAndMasterByKeyword(String keyword, Member requestMember) { + // Introduce 검색 List introduceList = introduceRepository.searchIntroduceByKeywordForMember(keyword, requestMember.getId()) .stream() .flatMap(introduce -> introduce.getQuestions().stream() - .filter(q -> q.getContent().contains(keyword)) + .filter(q -> q.getContent().contains(keyword)) // ✨ filter 먼저 적용 .map(q -> FindIntroduceResponse.builder() .introId(introduce.getId()) .title(introduce.getRecruit().getTitle()) @@ -242,10 +282,11 @@ public Map searchIntroduceAndMasterByKeyword(String keyword, Mem .build())) .collect(Collectors.toList()); + // MasterIntroduce 검색 List masterIntroduceList = masterIntroduceRepository.searchMasterIntroduceByKeywordForMember(keyword, requestMember.getId()) .stream() .flatMap(masterIntroduce -> masterIntroduce.getMasterQuestion().stream() - .filter(mq -> mq.getContent().contains(keyword)) + .filter(mq -> mq.getContent().contains(keyword)) // ✨ filter 먼저 적용 .map(mq -> FindMasterIntroduceResponse.builder() .masterIntroId(masterIntroduce.getId()) .title("Master") @@ -254,19 +295,22 @@ public Map searchIntroduceAndMasterByKeyword(String keyword, Mem .build())) .collect(Collectors.toList()); - List result = new ArrayList<>(); + // 공통 결과로 합치기 + 정렬 (최신순) + List result = new ArrayList<>(); result.addAll(masterIntroduceList); result.addAll(introduceList); - int count = result.size(); + result.sort(Comparator.comparing(SearchResultResponse::getCreatedDate).reversed()); // 최신순 정렬 + // 응답 반환 Map response = new LinkedHashMap<>(); - response.put("count", count); + response.put("count", result.size()); response.put("data", result); return response; } + @Override @Transactional public Introduce findByRecruitId(Long recruitId) {