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); } /**