From 373a8c6a5e388ba079853ebc282a9f4b5bc63a8d Mon Sep 17 00:00:00 2001 From: khj0414 Date: Thu, 27 Mar 2025 13:09:50 +0900 Subject: [PATCH] =?UTF-8?q?=ED=88=AC=ED=91=9C=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=ED=95=84=ED=84=B0=EB=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../localhost/service/worddictyService.java | 115 +++++++++++++----- src/main/resources/mapper/worddictyMapper.xml | 4 +- 2 files changed, 85 insertions(+), 34 deletions(-) diff --git a/src/main/java/io/company/localhost/service/worddictyService.java b/src/main/java/io/company/localhost/service/worddictyService.java index ee6e9b2..cdb943c 100644 --- a/src/main/java/io/company/localhost/service/worddictyService.java +++ b/src/main/java/io/company/localhost/service/worddictyService.java @@ -19,7 +19,9 @@ import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import io.company.localhost.common.dto.MapDto; import io.company.localhost.mapper.commoncodMapper; @@ -34,41 +36,90 @@ public class worddictyService { private final worddictyMapper worddictymapper; private final commoncodMapper commoncodmapper; private final FileService fileService; - + public List selectWordList(MapDto map) { - List wordList = worddictymapper.selectWordList(map); - for (MapDto word : wordList) { - Object content = word.get("WRDDICCON"); - // BlobUtil.procBlobToString으로 content 변환 - String contentString = BlobUtil.procBlobToString(content); - word.put("WRDDICCON", contentString); + List wordList = worddictymapper.selectWordList(map); + String keyword = map.getString("searchKeyword"); + + List processedList = new ArrayList<>(); + + // 데이터 가공 + for (MapDto dto : wordList) { + MapDto author = new MapDto(); + author.put("profileImage", dto.remove("REGPRF")); + author.put("name", dto.remove("REGNAME")); + author.put("color", dto.remove("REGCOLOR")); + author.put("createdAt", dto.remove("REGRDT")); + + MapDto lastEditor = new MapDto(); + lastEditor.put("profileImage", dto.remove("UPDPRF")); + lastEditor.put("name", dto.remove("UPDNAME")); + lastEditor.put("color", dto.remove("UPDCOLOR")); + lastEditor.put("updatedAt", dto.remove("UPDUDT")); + + dto.put("author", author); + dto.put("lastEditor", lastEditor); + + MapDto processedDto = new MapDto(); + processedDto.putAll(dto); + processedList.add(processedDto); + } + return filterPostsByKeyword(processedList,keyword); + } + /** + * 검색어로 순수 텍스트 기준 게시글 필터링 + */ + private List filterPostsByKeyword(List posts, String keyword) { + + keyword = keyword.trim(); + List filtered = new ArrayList<>(); + + for (MapDto post : posts) { + String title = post.getString("WRDDICTTL"); + Object content = post.get("WRDDICCON"); + // BlobUtil.procBlobToString으로 content 변환 + String contentString = BlobUtil.procBlobToString(content); + if(keyword != null || !keyword.trim().isEmpty()) { + String plainText = extractPlainText(contentString); + + if ((title != null && title.contains(keyword)) ||plainText.contains(keyword)) { + post.put("WRDDICCON", contentString); // content는 원래대로 복원 + filtered.add(post); + } + } } - List processedList = new ArrayList<>(); - - // 데이터 가공 - for (MapDto dto : wordList) { - MapDto author = new MapDto(); - author.put("profileImage", dto.remove("REGPRF")); - author.put("name", dto.remove("REGNAME")); - author.put("color", dto.remove("REGCOLOR")); - author.put("createdAt", dto.remove("REGRDT")); - - MapDto lastEditor = new MapDto(); - lastEditor.put("profileImage", dto.remove("UPDPRF")); - lastEditor.put("name", dto.remove("UPDNAME")); - lastEditor.put("color", dto.remove("UPDCOLOR")); - lastEditor.put("updatedAt", dto.remove("UPDUDT")); - - dto.put("author", author); - dto.put("lastEditor", lastEditor); - - MapDto processedDto = new MapDto(); - processedDto.putAll(dto); - processedList.add(processedDto); - } - return processedList; + return filtered; } + public String extractPlainText(String deltaJson) { + StringBuilder sb = new StringBuilder(); + ObjectMapper mapper = new ObjectMapper(); + + try { + JsonNode root = mapper.readTree(deltaJson); + + if (root != null && root.isArray()) { + for (JsonNode op : root) { + 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) { + e.printStackTrace(); // 실제 운영에서는 로깅 처리 + } + + return sb.toString().trim(); + } + public Long insertWord(MapDto map) { Long result = 1L; diff --git a/src/main/resources/mapper/worddictyMapper.xml b/src/main/resources/mapper/worddictyMapper.xml index e7877ff..d194d26 100644 --- a/src/main/resources/mapper/worddictyMapper.xml +++ b/src/main/resources/mapper/worddictyMapper.xml @@ -5,8 +5,8 @@ and ( - REGEXP_REPLACE(w.WRDDICTTL, '\\[\\{.*?"insert":"', '') LIKE CONCAT('%', #{searchKeyword}, '%') - OR REGEXP_REPLACE(w.WRDDICCON, '\\[\\{.*?"insert":"', '') LIKE CONCAT('%', #{searchKeyword}, '%') + w.WRDDICTTL LIKE CONCAT('%', #{searchKeyword}, '%') + OR w.WRDDICCON LIKE CONCAT('%', #{searchKeyword}, '%') )