항해99 7기/WIL(Weekly I Learned
항해99 10주차 WIL[무한스크롤]
고을마을
2022. 7. 17. 23:18
//전체조회
public Map<String, Object> allPost(User user, long page) {
PageRequest pageRequest = PageRequest.of((int) page,24);
//BookmarkStatus를 true || false를 담아주기 위해 for문을 두번 돌리기 때문에
//모든 게시글을 다 찾아와서 for문을 돌렸을 때 서버 부하가 어느정도 올지 모르겠음(만약 게시글이 많을 경우)
//게시글이 많을 경우 이중 for문때문에 부하가 상당할 것으로 예상이 되므로 메인페이지에서 최신 게시글 Top20정도만
//보여주는 것도 하나의 방법이 될 것 같음.
//내림차순으로 Top 20만 내림차순으로
//List<Post> posts = postRepository.findTop20ByOrderByModifiedAtDesc();
//모든 게시글 내림차순으로(startAt으로 변경 필요)
Slice<Post> posts = postRepository.findAllByOrderByCreatedAtDesc(pageRequest);
//BookMarkStatus를 추가적으로 담아줄 ArrayList 생성
ArrayList<PostResponseDto> postList = new ArrayList<>();
//true || false 값을 담아줄 Boolean type의 bookMarkStatus 변수를 하나 생성
Boolean bookMarkStatus = false;
//로그인한 유저가 아닐때는 모든게시글을 불러와주고 bookMarkStatus는 모두 false로 리턴
if(user == null){
for(Post post:posts){
Long postId = post.getId();
User writer = post.getUser();
//Stacks(기술스택) 가져오기
List<PostStack> postStacks = postStackRepository.findByPostId(postId);
List<String> stringPostStacks = new ArrayList<>();
for(PostStack postStack : postStacks){
stringPostStacks.add(postStack.getStack());
}
//PostResponseDto를 이용해 게시글과, 북마크 상태,writer 는 해당 게시글 유저의 프로필 이미지를 불러오기 위함
PostResponseDto mainDTO = new PostResponseDto(post, stringPostStacks, bookMarkStatus, writer);
//아까 생성한 ArrayList에 새로운 모양의 값을 담아줌
postList.add(mainDTO);
}
}else {
//유저가 북마크한 것을 리스트로 모두 불러옴
List<BookMark> userPosts = bookMarkRepository.findAllByUser(user);
//유저가 북마크한 게시글을 찾아 리스트에 담아주기 위해 ArrayList 생성
ArrayList<Post> userPostings = new ArrayList<>();
for (BookMark userPost : userPosts) {
Post userPosting = userPost.getPost();
userPostings.add(userPosting);
}
//일치하면 bookMarkStatus = true 아니면 false를 bookMarkStatus에 담아줌
for (Post post : posts) {
Long postId = post.getId();
User writer = post.getUser();
for (Post userPost : userPostings) {
Long userPostId = userPost.getId();
//객체대 객체일경우 if문으로 동일 비교 불가?
//객체를 불러올경우 메모리에 할당되는 주소값으로 불려지기 때문에 비교시 다를 수 밖에 없음
//객체 안의 특정 타입 id, nickname 등으로 비교하여 문제 해결
// 객체 안에있는 특정 데이터 타입으로 비교해줘야 함
if (postId.equals(userPostId))
{
bookMarkStatus = true;
break; //true일 경우 탈출
} else {
bookMarkStatus = false;
}
}
List<PostStack> postStacks = postStackRepository.findByPostId(postId);
List<String> stringPostStacks = new ArrayList<>();
for(PostStack postStack : postStacks){
stringPostStacks.add(postStack.getStack());
}
//PostResponseDto를 이용해 게시글과, 북마크 상태,writer 는 해당 게시글 유저의 프로필 이미지를 불러오기 위함
PostResponseDto mainDto = new PostResponseDto(post, stringPostStacks, bookMarkStatus, writer);
//아까 생성한 ArrayList에 새로운 모양의 값을 담아줌
postList.add(mainDto);
}
}
Map<String, Object> data = new HashMap<>();
data.put("postList", postList);
data.put("isLast", posts.isLast());
return data;
}
Slice<Post> findAllByOrderByCreatedAtDesc(PageRequest pageRequest);