=
#~~
형식의 tag
검색어들을 parsing
해서 tagNames List
에 추가합니다.// 태그 검색어 # 기준으로 파싱
public List<String> queryParsing(String tag) {
log.info("queryParsing tag ={}", tag);
//검색어에서 '#~~' 형식의 pattern 하나씩분리
Pattern p = Pattern.compile("\\#([ㄱ-ㅎ가-힣a-zA-Z\\d]+)");
Matcher m = p.matcher(tag); //문자열 설정
List<String> tagNames = new ArrayList<>();
// 패턴에 해당하는 그룹에서 tagName 추출
while (m.find()) {
tagNames.add(m.group().substring(1));
}
//tagNames List에 추가하여 반환
return tagNames;
}
// Service
List<Long> tagIds = queryTagRepository.findTagsByContent(tagNames);
if (tagIds.isEmpty()) {
throw new PostNotFound(); //태그 내용과 일치하는 게시물이 없을경우 예외 던짐
}
//Repository
public List<Long> findTagsByContent(List<String> tagNames) {
return jpaQueryFactory.select(tag.id)
.from(tag)
.where(tag.content.in(tagNames))
.fetch();
}
// Service
List<Long> postIds = queryTagRepository.findPostByTag(lastPostId, tagIds, pageable);
//Repository
public List<Long> findPostByTag( Long lasPostId, List<Long> tagIds, Pageable pageable) {
//distinct 필요할수도
return jpaQueryFactory.selectDistinct(post.id)
.from(postTag)
.join(post)
.on(postTag.post.id.eq(post.id))
.where(
inTagIds(tagIds))
...
}