diff --git a/backend/src/main/java/com/zzang/chongdae/offering/config/OfferingConfig.java b/backend/src/main/java/com/zzang/chongdae/offering/config/OfferingConfig.java index 3d8d61006..09cc51e4e 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/config/OfferingConfig.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/config/OfferingConfig.java @@ -1,8 +1,13 @@ package com.zzang.chongdae.offering.config; +import com.zzang.chongdae.offering.service.CombinationProductImageExtractor; import com.zzang.chongdae.offering.service.NaverApiProductImageExtractor; +import com.zzang.chongdae.offering.service.OgTagProductImageExtractor; import com.zzang.chongdae.offering.service.ProductImageExtractor; +import com.zzang.chongdae.offering.util.httpclient.crawler.HtmlCrawler; +import com.zzang.chongdae.offering.util.httpclient.crawler.JsoupHtmlCrawler; import com.zzang.chongdae.offering.util.httpclient.naver.NaverScrapClient; +import java.util.List; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -16,8 +21,17 @@ public NaverScrapClient naverScrapClient() { return new NaverScrapClient(CRAWLER_TIMEOUT_MILLISECONDS); } + @Bean + public HtmlCrawler htmlCrawler() { + return new JsoupHtmlCrawler(CRAWLER_TIMEOUT_MILLISECONDS); + } + @Bean public ProductImageExtractor productImageExtractor() { - return new NaverApiProductImageExtractor(naverScrapClient()); + List extractors = List.of( + new OgTagProductImageExtractor(htmlCrawler()), + new NaverApiProductImageExtractor(naverScrapClient()) + ); + return new CombinationProductImageExtractor(extractors); } } diff --git a/backend/src/main/java/com/zzang/chongdae/offering/service/CombinationProductImageExtractor.java b/backend/src/main/java/com/zzang/chongdae/offering/service/CombinationProductImageExtractor.java new file mode 100644 index 000000000..620f91042 --- /dev/null +++ b/backend/src/main/java/com/zzang/chongdae/offering/service/CombinationProductImageExtractor.java @@ -0,0 +1,27 @@ +package com.zzang.chongdae.offering.service; + +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@RequiredArgsConstructor +@Component +public class CombinationProductImageExtractor implements ProductImageExtractor { + + private final List extractors; + + @Override + public String extract(String productUrl) { + for (ProductImageExtractor extractor : extractors) { + String imageUrl = extractor.extract(productUrl); + if (isExtractSuccess(imageUrl)) { + return imageUrl; + } + } + return ""; + } + + private boolean isExtractSuccess(String imageUrl) { + return !imageUrl.isEmpty(); + } +} diff --git a/backend/src/main/java/com/zzang/chongdae/offering/service/OgTagProductImageExtractor.java b/backend/src/main/java/com/zzang/chongdae/offering/service/OgTagProductImageExtractor.java index e5867ce36..53056cb68 100644 --- a/backend/src/main/java/com/zzang/chongdae/offering/service/OgTagProductImageExtractor.java +++ b/backend/src/main/java/com/zzang/chongdae/offering/service/OgTagProductImageExtractor.java @@ -2,8 +2,10 @@ import com.zzang.chongdae.offering.util.httpclient.crawler.HtmlCrawler; import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; @RequiredArgsConstructor +@Component public class OgTagProductImageExtractor implements ProductImageExtractor { public static final String OG_IMAGE_PROPERTY = "og:image";