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 85a159b..8846e26 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 @@ -16,10 +16,15 @@ public class FindIntroduceResponse implements SearchResultResponse { private Long introId; private String title; private String content; - private LocalDate createdDate; + private LocalDate updatedDate; + +// @Override +// public LocalDate getCreatedDate() { +// return createdDate; +// } @Override - public LocalDate getCreatedDate() { - return createdDate; + public LocalDate getUpdatedDate() { + return updatedDate; } } 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 dcf377a..d67813a 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 @@ -16,10 +16,17 @@ public class FindMasterIntroduceResponse implements SearchResultResponse { private Long masterIntroId; private String title; private String content; - private LocalDate createdDate; + private LocalDate updatedDate; + +// @Override +// public LocalDate getCreatedDate() { +// return createdDate; +// } @Override - public LocalDate getCreatedDate() { - return createdDate; + public LocalDate getUpdatedDate() { + return updatedDate; } + + } 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 index 7e8d7d7..1ef05e4 100644 --- a/src/main/java/umc/kkijuk/server/introduce/controller/response/SearchResultResponse.java +++ b/src/main/java/umc/kkijuk/server/introduce/controller/response/SearchResultResponse.java @@ -3,5 +3,6 @@ import java.time.LocalDate; public interface SearchResultResponse { - LocalDate getCreatedDate(); +// LocalDate getCreatedDate(); + LocalDate getUpdatedDate(); } 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 8248c71..ba786cd 100644 --- a/src/main/java/umc/kkijuk/server/introduce/repository/IntroduceRepository.java +++ b/src/main/java/umc/kkijuk/server/introduce/repository/IntroduceRepository.java @@ -19,7 +19,13 @@ public interface IntroduceRepository extends JpaRepository { Page findActiveIntroduces(@Param("memberId") Long memberId, @Param("state") int state, Pageable pageable); - @Query("SELECT i FROM Introduce i JOIN FETCH i.questions q WHERE i.memberId = :memberId AND q.content LIKE %:keyword%") + @Query(""" + SELECT DISTINCT i + FROM Introduce i + JOIN FETCH i.questions q + WHERE i.memberId = :memberId + AND LOWER(CAST(q.content AS string)) LIKE CONCAT('%', LOWER(: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 cb4ccff..7eaf030 100644 --- a/src/main/java/umc/kkijuk/server/introduce/repository/MasterIntroduceRepository.java +++ b/src/main/java/umc/kkijuk/server/introduce/repository/MasterIntroduceRepository.java @@ -12,7 +12,13 @@ public interface MasterIntroduceRepository extends JpaRepository { Optional findByMemberId(Long memberId); - @Query("SELECT DISTINCT m FROM MasterIntroduce m JOIN FETCH m.masterQuestion q WHERE m.memberId = :memberId AND q.content LIKE %:keyword%") + @Query(""" + SELECT DISTINCT m + FROM MasterIntroduce m + JOIN FETCH m.masterQuestion q + WHERE m.memberId = :memberId + AND LOWER(CAST(q.content AS string)) LIKE CONCAT('%', LOWER(: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 b488f25..d6d9945 100644 --- a/src/main/java/umc/kkijuk/server/introduce/service/IntroduceServiceImpl.java +++ b/src/main/java/umc/kkijuk/server/introduce/service/IntroduceServiceImpl.java @@ -269,48 +269,44 @@ public Long deleteIntro(Member requestMember, Long introId, Long recruitId) { @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 먼저 적용 - .map(q -> FindIntroduceResponse.builder() - .introId(introduce.getId()) - .title(introduce.getRecruit().getTitle()) - .content(q.getContent()) - .createdDate(introduce.getCreatedAt().toLocalDate()) - .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 먼저 적용 - .map(mq -> FindMasterIntroduceResponse.builder() - .masterIntroId(masterIntroduce.getId()) - .title("Master") - .content(mq.getContent()) - .createdDate(masterIntroduce.getCreatedAt().toLocalDate()) - .build())) - .collect(Collectors.toList()); - - // 공통 결과로 합치기 + 정렬 (최신순) + List introduceList = + introduceRepository.searchIntroduceByKeywordForMember(keyword, requestMember.getId()) + .stream() + .flatMap(introduce -> introduce.getQuestions().stream() + .map(q -> FindIntroduceResponse.builder() + .introId(introduce.getId()) + .title(introduce.getRecruit().getTitle()) + .content(q.getContent()) + .updatedDate(introduce.getUpdatedAt().toLocalDate()) + .build())) + .collect(Collectors.toList()); + + List masterIntroduceList = + masterIntroduceRepository.searchMasterIntroduceByKeywordForMember(keyword, requestMember.getId()) + .stream() + .flatMap(masterIntroduce -> masterIntroduce.getMasterQuestion().stream() + .map(mq -> FindMasterIntroduceResponse.builder() + .masterIntroId(masterIntroduce.getId()) + .title("Master") + .content(mq.getContent()) + .updatedDate(masterIntroduce.getUpdatedAt().toLocalDate()) + .build())) + .collect(Collectors.toList()); + + // 합치기 + 최신순 정렬 List result = new ArrayList<>(); result.addAll(masterIntroduceList); result.addAll(introduceList); - result.sort(Comparator.comparing(SearchResultResponse::getCreatedDate).reversed()); // 최신순 정렬 + result.sort(Comparator.comparing(SearchResultResponse::getUpdatedDate).reversed()); - // 응답 반환 Map response = new LinkedHashMap<>(); response.put("count", result.size()); response.put("data", result); - return response; } - @Override @Transactional public Introduce findByRecruitId(Long recruitId) {