카테고리 없음

TIL 2024-11-22 (todo-log 4일차)

myoma 2024. 11. 22. 22:38

1 ) 프로젝트 진행정도

  • 피드(feed) CRUD
    • 피드 생성
    • 피드 조회
      • 단건 조회
      • 전체 조회
    • 피드 수정
    • 피드 삭제 (2일차 완료)
  • 친구 관리 기능
    • 팔로우 기능
    • 팔로워 목록 조회
    • 팔로잉 목록 조회
    • 언팔로우
    • 팔로잉의 게시글 조회
      • 생성순
  • 업그레이드 뉴스피드 기능
    • 전체 피드 수정순으로 조회 (3일차 완료)
    • 좋아요 순으로 조회
    • 날짜별 기간 검색 기능 (4일차 완료)

 

 

  • 추가적으로 feed에 좋아요 수, 카테고리 표시 추가.

  • 피드에 각각 좋아요 수와 카테고리 표시 구현
 int countByFeed_IdAndLikeStatus(Long feedId, Boolean likeStatus);
  • LikeRepository에 있는 메서드 사용.
  • 위 메서드는 피드 아이디를 확인하여 그 피드의 좋아요 수를 int로 반환해준다.

 

// 피드 전체 조회
    public List<FeedResponseDto> findAll() {
        List<Feed> feeds = feedRepository.findAll(Sort.by(Sort.Direction.DESC, "updatedAt"));

        // Feed -> FeedResponseDto 변환
        List<FeedResponseDto> responseDtos = new ArrayList<>();
        for (Feed feed : feeds) {
            // Feed 데이터를 DTO로 변환
            FeedResponseDto dto = new FeedResponseDto(
                    feed.getId(),
                    feed.getCategory().getName(),
                    feed.getUser().getNickname(),
                    feed.getTitle(),
                    feed.getDetail(),
                    feed.getCreatedAt(),
                    feed.getUpdatedAt()
            );
            // 좋아요 수 조회
            int likeCount = likeRepository.countByFeed_IdAndLikeStatus(feed.getId(), true);
            dto.setLikeCount(likeCount); // 좋아요 수 설정

            responseDtos.add(dto);
        }
        return responseDtos;
    }
  • LikeEntity에 좋아요 수가 저장되는 것이 아니라 LikeEntity와 FeedEntity 따로 연결할 필요가 없다.
  • LikeEntity에 좋아요 수가 저장되는 필드가 있다면 연관관계로 이어서 그저 데이터를 가져와서 getLike().getLikeCount 이런 식으로 가져와 사용하면된다.
  • 위에 같은 방법은 likerepository에 있는 JPA 를 이용해서 특정 Feed의 Count를 하여 int로 반환.
  • 그것을 int  likeCount에 저장한다.
  • 이때 Feed 데이터를 Dto로 변환하여 그 Dto에 setLikeCount는 미리 FeedResponseDto에 int likecount를 만들어 @Setter를 해준다.
  • 그러면 메서드 밖에서도 데이터를 가지고 들어갈 수 있다.
  • 이러면 기존에 작성했던 FeedResponseDto를 크게 변화시키지 않고 좋아요 수를 넣어줄 수 있다.
  • 카테고리는 위에서 미리 설명했던 필드에 있기에 연관관계로 이어서 데이터를 가져와 사용.

 

 

  • 페이징에서 좋아요 순으로 조회 기능
// 페이징 조회 좋아요 순
    public List<FeedResponseDto> findFeedByLikeCountPage(Pageable pageable) {

        List<FeedResponseDto> feedResponseDtoList = new ArrayList<>();
        Page<Feed> feedPage = feedRepository.findAll(pageable);
        List<Feed> feedList = feedPage.getContent();
        // Feed에서 User 객체를 제외하고 나머지 필드들만 불러와서 반환.

        for (Feed feed : feedList) {
            //FeedResponseDto에 Feed 필드를 넣는다.
            FeedResponseDto feedResponseDto = new FeedResponseDto(
                    feed.getId(),
                    feed.getCategory().getName(),
                    feed.getUser().getNickname(),
                    feed.getTitle(),
                    feed.getDetail(),
                    feed.getCreatedAt(),
                    feed.getUpdatedAt()
            );

            // 좋아요 수 조회
            int likeCount = likeRepository.countByFeed_IdAndLikeStatus(feed.getId(), true);
            feedResponseDto.setLikeCount(likeCount);

            feedResponseDtoList.add(feedResponseDto);
        }

        // 좋아요 수 기준으로 정렬 (내림차순)
        feedResponseDtoList.sort((a, b) -> Integer.compare(b.getLikeCount(), a.getLikeCount()));

        return feedResponseDtoList;
    }
  • 전에 썼던 수정일자순 코드도 위 코드와 비슷하게 수정하였다.
  • 이유는 좋아요 수를 넣기 위해서 였고 stream() 사용의 미숙이다 쓸 순 있지만 내가 이해하고 있는 부분이 많지 않아 모르고 사용하는 것보단 아는 것들을 사용하는 것이 더욱 공부에 좋다고 판단.
  • 여기서 내림차순하는데 문제가 생긴다.
  • 기존에 날짜는 Feed Entity에 updatedAt 이라는 수정일 필드가 있기에 그것을 @PageableDefault을 이용해서 size, sort, diretion을 정해줘서 수정일로 내림차순 할 수 있었다.
  • 하지만 좋아요 순은 필드에 있는 정보가 아니기에 sort를 사용할 수 없었다.
  • 그래서 찾은 해결법은 list에 있는 인터페이스 sort를 사용 a, b의 좋아요 수를 가져와 서로 비교하여 정렬하는 것.
  • pageable을 사용해서 어쩔 수 없이 size 만 사용해서 코드 실행.

 

  • 기간별 검색 기능
// 기간별 검색 기능
    public List<FeedResponseDto> findFeedsByDateRange(LocalDate startDate, LocalDate endDate) {

        // LocalDate -> LocalDateTime 으로 변환
        LocalDateTime startDateTime = startDate.atStartOfDay(); // 뒤 시간을 00:00:00 으로 설정
        LocalDateTime endDateTime = endDate.atTime(23,59,59); //뒤 시간을 23:59:59 로 설정

        List<Feed> feeds = feedRepository.findAllByUpdatedAtBetween(startDateTime, endDateTime);

        List<FeedResponseDto> responseDtos = new ArrayList<>();

        for(Feed feed : feeds) {
            FeedResponseDto dto = new FeedResponseDto(
                    feed.getId(),
                    feed.getCategory().getName(),
                    feed.getUser().getNickname(),
                    feed.getTitle(),
                    feed.getDetail(),
                    feed.getCreatedAt(),
                    feed.getUpdatedAt()
            );

            int likeCount = likeRepository.countByFeed_IdAndLikeStatus(feed.getId(), true);
            dto.setLikeCount(likeCount);

            responseDtos.add(dto);
        }
        return responseDtos;
    }
  • 본인은 페이지네이션을 잘 사용할 줄 몰라 검색 기능을 페이지네이션으로 구현하지 않았다.
  • Jpa를 이용한 findAllUpdatedAtBetween를 사용하여 특정 날짜 범위 내의 피드를 조회한다
  • 여기서 우리가 설정해놓은 날짜는 LocalDateTime 타입이고 사용자가 입력하는 데이터 타입은 LocalDate이기에 타입을 변환.
  • 타입을 변환할 때 LocalDate 에 있는 메서드들을 이용해서 뒤에 시간을 설정해준다.
  • 그러면 사용자는 YYYY-MM-DD 만 입력해도 자동으로 뒤에 시, 분, 초가 설정되어 붙기에 LocalDateTime으로 타입이 반환된다.
  • 이때 Dto도 따로 만들어서 startDate, endDate 를 Request로 따로 만들어 입력하면 받을 수 있게 해준다.