From d39ff37299e8abf521795454cb6e9f815f725c87 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Tue, 30 Jun 2026 21:18:43 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20=EB=B0=94=EC=9D=B4=ED=8A=B8?= =?UTF-8?q?=20=EB=B0=B0=EC=97=B4=EC=9D=84=2016=EC=A7=84=EC=88=98=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=EB=A1=9C=20=EB=B3=80=ED=99=98?= =?UTF-8?q?=ED=95=A0=20=EB=95=8C=20=EC=84=B1=EB=8A=A5=20=EA=B0=9C=EC=84=A0?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20HexFormat=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .jules/bolt.md | 3 +++ .../viewer/service/DefaultDocumentConversionService.java | 8 ++------ 2 files changed, 5 insertions(+), 6 deletions(-) create mode 100644 .jules/bolt.md diff --git a/.jules/bolt.md b/.jules/bolt.md new file mode 100644 index 0000000..2bcd17d --- /dev/null +++ b/.jules/bolt.md @@ -0,0 +1,3 @@ +## 2024-06-30 - Hex Format Optimization +**Learning:** Using String.format() in a loop to convert byte arrays to hex strings allocates many temporary objects (String, Object[] for varargs) and performs poorly. The application's DefaultDocumentConversionService previously used this pattern for hashing uploads, impacting memory and CPU heavily. +**Action:** Always prefer java.util.HexFormat.of().formatHex(bytes) introduced in Java 17 for byte-to-hex conversion to improve performance, minimize object allocation, and make the code cleaner. diff --git a/src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java b/src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java index 9c59593..92e76a5 100644 --- a/src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java +++ b/src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java @@ -7,6 +7,7 @@ import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.HexFormat; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -121,12 +122,7 @@ private String contentHash(MultipartFile file) { } byte[] raw = digest.digest(); - StringBuilder hex = new StringBuilder(raw.length * 2); - for (byte b : raw) { - hex.append(String.format("%02x", b)); - } - - return hex.toString(); + return HexFormat.of().formatHex(raw); } catch (NoSuchAlgorithmException ex) { throw new IllegalStateException("SHA-256 digest unavailable", ex); } catch (IOException ex) {