From 9c1c8621a033bf7365aa77ffd2bc72995eacf399 Mon Sep 17 00:00:00 2001 From: nevermoregb Date: Tue, 25 Mar 2025 11:58:47 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EB=B3=B8=EB=AC=B8=EC=97=90=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=EC=9D=98=20=EC=A2=8B=EC=95=84=EC=9A=94=20=EC=8B=AB?= =?UTF-8?q?=EC=96=B4=EC=9A=94=EA=B0=80=20=EB=B0=98=EC=98=81=20=EC=95=88?= =?UTF-8?q?=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/mapper/localbordMapper.xml | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index 1b27db0..93e9710 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -226,18 +226,34 @@ UPDATE localgorb SET LOCGOBGOD = #{LOCGOBGOD}, LOCGOBBAD = #{LOCGOBBAD} - WHERE (LOCBRDSEQ = #{LOCBRDSEQ} OR (#{LOCBRDSEQ} IS NULL AND LOCBRDSEQ IS NULL)) - AND (LOCCMTSEQ = #{LOCCMTSEQ} OR (#{LOCCMTSEQ} IS NULL AND LOCCMTSEQ IS NULL)) - AND MEMBERSEQ = #{MEMBERSEQ} + WHERE + + + LOCBRDSEQ = #{LOCBRDSEQ} AND LOCCMTSEQ IS NULL + + + LOCBRDSEQ = #{LOCBRDSEQ} AND LOCCMTSEQ = #{LOCCMTSEQ} + + + AND + MEMBERSEQ = #{MEMBERSEQ} @@ -368,7 +384,7 @@ COALESCE(SUM(CASE WHEN LOCGOBGOD = 'T' THEN 1 ELSE 0 END), 0) AS likeCount, COALESCE(SUM(CASE WHEN LOCGOBBAD = 'T' THEN 1 ELSE 0 END), 0) AS dislikeCount FROM localgorb - WHERE LOCBRDSEQ = #{boardId}; + WHERE LOCBRDSEQ = #{boardId} AND LOCCMTSEQ IS NULL; From dba1edb701bc0c7352b5e32b91207c72a0887201 Mon Sep 17 00:00:00 2001 From: khj0414 Date: Tue, 25 Mar 2025 14:55:26 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=ED=88=AC=ED=91=9C=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/localhost/controller/api/VoteBoardController.java | 2 +- src/main/resources/mapper/localvoteMapper.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/company/localhost/controller/api/VoteBoardController.java b/src/main/java/io/company/localhost/controller/api/VoteBoardController.java index 1b116fd..87e9e9a 100644 --- a/src/main/java/io/company/localhost/controller/api/VoteBoardController.java +++ b/src/main/java/io/company/localhost/controller/api/VoteBoardController.java @@ -30,7 +30,7 @@ public class VoteBoardController { /** * 투표목록조회 - * @param page 페이지번호 , 내가한투표 :0 투표안한것 :1 , 전체:0,투표마감:1,투표중:2 + * @param page 페이지번호 , myVote 내가한투표 :1 투표안한것 :0 , 전체:0,투표마감:1,투표중:2 * @return */ @Member diff --git a/src/main/resources/mapper/localvoteMapper.xml b/src/main/resources/mapper/localvoteMapper.xml index 6a50515..9b5d3ce 100644 --- a/src/main/resources/mapper/localvoteMapper.xml +++ b/src/main/resources/mapper/localvoteMapper.xml @@ -76,6 +76,7 @@ AND myvoted = 'Y' + AND LOCVOTDEL IS NULL From 4241859180ded4d3cae1f874578f625213a5842f Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Tue, 25 Mar 2025 14:59:27 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EB=8C=93=EA=B8=80=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localhost/service/localbordService.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index f834c7f..0eccd8a 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -247,21 +247,21 @@ public class localbordService { // 대댓글이 없는 경우, 완전 삭제 boardMapper.deleteComment(commentId); } - checkAndDeleteParentComment(map); +// checkAndDeleteParentComment(map); } - private void checkAndDeleteParentComment(MapDto map) { - Long parentId = (Long) map.get("LOCCMTPNT"); - if (parentId == null) return; // 부모가 없으면 종료 - - // 부모 댓글의 남아있는 대댓글 개수 확인 - int remainingReplies = boardMapper.selectReplyCount(parentId); - - if (remainingReplies == 0) { - // 남은 대댓글이 없으면 부모 댓글도 삭제 - boardMapper.deleteComment(parentId); - } - } +// private void checkAndDeleteParentComment(MapDto map) { +// Long parentId = (Long) map.get("LOCCMTPNT"); +// if (parentId == null) return; // 부모가 없으면 종료 +// +// // 부모 댓글의 남아있는 대댓글 개수 확인 +// int remainingReplies = boardMapper.selectReplyCount(parentId); +// +// if (remainingReplies == 0) { +// // 남은 대댓글이 없으면 부모 댓글도 삭제 +// boardMapper.deleteComment(parentId); +// } +// } public String selectCommentPassword(int commentId) { return boardMapper.selectCommentPassword(commentId); From b0f77138cd2593107f8034f563353c027c5a9585 Mon Sep 17 00:00:00 2001 From: dyhj625 Date: Tue, 25 Mar 2025 15:38:43 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EA=B2=8C=EC=8B=9C=ED=8C=90=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localhost/service/localbordService.java | 88 ++++++++++++++++--- src/main/resources/mapper/localbordMapper.xml | 14 --- 2 files changed, 78 insertions(+), 24 deletions(-) diff --git a/src/main/java/io/company/localhost/service/localbordService.java b/src/main/java/io/company/localhost/service/localbordService.java index 0eccd8a..8c595cd 100644 --- a/src/main/java/io/company/localhost/service/localbordService.java +++ b/src/main/java/io/company/localhost/service/localbordService.java @@ -55,13 +55,17 @@ public class localbordService { private final PasswordEncoder passwordEncoder; public List selectNotices(MapDto map) { + String keyword = map.getString("searchKeyword"); + map.put("searchKeyword", null); + List posts = boardMapper.selectNotices(map); enrichPostsWithAdditionalData(posts); - return posts; + + return filterPostsByKeyword(posts, keyword); } + public PageInfo selectGeneralPosts(MapDto map) { - System.out.println(map); int page = map.getString("page") != null ? Integer.parseInt(map.getString("page")) : 1; int size = map.getString("size") != null ? Integer.parseInt(map.getString("size")) : 10; @@ -70,12 +74,27 @@ public class localbordService { map.put("orderBy", "date"); } - PageHelper.startPage(page, size); + String keyword = map.getString("searchKeyword"); + map.put("searchKeyword", null); // MyBatis에 전달하지 않음 + // 넉넉히 많이 가져온 후 Java에서 필터링 + PageHelper.startPage(1, 1000); // 최대 1000개까지만 조회 List result = boardMapper.selectGeneralPosts(map); + enrichPostsWithAdditionalData(result); - return PageUtil.redefineNavigation(new PageInfo<>(result, size)); + // 키워드 필터링 적용 + List filtered = filterPostsByKeyword(result, keyword); + + // 원하는 페이지만 잘라서 리턴 + int fromIndex = (page - 1) * size; + int toIndex = Math.min(fromIndex + size, filtered.size()); + List pageList = fromIndex >= filtered.size() ? new ArrayList<>() : filtered.subList(fromIndex, toIndex); + + PageInfo pageInfo = new PageInfo<>(pageList); + pageInfo.setTotal(filtered.size()); + + return PageUtil.redefineNavigation(pageInfo); } public void updateIncrementViewCount(Long boardId) { @@ -314,17 +333,66 @@ public class localbordService { return null; // 이미지가 없는 경우 } - private boolean procIsValidJson(String json) { + public String extractPlainText(String deltaJson) { + StringBuilder sb = new StringBuilder(); + ObjectMapper mapper = new ObjectMapper(); + try { - final ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.readTree(json); // JSON 파싱 시도 - return true; // JSON이 유효하면 true 반환 + JsonNode root = mapper.readTree(deltaJson); + JsonNode ops = root.get("ops"); + + if (ops != null && ops.isArray()) { + for (JsonNode op : ops) { + JsonNode insertNode = op.get("insert"); + + // insert가 문자열일 경우만 추출 + if (insertNode != null && insertNode.isTextual()) { + String text = insertNode.asText(); + if (!"\n".equals(text.trim())) { // 줄바꿈 제외 + sb.append(text).append(" "); + } + } + // insert가 객체면 image일 가능성 → 제외 + } + } + } catch (Exception e) { - return false; // 유효하지 않은 경우 false 반환 + e.printStackTrace(); // 실제 운영에서는 로깅 처리 } + + return sb.toString().trim(); + } + + /** + * 검색어로 순수 텍스트 기준 게시글 필터링 + */ + private List filterPostsByKeyword(List posts, String keyword) { + if (keyword == null || keyword.trim().isEmpty()) return posts; + + keyword = keyword.trim(); + + List filtered = new ArrayList<>(); + + for (MapDto post : posts) { + String title = post.getString("title"); + String author = post.getString("author"); + String contentJson = BlobUtil.procBlobToString(post.get("content")); // Blob 처리 + String plainText = extractPlainText(contentJson); + + // 포함 여부 판단 (title, author, content 순수 텍스트) + if ((title != null && title.contains(keyword)) || + (author != null && author.contains(keyword)) || + plainText.contains(keyword)) { + + post.put("content", contentJson); // content는 원래대로 복원 + filtered.add(post); + } + } + + return filtered; } - + private void enrichBoardDetail(MapDto boardDetail) { if(boardDetail == null) return; diff --git a/src/main/resources/mapper/localbordMapper.xml b/src/main/resources/mapper/localbordMapper.xml index 93e9710..6f0d15e 100644 --- a/src/main/resources/mapper/localbordMapper.xml +++ b/src/main/resources/mapper/localbordMapper.xml @@ -14,13 +14,6 @@ FROM localbord b LEFT JOIN netmember m ON b.MEMBERSEQ = m.MEMBERSEQ WHERE LOCBRDTYP = '300103' - - AND ( - LOCBRDTTL LIKE CONCAT('%', #{searchKeyword}, '%') - OR LOCBRDCON LIKE CONCAT('%', #{searchKeyword}, '%') - OR MEMBERNAM LIKE CONCAT('%', #{searchKeyword}, '%') - ) - ORDER BY LOCBRDUDT DESC @@ -37,13 +30,6 @@ FROM localbord b LEFT JOIN netmember m ON b.MEMBERSEQ = m.MEMBERSEQ WHERE b.LOCBRDTYP IN ('300101', '300102') - - AND ( - LOCBRDTTL LIKE CONCAT('%', #{searchKeyword}, '%') - OR LOCBRDCON LIKE CONCAT('%', #{searchKeyword}, '%') - OR MEMBERNAM LIKE CONCAT('%', #{searchKeyword}, '%') - ) - ORDER BY b.LOCBRDUDT DESC