Skip to content

Commit 689c838

Browse files
authored
[Feat] 검색창 기능 구현 (#330)
* work * refactor: 가격 필터링 로직 할인된가격으로 수정 * work * work
1 parent 77af2e2 commit 689c838

File tree

13 files changed

+596
-238
lines changed

13 files changed

+596
-238
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.back.domain.artist.repository;
2+
3+
import com.back.domain.artist.entity.ArtistProfile;
4+
5+
import java.util.List;
6+
7+
public interface ArtistProfileCustomRepository {
8+
9+
// 검색(작가)
10+
List<ArtistProfile> searchByArtistName(String keyword);
11+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.back.domain.artist.repository;
2+
3+
import com.back.domain.artist.entity.ArtistProfile;
4+
import com.back.domain.artist.entity.QArtistProfile;
5+
import com.querydsl.core.BooleanBuilder;
6+
import com.querydsl.jpa.impl.JPAQueryFactory;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Repository;
9+
import org.springframework.util.StringUtils;
10+
11+
import java.util.List;
12+
13+
@Repository
14+
@RequiredArgsConstructor
15+
public class ArtistProfileCustomRepositoryImpl implements ArtistProfileCustomRepository {
16+
17+
private final JPAQueryFactory queryFactory;
18+
19+
/**
20+
* 검색 키워드(작가 이름)에 해당하는 작가 조회
21+
*/
22+
@Override
23+
public List<ArtistProfile> searchByArtistName(String keyword) {
24+
QArtistProfile artistProfile = QArtistProfile.artistProfile;
25+
BooleanBuilder builder = new BooleanBuilder();
26+
27+
if (StringUtils.hasText(keyword)) {
28+
String[] keywords = keyword.trim().toLowerCase().split("\\s+"); // 키워드 앞뒤 공백 제거, 소문자 변환, 공백 기준으로 분리
29+
for (String kw : keywords) {
30+
builder.or(artistProfile.artistName.toLowerCase().contains(kw)); // or 조건(여러 키워드 중 하나라도 해당하면 조회)
31+
}
32+
}
33+
34+
return queryFactory
35+
.selectFrom(artistProfile)
36+
.where(builder)
37+
.fetch();
38+
}
39+
}

src/main/java/com/back/domain/artist/repository/ArtistProfileRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import java.util.List;
99
import java.util.Optional;
1010

11-
public interface ArtistProfileRepository extends JpaRepository<ArtistProfile, Long> {
11+
public interface ArtistProfileRepository extends JpaRepository<ArtistProfile, Long>, ArtistProfileCustomRepository {
1212

1313
// User ID로 작가 프로필 조회
1414
Optional<ArtistProfile> findByUserId(Long artistId);

src/main/java/com/back/domain/funding/repository/FundingCustomRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.springframework.data.domain.Page;
66
import org.springframework.data.domain.Pageable;
77

8+
import java.util.List;
89
import java.util.Set;
910

1011
public interface FundingCustomRepository {
@@ -25,4 +26,7 @@ Page<Funding> findByFilters(
2526
Long maxPrice,
2627
Pageable pageable
2728
);
29+
30+
// 검색(펀딩)
31+
List<Funding> searchByTitle(String keyword);
2832
}

src/main/java/com/back/domain/funding/repository/FundingCustomRepositoryImpl.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,42 @@ private long countByFilters(
139139

140140
return em.createQuery(countQuery).getSingleResult();
141141
}
142+
143+
/**
144+
* 검색 키워드(펀딩 제목)에 해당하는 펀딩 조회
145+
*/
146+
@Override
147+
public List<Funding> searchByTitle(String keyword) {
148+
CriteriaBuilder cb = em.getCriteriaBuilder();
149+
CriteriaQuery<Funding> query = cb.createQuery(Funding.class);
150+
Root<Funding> funding = query.from(Funding.class);
151+
152+
List<Predicate> predicates = new ArrayList<>();
153+
154+
// 키워드 검색 로직
155+
if (org.springframework.util.StringUtils.hasText(keyword)) {
156+
String[] keywords = keyword.trim().toLowerCase().split("\\s+");// 키워드 앞뒤 공백 제거, 소문자 변환, 공백 기준으로 분리
157+
List<Predicate> orPredicates = new ArrayList<>();
158+
for (String kw : keywords) {
159+
orPredicates.add(cb.like(cb.lower(funding.get("title")), "%" + kw + "%")); // LIKE %keyword%
160+
}
161+
predicates.add(cb.or(orPredicates.toArray(new Predicate[0])));
162+
} else {
163+
// 키워드가 없으면 빈 리스트 반환
164+
return java.util.Collections.emptyList();
165+
}
166+
167+
// 사용자가 볼 수 있는 상태의 펀딩만 검색
168+
predicates.add(funding.get("status").in(
169+
com.back.domain.funding.entity.FundingStatus.OPEN,
170+
com.back.domain.funding.entity.FundingStatus.APPROVED,
171+
com.back.domain.funding.entity.FundingStatus.SUCCESS,
172+
com.back.domain.funding.entity.FundingStatus.CLOSED
173+
));
174+
175+
query.where(predicates.toArray(new Predicate[0]));
176+
query.distinct(true);
177+
178+
return em.createQuery(query).getResultList();
179+
}
142180
}

0 commit comments

Comments
 (0)