본문 바로가기

TIL

TIL) 뉴스피드 프로젝트 CRUD 작성

1. 작업 분배

 작업 분배를 할 때, 뉴스피드의 CRUD와 좋아요 부분을 받게 되었습니다. 지금까지 했던것과 크게 다르지 않았지만 두개의 테이블을 핸들링해야하는 것에 어려움을 느꼈습니다. 우선 뉴스피드의 작업이 완료되야지 댓글의 작업이 끝난다는 것을 알기에 서둘러 들어갔습니다.

 

2. 뉴스피드 CRUD 

2.1 뉴스피드 생성

 뉴스피드 생성은 크게 어려운 부분이 없었습니다. 이전과 비슷한 방향으로 진행을 할 수 있는 과제였습니다. 코드는 아래와 같습니다.

@PostMapping
public ResponseEntity<NewsfeedResponseDto> save(
    @Valid @RequestBody NewsfeedRequestDto newsfeedRequestDto,
    HttpServletRequest request
) {
  HttpSession session = request.getSession(false);
  NewsfeedResponseDto newsfeedResponseDto = newsfeedService.save(newsfeedRequestDto, session);
  return new ResponseEntity<>(newsfeedResponseDto, HttpStatus.CREATED);
}

 

2.2 뉴스피드 수정, 삭제

 뉴스피드의 수정과 삭제 역시 크게 어려운 부분이 없었습니다. 코드는 다음과 같습니다.

@PatchMapping("/{id}")
public ResponseEntity<NewsfeedResponseDto> updateNewsfeed(
    @PathVariable Long id,
    @Valid @RequestBody NewsfeedRequestDto newsfeedRequestDto,
    HttpServletRequest request
){
  HttpSession session = request.getSession(false);
  NewsfeedResponseDto newsfeedResponseDto = newsfeedService.updateNewsfeed(id, newsfeedRequestDto, session);
  return new ResponseEntity<>(newsfeedResponseDto, HttpStatus.OK);
}

@DeleteMapping("/{id}")
public ResponseEntity<String> deleteNewsfeed(
    @PathVariable Long id,
    HttpServletRequest request
){
  HttpSession session = request.getSession(false);
  newsfeedService.delete(id, session);
  return new ResponseEntity<>("Deleted", HttpStatus.OK);
}

 

2.3 뉴스피드 조회

 뉴스피드 조회에는 3가지 조건이 있었습니다.

  1. 갱신 일자를 기준으로 내림차순 정렬을 할 것
  2. pageable을 통한 pageing기능을 넣을 것
  3. 좋아요 수의 내림차순으로 정렬할 것

우선 갱신일자를 기준으로 내림차순 정렬은 pageable의 sort속성을 이용하여 페이징과 정렬을 같이 해결했습니다. 코드는 아래와 같습니다.

@GetMapping
public ResponseEntity<List<NewsfeedResponseDto>> findAll(
    @PageableDefault(size = 10, sort = "updatedAt", direction = Direction.DESC)
    Pageable pageable
){
  List<NewsfeedResponseDto> list = newsfeedService.findAll(pageable);
  return new ResponseEntity<>(list, HttpStatus.OK);
}

 

이때, 좋아요 수의 내림차순으로 정렬하는 것을 controller에서 구현한 것은 아래와 같습니다.

@GetMapping("/likes")
public ResponseEntity<List<NewsfeedResponseDto>> findAllOrderByLikes(
    @PageableDefault(size = 3, sort = "updated_at", direction = Direction.DESC)
    Pageable pageable
){
  List<NewsfeedResponseDto> list = newsfeedService.findAllOrderByLikes(pageable);
  return new ResponseEntity<>(list, HttpStatus.OK);
}

 

이때 위 두 코드는 크게 다른 점이 없습니다. feedService의 findAllOrderByLikes를 확인하면 아래와 같습니다.

@Override
public List<NewsfeedResponseDto> findAllOrderByLikes(Pageable pageable) {
  return newsfeedRepository.findAllOrderByLikes(pageable)
      .stream()
      .map(NewsfeedResponseDto::toDto)
      .toList();
}

 

다시 레포지토리에서의 코드는 아래와 같습니다.

@Query(value = "SELECT n.id, n.feed_image, n.title, n.content, n.member_id, n.created_at, n.updated_at "
    + "FROM newsfeed n "
    + "LEFT JOIN newsfeed_like l "
    + "ON n.id = l.newsfeed_id "
    + "GROUP BY n.id "
    + "ORDER BY COUNT(l.id) DESC", nativeQuery = true)
Page<Newsfeed> findAllOrderByLikes(Pageable pageable);

 

코드를 확인하면 네이티브 쿼리로 조인하여 좋아요의 수를 count해주고 그것을 기준으로 정렬을 해줍니다.

 

3. 내일 해야하는 것

  1.  좋아요 승인, 해제 구현