항해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);