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 366977c..85a159b 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 437b32d..dcf377a 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 0000000..7e8d7d7 --- /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 303817b..8248c71 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 31eff56..cb4ccff 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 1adf9af..b488f25 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) {