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로 따로 만들어 입력하면 받을 수 있게 해준다.