검색 기능은 간단하다. querydsl의 contain기능을 사용하여 리스트를 뽑아낸다.
1. PostRepositorySupport 수정
public List<Post> getPosts(String query) {
return queryFactory.selectFrom(post).where(post.content.contains(query)).orderBy(post.modifiedDate.desc()).fetch();
}
- post 테이블에서 content 내용 중 query를 포함하는 게시글들의 목록을 반환한다.
2. PostService, Controller 수정
@GetMapping("/posts/search")
public ResponseEntity getSearchPostList(@CurrentUser User user, @RequestParam(value = "query") String query) {
try {
return ResponseEntity.ok().body(postService.getSearchPostList(user, query));
} catch (Exception e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
@Transactional
public PostResponseDto getSearchPostList(User user, String query) {
List<Post> postList = postRepositorySupport.getPosts(query);
List<PostDto> postDtoList = new ArrayList<>();
postList.forEach((post -> {
List<PostFile> postFileList = postFileRepository.findAllByPost(post);
List<PostFileDto> postFileDtoList = new ArrayList<>();
// PostFileDto로 변환
postFileList.forEach((postFile) -> {
postFileDtoList.add(PostFileDto.toDto(postFile));
});
// PostDtoList에 내용 삽입
postDtoList.add(
PostDto.builder()
.postFileList(postFileDtoList)
.postId(post.getId())
.content(post.getContent())
.user(UserDto.toDto(post.getUser()))
.like(postLikeRepository.existsByPostAndUser(post, user))
.countLike(postLikeRepository.countByPost(post))
.countChat(postChatRepository.countByPost(post))
.build());
}));
return PostResponseDto.builder().postList(postDtoList).build();
}
'Web > 인스타 클론 코딩' 카테고리의 다른 글
[인스타그램 클론코딩] 14. 마무리하며... (0) | 2023.02.16 |
---|---|
[인스타그램 클론코딩] 13. 게시글 검색 기능 구현(Front-End) (0) | 2023.02.16 |
[인스타그램 클론코딩] 12. 메신저 기능 구현(Front-End) (0) | 2023.02.16 |
[인스타그램 클론코딩] 12. 메신저 기능 구현(Back-End) (0) | 2023.02.16 |
[인스타그램 클론코딩] 11. 프로필 수정 기능 구현(Front-End) (0) | 2023.02.07 |