Skip to content

Commit 51d00c7

Browse files
committed
refactor: 아티클 처리 Tag 조회 개선
아티클 처리시 매번 DB Tag조회 -> 미리 전체 Tag 조회하여 조합하는 방식으로 변경
1 parent ce319c8 commit 51d00c7

6 files changed

Lines changed: 43 additions & 19 deletions

File tree

src/main/java/com/davcatch/devcatch/common/scheduler/article/ArticleSchedulerService.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package com.davcatch.devcatch.common.scheduler.article;
22

33
import java.util.List;
4+
import java.util.Map;
45
import java.util.concurrent.CompletableFuture;
56
import java.util.concurrent.Executor;
67

78
import org.springframework.stereotype.Service;
89

9-
import com.davcatch.devcatch.common.integration.selenium.SeleniumBrowserService;
1010
import com.davcatch.devcatch.domain.source.Source;
11+
import com.davcatch.devcatch.domain.tag.Tag;
12+
import com.davcatch.devcatch.domain.tag.TagType;
1113
import com.davcatch.devcatch.web.service.source.SourceService;
14+
import com.davcatch.devcatch.web.service.tag.TagService;
1215

1316
import lombok.RequiredArgsConstructor;
1417
import lombok.extern.slf4j.Slf4j;
@@ -18,23 +21,25 @@
1821
@Slf4j
1922
public class ArticleSchedulerService {
2023

24+
private static final int ARTICLE_BATCH_SIZE = 5;
25+
2126
private final SourceService sourceService;
27+
private final TagService tagService;
2228
private final ArticleSchedulerTask articleSchedulerTask;
2329
private final Executor schedulerTaskExecutor;
2430

2531
public void createNewArticle() {
2632
List<Source> sources = sourceService.getActiveSources();
33+
Map<TagType, Tag> tagMap = tagService.getAllTagsConvertMap();
2734
log.info("총 {}개 소스 처리 시작", sources.size());
2835

29-
int batchSize = 5;
30-
31-
for (int i = 0; i < sources.size(); i += batchSize) {
32-
int endIndex = Math.min(i + batchSize, sources.size());
36+
for (int i = 0; i < sources.size(); i += ARTICLE_BATCH_SIZE) {
37+
int endIndex = Math.min(i + ARTICLE_BATCH_SIZE, sources.size());
3338
List<Source> batchSources = sources.subList(i, endIndex);
3439

3540
List<CompletableFuture<Void>> futures = batchSources.stream()
3641
.map(source -> CompletableFuture.runAsync(() -> {
37-
articleSchedulerTask.processSource(source);
42+
articleSchedulerTask.processSource(source, tagMap);
3843
}, schedulerTaskExecutor))
3944
.toList();
4045

src/main/java/com/davcatch/devcatch/common/scheduler/article/ArticleSchedulerTask.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.davcatch.devcatch.common.scheduler.article;
22

33
import java.util.List;
4+
import java.util.Map;
45

56
import org.springframework.stereotype.Component;
67
import org.springframework.transaction.annotation.Propagation;
@@ -11,6 +12,8 @@
1112
import com.davcatch.devcatch.common.scheduler.article.processor.ArticleProcessorService;
1213
import com.davcatch.devcatch.domain.article.Article;
1314
import com.davcatch.devcatch.domain.source.Source;
15+
import com.davcatch.devcatch.domain.tag.Tag;
16+
import com.davcatch.devcatch.domain.tag.TagType;
1417

1518
import lombok.RequiredArgsConstructor;
1619
import lombok.extern.slf4j.Slf4j;
@@ -24,7 +27,7 @@ public class ArticleSchedulerTask {
2427
private final ArticleProcessorService articleProcessorService;
2528

2629
@Transactional(propagation = Propagation.REQUIRES_NEW)
27-
public void processSource(Source source) {
30+
public void processSource(Source source, Map<TagType, Tag> tagMap) {
2831
try {
2932
List<ParsedArticle> collectedArticles = articleParseService.parseArticles(source);
3033

@@ -35,7 +38,7 @@ public void processSource(Source source) {
3538

3639
log.info("[{}] {}개 아티클 수집 완료", source.getName(), collectedArticles.size());
3740

38-
List<Article> processedArticles = articleProcessorService.processParsedArticles(source, collectedArticles);
41+
List<Article> processedArticles = articleProcessorService.processParsedArticles(source, tagMap, collectedArticles);
3942

4043
log.info("[{}] {}개 아티클 처리 완료", source.getName(), processedArticles.size());
4144
} catch (Exception e) {

src/main/java/com/davcatch/devcatch/common/scheduler/article/processor/ArticleProcessorService.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.davcatch.devcatch.common.scheduler.article.processor;
22

33
import java.util.List;
4+
import java.util.Map;
45
import java.util.Objects;
56
import java.util.concurrent.CompletableFuture;
67
import java.util.concurrent.Executor;
@@ -14,8 +15,8 @@
1415
import com.davcatch.devcatch.domain.article.Article;
1516
import com.davcatch.devcatch.domain.source.Source;
1617
import com.davcatch.devcatch.domain.tag.Tag;
18+
import com.davcatch.devcatch.domain.tag.TagType;
1719
import com.davcatch.devcatch.web.service.article.ArticleService;
18-
import com.davcatch.devcatch.web.service.tag.TagService;
1920

2021
import lombok.RequiredArgsConstructor;
2122
import lombok.extern.slf4j.Slf4j;
@@ -26,18 +27,22 @@
2627
public class ArticleProcessorService {
2728

2829
private final ArticleSummaryService articleSummaryService;
29-
private final TagService tagService;
3030
private final ArticleService articleService;
3131
private final Executor gptSummaryTaskExecutor;
3232

33-
public List<Article> processParsedArticles(Source source, List<ParsedArticle> parsedArticles) {
33+
public List<Article> processParsedArticles(Source source, Map<TagType, Tag> tagMap, List<ParsedArticle> parsedArticles) {
3434
log.debug("[{}] {}개 아티클 처리 시작", source.getName(), parsedArticles.size());
3535

3636
List<CompletableFuture<Article>> futures = parsedArticles.stream()
3737
.map(parsedArticle -> CompletableFuture.supplyAsync(() -> {
3838
try {
3939
ArticleSummary summary = articleSummaryService.summarizeArticle(parsedArticle.getContent());
40-
List<Tag> tags = tagService.getInTagTypes(summary.getTags());
40+
41+
List<Tag> tags = summary.getTags().stream()
42+
.map(tagMap::get)
43+
.filter(Objects::nonNull)
44+
.toList();
45+
4146
Article article = ArticleUtil.createNewArticle(source, parsedArticle, summary, tags);
4247

4348
articleService.save(article);
@@ -51,19 +56,15 @@ public List<Article> processParsedArticles(Source source, List<ParsedArticle> pa
5156

5257
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
5358

54-
List<Article> processedArticles = futures.stream()
59+
return futures.stream()
5560
.map(future -> {
5661
try {
57-
return future.get();
62+
return future.getNow(null);
5863
} catch (Exception e) {
59-
log.error("[{}] CompletableFuter 결과 가져오기 실패: {}", source.getName(), e.getMessage(), e);
6064
return null;
6165
}
6266
})
6367
.filter(Objects::nonNull)
6468
.toList();
65-
66-
log.debug("[{}] {}개 아티클 처리 완료", source.getName(), processedArticles.size());
67-
return processedArticles;
6869
}
6970
}

src/main/java/com/davcatch/devcatch/repository/tag/TagRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44
import java.util.Optional;
5+
import java.util.Set;
56

67
import org.springframework.data.jpa.repository.JpaRepository;
78
import org.springframework.data.jpa.repository.Query;
@@ -13,4 +14,6 @@ public interface TagRepository extends JpaRepository<Tag, Long> {
1314

1415
@Query("select t from Tag t where t.tagType in :tagTypes")
1516
List<Tag> findInTagType(List<TagType> tagTypes);
17+
18+
List<Tag> findAll();
1619
}

src/main/java/com/davcatch/devcatch/web/service/tag/TagService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.davcatch.devcatch.web.service.tag;
22

33
import java.util.List;
4+
import java.util.Map;
5+
import java.util.Set;
6+
import java.util.stream.Collectors;
47

58
import org.springframework.stereotype.Service;
69
import org.springframework.transaction.annotation.Transactional;
@@ -28,4 +31,13 @@ public class TagService {
2831
public List<Tag> getInTagTypes(List<TagType> tagTypes) {
2932
return tagRepository.findInTagType(tagTypes);
3033
}
34+
35+
/**
36+
* 전체 Tag 조회후 <TagType, Tag> Map으로 변환
37+
* @return tag Map
38+
*/
39+
public Map<TagType, Tag> getAllTagsConvertMap() {
40+
return tagRepository.findAll().stream()
41+
.collect(Collectors.toMap(Tag::getTagType, tag -> tag));
42+
}
3143
}

src/main/resources/logback-spring.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
</appender>
4646

4747
<!-- scheduler만 별도 처리 -->
48-
<logger name="com.davcatch.devcatch.common.scheduler" level="INFO" additivity="false">
48+
<logger name="com.davcatch.devcatch.common.scheduler" level="DEBUG" additivity="false">
4949
<appender-ref ref="SCHEDULER" />
5050
<appender-ref ref="CONSOLE" />
5151
</logger>

0 commit comments

Comments
 (0)