perf(vector): #331 VectorService.saveRestaurantVectors batchUpdate

- 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 단계)
This commit is contained in:
joungmin
2026-06-15 15:40:45 +09:00
parent 91d9813253
commit be302612f5

View File

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