반응형
어제에 이어서, 할일카드 단건 조회 시 좋아요 수를 함께 조회하는 기능을 구현했었다.
@Getter
@Entity
@Table(name = "todocard") // 테이블명 명시
@NoArgsConstructor(access = AccessLevel.PROTECTED) // JPA 엔티티의 최소 접근제어자로 설정
public class TodoCard extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 500, nullable = false)
private String title;
@Column(length = 5000, nullable = false)
private String content;
@Column
private boolean isDone = false;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User author;
@BatchSize(size = 100)
@OneToMany(mappedBy = "todoCard", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Comment> commentList = new ArrayList<>();
@OneToMany(mappedBy = "todoCard", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Like> likeList = new ArrayList<>();
@Transient
private Long likeCount;
@Transient
private List<CommentResponseDto> commentResponseList = new ArrayList<>();
@Builder
public TodoCard(String title, String content, User author, LocalDateTime createdAt) {
this.title = title;
this.content = content;
this.author = author;
this.isDone = false;
if (createdAt != null) { // 생성일자를 입력하면 그 생성일자로 저장
this.createdAt = createdAt;
}
}
public void setLikeCount(long likeCount) {
this.likeCount = likeCount;
}
public void setCommentResponseList(List<CommentResponseDto> commentResponseList) {
this.commentResponseList = commentResponseList;
}
}
@Transient 어노테이션을 쓰면, 해당 필드는 테이블의 칼럼으로 만들어지지 않는데 이를 이용해서 좋아요 수를 나타내는 likeCount와, 댓글 리스트를 나타내는 commentResponseList 를 세터와 함께 선언해두었다.
// 좋아요 레포지토리,
public interface LikeRepository extends JpaRepository<Like, Long> {
@Query("SELECT COUNT(*) FROM Like l WHERE l.todoCard.id = :todoCardId")
Long countLikeByTodoCard_Id(Long todoCardId);
}
// 댓글 레포지토리
public interface CommentRepository extends JpaRepository<Comment, Long> {
@Query("SELECT C FROM Comment C WHERE C.todoCard.id = :todoCardId")
List<Comment> findAllByTodoCard_Id(Long todoCardId);
}
그리고 좋아요 수를 가져오는 메서드와 댓글 리스트를 가져오는 메서드를 작성 후,
// 할일카드 서비스
/**
* 할일카드 단건 조회
*/
public TodoCardDetailResponseDto getTodoCard(Long todoCardId) {
TodoCard todoCard = todoCardRepository.getTodoCardById(todoCardId);
Long likeCount = likeRepository.countLikeByTodoCard_Id(todoCardId);
List<CommentResponseDto> commentList = commentRepository.findAllByTodoCard_Id(todoCardId)
.stream()
.map(CommentResponseDto::new)
.toList();
todoCard.setLikeCount(likeCount);
todoCard.setCommentResponseList(commentList);
return new TodoCardDetailResponseDto(todoCard);
}
할일카드 엔티티를 가져온 후,
위의 레포지토리에서 가져온 값들을 할일카드의 세터로 넣어주면
@Getter
public class TodoCardDetailResponseDto {
private final Long id;
private final String title;
private final String content;
private final String username;
private final LocalDateTime createdAt;
private final List<CommentResponseDto> comments;
private final long likeCount;
public TodoCardDetailResponseDto(TodoCard todoCard) {
this.id = todoCard.getId();
this.title = todoCard.getTitle();
this.content = todoCard.getContent();
this.username = todoCard.getAuthor().getUsername();
this.createdAt = todoCard.getCreatedAt();
this.comments = todoCard.getCommentResponseList();
this.likeCount = todoCard.getLikeCount();
}
}
이렇게 todoCard 만으로 한번에 필드값을 넣어줄 수 있고, mapStruct를 이용하면 생성자를 만들어줄 필요까지 없어지게 된다.
반응형
'TIL ✍️' 카테고리의 다른 글
23년 12월 27일(수요일) - 60번째 TIL (0) | 2023.12.27 |
---|---|
23년 12월 26일(화요일) - 59번째 TIL (0) | 2023.12.26 |
23년 12월 21일(목요일) - 57번째 TIL (0) | 2023.12.21 |
23년 12월 20일(수요일) - 56번째 TIL : 레포지토리 단에서 예외 발생 (0) | 2023.12.20 |
23년 12월 19일(화요일) - 55번째 TIL : 영속성 전이 및 고아 객체 (0) | 2023.12.19 |