diff --git a/CHANGELOG.md b/CHANGELOG.md
index f4ae011..0ab2d50 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,15 @@
## 2026-06-15
+### ๐ #357 DDG โ Naver Search ์ ์ API + DDG ํด๋ฐฑ (v0.1.44)
+- WebSearchService ์ ๊ท (Naver webkr.json ์ฐ์ , ํค ๋ฏธ์ค์ /์คํจ ์ DDG ํด๋ฐฑ)
+- RestaurantController.searchTabling/searchCatchtable ๋ด๋ถ ํธ์ถ ๊ต์ฒด, DDG ์ธ๋ผ์ธ 80์ค ์ ๊ฑฐ
+- application.yml: app.naver.client-id/secret (NAVER_CLIENT_ID/SECRET ํ๊ฒฝ๋ณ์)
+- k8s/secrets.yaml.template์ NAVER_CLIENT_ID/SECRET ํญ๋ชฉ ์ถ๊ฐ
+- ๋ฏธ์ฌ์ฉ import ์ ๋ฆฌ (HttpClient/URI/URLEncoder/Pattern ๋ฑ RestaurantController์์)
+- ์ค๊ณ์: docs/design/357-web-search-api/README.md
+- Refs: #357 (close)
+
### ๐ฏ #356 ์์-์๋น ๊ด๋ จ๋ LLM ํ๊ฐ (v0.1.43)
- DB: video_restaurants ์ปฌ๋ผ ์ถ๊ฐ (relevance/relevance_reason/relevance_evaluated_at) + idx_vr_relevance
- VideoRelevanceService ์ ๊ท (#322 RestaurantVerifyService ํจํด ๋ชจ๋ฐฉ, @Async verifyAsync/verify/verifyAll)
diff --git a/backend-java/src/main/java/com/tasteby/controller/RestaurantController.java b/backend-java/src/main/java/com/tasteby/controller/RestaurantController.java
index cabc8a1..32cab49 100644
--- a/backend-java/src/main/java/com/tasteby/controller/RestaurantController.java
+++ b/backend-java/src/main/java/com/tasteby/controller/RestaurantController.java
@@ -7,6 +7,7 @@ import com.tasteby.security.AuthUtil;
import com.tasteby.service.CacheService;
import com.tasteby.service.GeocodingService;
import com.tasteby.service.RestaurantService;
+import com.tasteby.service.WebSearchService;
import jakarta.annotation.PreDestroy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -15,19 +16,10 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
-import java.net.URI;
-import java.net.URLDecoder;
-import java.net.URLEncoder;
-import java.net.http.HttpClient;
-import java.net.http.HttpRequest;
-import java.net.http.HttpResponse;
-import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadLocalRandom;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
@RestController
@RequestMapping("/api/restaurants")
@@ -39,13 +31,15 @@ public class RestaurantController {
private final GeocodingService geocodingService;
private final CacheService cache;
private final ObjectMapper objectMapper;
+ private final WebSearchService webSearch;
private final ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
- public RestaurantController(RestaurantService restaurantService, GeocodingService geocodingService, CacheService cache, ObjectMapper objectMapper) {
+ public RestaurantController(RestaurantService restaurantService, GeocodingService geocodingService, CacheService cache, ObjectMapper objectMapper, WebSearchService webSearch) {
this.restaurantService = restaurantService;
this.geocodingService = geocodingService;
this.cache = cache;
this.objectMapper = objectMapper;
+ this.webSearch = webSearch;
}
// #290 โ Bean ์ข
๋ฃ ์ virtual thread executor๋ฅผ ์ ๋ฆฌํ์ฌ ๋ฆฌ์์ค ๋์ ๋ฐฉ์ง.
@@ -430,93 +424,17 @@ public class RestaurantController {
return result;
}
- // โโโ DuckDuckGo HTML search helpers โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
+ // โโโ ์์ฝ ์ฌ์ดํธ URL ๊ฒ์ (#357 WebSearchService: Naver primary + DDG fallback) โโโ
- private static final HttpClient httpClient = HttpClient.newBuilder()
- .followRedirects(HttpClient.Redirect.NORMAL)
- .build();
-
- private static final Pattern DDG_RESULT_PATTERN = Pattern.compile(
- "]+class=\"result__a\"[^>]+href=\"([^\"]+)\"[^>]*>(.*?)",
- Pattern.DOTALL
- );
-
- /**
- * DuckDuckGo HTML ๊ฒ์์ ํตํด ํน์ ์ฌ์ดํธ์ URL์ ์ฐพ๋๋ค.
- * html.duckduckgo.com์ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ด๋ผ ๋ด ํ์ ์์ด HTTP ์์ฒญ๋ง์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ฑํ ์ ์๋ค.
- */
- private List