From be302612f510a961e2796db7d5e84a350d45d2e7 Mon Sep 17 00:00:00 2001 From: joungmin Date: Mon, 15 Jun 2026 15:40:45 +0900 Subject: [PATCH] perf(vector): #331 VectorService.saveRestaurantVectors batchUpdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - N+1 단건 jdbc.update → 단일 jdbc.batchUpdate(SqlParameterSource[]) - UUID 인라인 변환 → IdGenerator.newId() 공통 유틸 - 현재 N=1로 영향 작으나, chunk 분할 도입 시를 위한 사전 정비 - 회귀 없음: 동일 INSERT SQL, 동일 파라미터 매핑 설계서: docs/design/331-vector-batch-insert/README.md Refs: #331 (Developer 단계) --- .../com/tasteby/service/VectorService.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/backend-java/src/main/java/com/tasteby/service/VectorService.java b/backend-java/src/main/java/com/tasteby/service/VectorService.java index 7ff3c0e..c9ce75d 100644 --- a/backend-java/src/main/java/com/tasteby/service/VectorService.java +++ b/backend-java/src/main/java/com/tasteby/service/VectorService.java @@ -1,10 +1,12 @@ package com.tasteby.service; +import com.tasteby.util.IdGenerator; import com.tasteby.util.JsonUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.stereotype.Service; import java.util.*; @@ -64,6 +66,9 @@ public class VectorService { /** * Save vector embeddings for a restaurant. + * + * #331 — N개 청크를 단일 batchUpdate 호출로 처리 (이전: N+1 INSERT round-trip). + * UUID 생성은 IdGenerator.newId() 공통 유틸 사용 (인라인 변환 코드 제거). */ public void saveRestaurantVectors(String restaurantId, List chunks) { if (chunks.isEmpty()) return; @@ -75,19 +80,20 @@ public class VectorService { VALUES (:id, :rid, :chunk, :emb) """; + SqlParameterSource[] batch = new SqlParameterSource[chunks.size()]; for (int i = 0; i < chunks.size(); i++) { - String id = UUID.randomUUID().toString().replace("-", "").substring(0, 32).toUpperCase(); - float[] vec = new float[embeddings.get(i).size()]; + List emb = embeddings.get(i); + float[] vec = new float[emb.size()]; for (int j = 0; j < vec.length; j++) { - vec[j] = embeddings.get(i).get(j).floatValue(); + vec[j] = emb.get(j).floatValue(); } - var params = new MapSqlParameterSource(); - params.addValue("id", id); - params.addValue("rid", restaurantId); - params.addValue("chunk", chunks.get(i)); - params.addValue("emb", vec); - jdbc.update(sql, params); + batch[i] = new MapSqlParameterSource() + .addValue("id", IdGenerator.newId()) + .addValue("rid", restaurantId) + .addValue("chunk", chunks.get(i)) + .addValue("emb", vec); } + jdbc.batchUpdate(sql, batch); } /**