From b86616810d1d92dc2aa29e67884835ecb456ec3e Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 12 Feb 2025 16:29:26 +0900 Subject: [PATCH] fix : bug fix --- .../dto/content/ContentResponseDto.java | 11 ++- .../prdoit/dto/content/ContentTitleDto.java | 18 +++++ .../prdoit/dto/content/TotalContentDto.java | 2 +- .../example/prdoit/model/ContentTable.java | 1 + .../repository/ContentTableRepository.java | 55 +++++++++----- .../service/content/ContentService.java | 6 +- .../service/content/ContentServiceImpl.java | 74 +++++++++++++------ 7 files changed, 119 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/example/prdoit/dto/content/ContentTitleDto.java diff --git a/src/main/java/com/example/prdoit/dto/content/ContentResponseDto.java b/src/main/java/com/example/prdoit/dto/content/ContentResponseDto.java index 7c41a15..8ad5230 100644 --- a/src/main/java/com/example/prdoit/dto/content/ContentResponseDto.java +++ b/src/main/java/com/example/prdoit/dto/content/ContentResponseDto.java @@ -2,6 +2,8 @@ import lombok.*; +import java.util.List; + @Getter @Setter @AllArgsConstructor @@ -9,10 +11,7 @@ @Builder public class ContentResponseDto { - private String contentId; - private String contentTitle; - private int contentView; - private int contentLike; - private int contentLevel; - private String writer; + private int total; + private List contentList; + } diff --git a/src/main/java/com/example/prdoit/dto/content/ContentTitleDto.java b/src/main/java/com/example/prdoit/dto/content/ContentTitleDto.java new file mode 100644 index 0000000..890fc92 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/content/ContentTitleDto.java @@ -0,0 +1,18 @@ +package com.example.prdoit.dto.content; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ContentTitleDto { + + private String contentId; + private String contentTitle; + private int contentView; + private int contentLike; + private int contentLevel; + private String writer; +} diff --git a/src/main/java/com/example/prdoit/dto/content/TotalContentDto.java b/src/main/java/com/example/prdoit/dto/content/TotalContentDto.java index 178e8b5..b535ff0 100644 --- a/src/main/java/com/example/prdoit/dto/content/TotalContentDto.java +++ b/src/main/java/com/example/prdoit/dto/content/TotalContentDto.java @@ -16,6 +16,6 @@ public class TotalContentDto { private int totalView; private int totalLike; - private List ContentList; + private List ContentList; } diff --git a/src/main/java/com/example/prdoit/model/ContentTable.java b/src/main/java/com/example/prdoit/model/ContentTable.java index be275a2..3b8b4ed 100644 --- a/src/main/java/com/example/prdoit/model/ContentTable.java +++ b/src/main/java/com/example/prdoit/model/ContentTable.java @@ -30,6 +30,7 @@ public class ContentTable { @ManyToOne @JoinColumn(name = "userId") + @JsonIgnore private IdTable userId; @OneToMany(mappedBy = "contentId", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) diff --git a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java index ae81550..bb4c090 100644 --- a/src/main/java/com/example/prdoit/repository/ContentTableRepository.java +++ b/src/main/java/com/example/prdoit/repository/ContentTableRepository.java @@ -1,67 +1,88 @@ package com.example.prdoit.repository; -import com.example.prdoit.dto.content.ContentResponseDto; +import com.example.prdoit.dto.content.ContentTitleDto; import com.example.prdoit.model.ContentTable; +import com.example.prdoit.model.IdTable; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import javax.swing.text.AbstractDocument; import java.util.List; public interface ContentTableRepository extends JpaRepository { - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c LEFT JOIN CommentTable cc ON c.contentId = cc.contentId.contentId " + "WHERE c.contentTitle LIKE %:query% GROUP BY c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel " + "ORDER BY (c.contentView * 0.33) + (c.contentLike * 0.33) + (COUNT(cc.commentId) * 0.33) DESC " + "LIMIT :size OFFSET :offset") - List findAllByQueryContaining(@Param("query") String query, @Param("size") int size, @Param("offset") int offset); + List findAllByQueryContaining(@Param("query") String query, @Param("size") int size, @Param("offset") int offset); - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT c FROM ContentTable c WHERE c.contentTitle LIKE %:query% OR c.contentContent LIKE %:query%") + List findAllByContentTitleContaining(String query); + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c LEFT JOIN CommentTable cc ON c.contentId = cc.contentId.contentId " + "GROUP BY c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel " + "ORDER BY (c.contentView * 0.33) + (c.contentLike * 0.33) + (COUNT(cc.commentId) * 0.33) DESC " + "LIMIT :size OFFSET :offset") - List findAllList(@Param("size") int size, @Param("offset") int offset); + List findAllList(@Param("size") int size, @Param("offset") int offset); + - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c LEFT JOIN CommentTable cc on c.contentId = cc.contentId.contentId WHERE c.contentTitle LIKE %:query% AND c.contentLevel = :level " + "GROUP BY c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel " + "ORDER BY (c.contentView * 0.33) + (c.contentLike * 0.33) + (COUNT(cc.commentId) * 0.33) DESC " + "LIMIT :size OFFSET :offset") - List findAllQueryContainingAndContentLevel(@Param("query")String query, @Param("level")int level, @Param("size") int size, @Param("offset") int offset); + List findAllQueryContainingAndContentLevel(@Param("query")String query, @Param("level")int level, @Param("size") int size, @Param("offset") int offset); - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT c FROM ContentTable c WHERE (c.contentTitle LIKE %:query% OR c.contentContent LIKE %:query%) AND c.contentLevel = :level") + List findAllByQueryContainingAndContentLevel(String query, int level); + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c LEFT JOIN CommentTable cc ON c.contentId = cc.contentId.contentId WHERE c.contentLevel = :level " + "GROUP BY c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel " + "ORDER BY (c.contentView * 0.33) + (c.contentLike * 0.33) + (COUNT(cc.commentId) * 0.33) DESC " + "LIMIT :size OFFSET :offset") - List findAllByContentLevel(@Param("level") int level, @Param("size") int size, @Param("offset") int offset); + List findAllByContentLevel(@Param("level") int level, @Param("size") int size, @Param("offset") int offset); + + List findAllByContentLevel(int level); - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c WHERE c.userId.id = :userId") - Page findAllByUserIdPagination(@Param("userId") String userId, Pageable pageable); + Page findAllByUserIdPagination(@Param("userId") String userId, Pageable pageable); - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + List findAllByUserId(IdTable userId); + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c WHERE c.userId.id = :userId AND c.contentLevel = :level") - Page findAllByUserIdAndContentLevel(String userId, int level, Pageable pageable); + Page findAllByUserIdAndContentLevel(String userId, int level, Pageable pageable); + + List findAllByUserIdAndContentLevel(IdTable userId, int level); - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c WHERE c.userId.id = :userId AND c.contentTitle LIKE %:query%") - Page findAllByUserIdAndQueryContaining(String userId, String query, Pageable pageable); + Page findAllByUserIdAndQueryContaining(String userId, String query, Pageable pageable); - @Query("SELECT new com.example.prdoit.dto.content.ContentResponseDto" + + @Query("SELECT c FROM ContentTable c WHERE c.userId = :userId AND (c.contentTitle LIKE %:query% or c.contentContent LIKE %:query%)") + List findAllByUserIdAndQueryContaining(IdTable userId, String query); + + @Query("SELECT new com.example.prdoit.dto.content.ContentTitleDto" + "(c.contentId, c.contentTitle, c.contentView, c.contentLike, c.contentLevel, c.userId.nickname) " + "FROM ContentTable c WHERE c.userId.id = :userId AND c.contentLevel = :level AND c.contentTitle LIKE %:query%") - Page findAllByUserIdAndContentLevelAndQueryContaining(String userId, int level, String query, Pageable pageable); + Page findAllByUserIdAndContentLevelAndQueryContaining(String userId, int level, String query, Pageable pageable); + + @Query("SELECT c FROM ContentTable c WHERE c.userId = :userId AND c.contentLevel = :level AND (c.contentTitle LIKE %:query% or c.contentContent LIKE %:query%)") + List findAllByUserIdAndContentLevelAndQueryContaining(IdTable userId, int level, String query); } diff --git a/src/main/java/com/example/prdoit/service/content/ContentService.java b/src/main/java/com/example/prdoit/service/content/ContentService.java index 474d296..02b60cc 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentService.java +++ b/src/main/java/com/example/prdoit/service/content/ContentService.java @@ -6,11 +6,11 @@ // public interface ContentService { - List getContentQuery(String query, int size, int page); + ContentResponseDto getContentQuery(String query, int size, int page); - List getContentQueryWithLevel(String query, int level, int size, int page); + ContentResponseDto getContentQueryWithLevel(String query, int level, int size, int page); - List getContentWithUserId(String userId, String query, int level, int size, int page); + ContentResponseDto getContentWithUserId(String userId, String query, int level, int size, int page); void updateContent(ContentUpdateDto contentUpdateDto); diff --git a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java index 3599916..409455f 100644 --- a/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/content/ContentServiceImpl.java @@ -12,6 +12,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import javax.swing.text.AbstractDocument; import java.util.List; import java.util.UUID; @@ -24,7 +25,7 @@ public class ContentServiceImpl implements ContentService { private final IdTableRepository IdTableRepository; @Override - public List getContentQuery(String query, int size, int page){ + public ContentResponseDto getContentQuery(String query, int size, int page){ log.info("[getContentQuery] 쿼리 조회 로직 시작"); List contentTableList = contentRepository.findAll(); int offset = (page - 1) * size; @@ -33,18 +34,25 @@ public List getContentQuery(String query, int size, int page } try { if(!query.equals("all")){ - List contentResponseDtoList = contentRepository.findAllByQueryContaining(query, size, offset); - if (contentResponseDtoList.isEmpty()) { + List contentTableListQuery = contentRepository.findAllByContentTitleContaining(query); + List contentTitleDtoList = contentRepository.findAllByQueryContaining(query, size, offset); + if (contentTitleDtoList.isEmpty()) { throw new RuntimeException("검색 결과가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableListQuery.size()) + .contentList(contentTitleDtoList) + .build(); } } else{ - List contentResponseDtoList = contentRepository.findAllList(size, offset); + List contentResponseDtoList = contentRepository.findAllList(size, offset); if (contentResponseDtoList.isEmpty()) { throw new RuntimeException("등록된 컨텐츠가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableList.size()) + .contentList(contentResponseDtoList) + .build(); } } } catch (Exception e) { @@ -54,7 +62,7 @@ public List getContentQuery(String query, int size, int page } @Override - public List getContentQueryWithLevel(String query, int level, int size, int page){ + public ContentResponseDto getContentQueryWithLevel(String query, int level, int size, int page){ List contentTableList = contentRepository.findAll(); if(contentTableList.isEmpty()) { throw new RuntimeException("등록된 컨텐츠가 없습니다."); @@ -62,18 +70,26 @@ public List getContentQueryWithLevel(String query, int level int offset = (page - 1) * size; try{ if(!query.equals("all")){ - List contentResponseDtoList = contentRepository.findAllQueryContainingAndContentLevel(query, level, size, offset); + List contentTableListAll = contentRepository.findAllByQueryContainingAndContentLevel(query, level); + List contentResponseDtoList = contentRepository.findAllQueryContainingAndContentLevel(query, level, size, offset); if(contentResponseDtoList.isEmpty()){ throw new RuntimeException("검색 결과가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableListAll.size()) + .contentList(contentResponseDtoList) + .build(); } } else { - List contentResponseDtoList = contentRepository.findAllByContentLevel(level, size, offset); + List contentTableListAll = contentRepository.findAllByContentLevel(level); + List contentResponseDtoList = contentRepository.findAllByContentLevel(level, size, offset); if(contentResponseDtoList.isEmpty()){ throw new RuntimeException("등록된 컨텐츠가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableListAll.size()) + .contentList(contentResponseDtoList) + .build(); } } } catch (Exception e) { @@ -83,7 +99,7 @@ public List getContentQueryWithLevel(String query, int level } @Override - public List getContentWithUserId(String userId, String query, int level, int size, int page){ + public ContentResponseDto getContentWithUserId(String userId, String query, int level, int size, int page){ IdTable idTable = IdTableRepository.findById(userId).orElseThrow (() -> new RuntimeException("존재하지 않는 사용자입니다.")); if(idTable.getContentTable().isEmpty()) { @@ -92,32 +108,48 @@ public List getContentWithUserId(String userId, String query int offset = (page - 1) * size; try{ if(query.equals("all") && level == -1){ - List contentResponseDtoList = contentRepository.findAllByUserIdPagination(userId, PageRequest.of(page-1, size)).stream().toList(); + List contentTableList = contentRepository.findAllByUserId(idTable); + List contentResponseDtoList = contentRepository.findAllByUserIdPagination(userId, PageRequest.of(page-1, size)).stream().toList(); if(contentResponseDtoList.isEmpty()){ throw new CustomException("검색 결과가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableList.size()) + .contentList(contentResponseDtoList) + .build(); } } else if(!query.equals("all") && level == -1){ - List contentResponseDtoList = contentRepository.findAllByUserIdAndQueryContaining(userId, query, PageRequest.of(page-1, size)).stream().toList(); + List contentTableList = contentRepository.findAllByUserIdAndQueryContaining(idTable, query); + List contentResponseDtoList = contentRepository.findAllByUserIdAndQueryContaining(userId, query, PageRequest.of(page-1, size)).stream().toList(); if(contentResponseDtoList.isEmpty()){ throw new CustomException("검색 결과가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableList.size()) + .contentList(contentResponseDtoList) + .build(); } } else if(query.equals("all")){ - List contentResponseDtoList = contentRepository.findAllByUserIdAndContentLevel(userId, level, PageRequest.of(page-1, size)).stream().toList(); + List contentTableList = contentRepository.findAllByUserIdAndContentLevel(idTable, level); + List contentResponseDtoList = contentRepository.findAllByUserIdAndContentLevel(userId, level, PageRequest.of(page-1, size)).stream().toList(); if(contentResponseDtoList.isEmpty()){ throw new CustomException("검색 결과가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableList.size()) + .contentList(contentResponseDtoList) + .build(); } } else { - List contentResponseDtoList = contentRepository.findAllByUserIdAndContentLevelAndQueryContaining(userId, level, query, PageRequest.of(page-1, size)).stream().toList(); + List contentTableList = contentRepository.findAllByUserIdAndContentLevelAndQueryContaining(idTable, level, query); + List contentResponseDtoList = contentRepository.findAllByUserIdAndContentLevelAndQueryContaining(userId, level, query, PageRequest.of(page-1, size)).stream().toList(); if(contentResponseDtoList.isEmpty()){ throw new CustomException("검색 결과가 없습니다."); } else { - return contentResponseDtoList; + return ContentResponseDto.builder() + .total(contentTableList.size()) + .contentList(contentResponseDtoList) + .build(); } } } catch (CustomException e) { @@ -203,7 +235,7 @@ public TotalContentDto getTotalContent(String userId, int size, int page){ int totalContent = idTable.getContentTable().size(); int totalView = idTable.getContentTable().stream().mapToInt(ContentTable::getContentView).sum(); int totalLike = idTable.getContentTable().stream().mapToInt(ContentTable::getContentLike).sum(); - List contentResponseDtoList = contentRepository.findAllByUserIdPagination(userId, pageable).stream().toList(); + List contentResponseDtoList = contentRepository.findAllByUserIdPagination(userId, pageable).stream().toList(); return TotalContentDto.builder() .totalContent(totalContent) .totalView(totalView)