From f21aa866de36218db66259fa03f333bf6ad4fda9 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sun, 26 Jul 2026 21:04:24 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=20Bolt:=20=EC=9E=AC=EA=B7=80=20?= =?UTF-8?q?=EB=A3=A8=ED=94=84=20=EB=B0=96=EC=9C=BC=EB=A1=9C=20=EB=B9=84?= =?UTF-8?q?=EC=9A=A9=EC=9D=B4=20=EB=A7=8E=EC=9D=B4=20=EB=93=9C=EB=8A=94=20?= =?UTF-8?q?=EC=97=B0=EC=82=B0=20=EC=B6=94=EC=B6=9C=EC=9D=84=20=ED=86=B5?= =?UTF-8?q?=ED=95=9C=20=EC=84=B1=EB=8A=A5=20=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit πŸ’‘ λ³€κ²½ 사항: `process_dir` ν•¨μˆ˜ 내뢀에 μ •μ˜λ˜μ–΄ 있던 정적 `cssContent`, λΉ„μš©μ΄ 많이 λ“œλŠ” SHA-256 μ•”ν˜Έν™” ν•΄μ‹œ μ—°μ‚°(`styleHash`), 정적 `css` ν…œν”Œλ¦Ώ λ³€μˆ˜λ₯Ό Kotlin의 파일 μˆ˜μ€€ 속성(top-level properties)으둜 μΆ”μΆœν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ 100% JaCoCo ν…ŒμŠ€νŠΈ 컀버리지λ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•΄ 암묡적 getter에 λŒ€ν•œ λͺ…μ‹œμ μΈ ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. 🎯 이유 (μ„±λŠ₯ 문제 ν•΄κ²°): κΈ°μ‘΄ κ΅¬ν˜„μ—μ„œλŠ” 디렉토리λ₯Ό μˆœνšŒν•˜λŠ” 크둀러(`process_dir` ν•¨μˆ˜)κ°€ λ°©λ¬Έν•˜λŠ” *λͺ¨λ“  단일 λ””λ ‰ν† λ¦¬λ§ˆλ‹€* λ™μΌν•œ CSS λ¬Έμžμ—΄μ„ ν• λ‹Ήν•˜κ³ , 무거운 SHA-256 μ•”ν˜Έν™” ν•΄μ‹œλ₯Ό μž¬μƒμ„±ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 파일 μˆ˜κ°€ 수천, 수만 개인 큰 디렉토리 트리λ₯Ό μ²˜λ¦¬ν•  λ•Œ, μ΄λŠ” λΆˆν•„μš”ν•œ 큰 CPU μ‹œκ°„ 낭비와 객체 ν• λ‹Ή(κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ μ••λ ₯ 증가)을 μœ λ°œν•˜λŠ” μ„±λŠ₯ 병λͺ©μ΄μ—ˆμŠ΅λ‹ˆλ‹€. πŸ“Š 영ν–₯: - 디렉토리당 λ°œμƒν•˜λ˜ λ¬Έμžμ—΄ ν• λ‹Ή 및 SHA-256 ν•΄μ‹œ μ—°μ‚° λΉ„μš©μ΄ μ™„μ „νžˆ 0으둜 κ°μ†Œ (ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 단 1회만 κ³„μ‚°λ˜λ„λ‘ O(N)을 O(1)둜 μ΅œμ ν™”). - 크둀링 루프 λ‚΄μ—μ„œ λΆˆν•„μš”ν•œ 큰 λ¬Έμžμ—΄κ³Ό λ°”μ΄νŠΈ 배열이 반볡 μƒμ„±λ˜μ§€ μ•Šμ•„ λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±μ΄ 크게 ν–₯상됨. πŸ”¬ μΈ‘μ • 및 검증 방법: - λ‹¨μœ„ ν…ŒμŠ€νŠΈ 및 정적 뢄석 톡과 확인 - JaCoCo 컀버리지 리포트 확인 (100% λͺ…λ Ήμ–΄ 컀버리지 μœ μ§€) --- .jules/bolt.md | 3 +++ src/main/kotlin/html4tree/main.kt | 14 +++++++------- src/test/kotlin/html4tree/CoverageTest.kt | 7 +++++++ 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/.jules/bolt.md b/.jules/bolt.md index 19b4c613..3c5361d4 100644 --- a/.jules/bolt.md +++ b/.jules/bolt.md @@ -43,3 +43,6 @@ ## 2025-01-24 - 단일 readAttributes 호좜둜 파일 속성 쑰회 μ΅œμ ν™” **ν•™μŠ΅:** `isDirectory`, `!it.isDirectory()`, `isSymbolicLink` 3개의 κ°œλ³„μ μΈ 파일 μ‹œμŠ€ν…œ I/O ν˜ΈμΆœμ„ μˆ˜ν–‰ν•˜λ©΄ μ„±λŠ₯ μ €ν•˜κ°€ ν½λ‹ˆλ‹€. 이λ₯Ό 단일 `Files.readAttributes` 호좜둜 λ³€κ²½ν•˜μ—¬ 메타데이터λ₯Ό ν•œ λ²ˆμ— μ‘°νšŒν•¨μœΌλ‘œμ¨ I/O μ˜€λ²„ν—€λ“œλ₯Ό λŒ€ν­ 쀄일 수 μžˆμŒμ„ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. **쑰치:** 디렉토리 순회 μ‹œ 파일의 μ—¬λŸ¬ 속성을 확인할 λ•ŒλŠ” κ°œλ³„μ μΈ stat ν˜ΈμΆœλ³΄λ‹€ `Files.readAttributes`λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•„μš”ν•œ λͺ¨λ“  속성을 ν•œ λ²ˆμ— κ°€μ Έμ˜€λŠ” 방식을 μš°μ„ μ μœΌλ‘œ κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€. +## 2024-07-26 - μž¬κ·€ 루프 λ°–μœΌλ‘œ λΉ„μš©μ΄ 많이 λ“œλŠ” μ—°μ‚° μΆ”μΆœ +**ν•™μŠ΅:** `process_dir`κ³Ό 같은 μž¬κ·€ ν•¨μˆ˜ 내뢀에 μ •μ˜λœ 정적 데이터(예: `cssContent`) 및 λΉ„μš©μ΄ 많이 λ“œλŠ” μ•”ν˜Έν™” μ—°μ‚°(예: SHA-256)을 Kotlin의 파일 μˆ˜μ€€(top-level) μ†μ„±μœΌλ‘œ μΆ”μΆœν•˜λ©΄, λ””λ ‰ν† λ¦¬λ§ˆλ‹€ λ™μΌν•œ μž‘μ—…μ΄ 반볡적으둜 ν‰κ°€λ˜λŠ” 것을 λ°©μ§€ν•˜μ—¬ μ„±λŠ₯을 크게 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. +**쑰치:** ν•¨μˆ˜ μΈμžμ— μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ” 정적 λ°μ΄ν„°λ‚˜ λΉ„μ‹Ό 속성을 μ •μ˜ν•  λ•ŒλŠ” 이λ₯Ό 파일 μˆ˜μ€€μœΌλ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€. 100% ν…ŒμŠ€νŠΈ 컀버리지λ₯Ό μœ μ§€ν•˜λ €λ©΄ μƒμ„±λœ 암묡적 getter에 λŒ€ν•œ λͺ…μ‹œμ  ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€. diff --git a/src/main/kotlin/html4tree/main.kt b/src/main/kotlin/html4tree/main.kt index b4558624..5f0809bb 100644 --- a/src/main/kotlin/html4tree/main.kt +++ b/src/main/kotlin/html4tree/main.kt @@ -240,11 +240,7 @@ fun write_index_file(curr_dir: File, content: String) { } } -fun process_dir(curr_dir: File, excludeSet: Set? = null, dirFiles: Array? = null){ - - val exclude: Set = excludeSet ?: process_ignore_file(curr_dir) - - val cssContent = """ +val cssContent = """ body { font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; line-height: 1.5; @@ -310,13 +306,17 @@ fun process_dir(curr_dir: File, excludeSet: Set? = null, dirFiles: Array } """ - val styleHash = "sha256-" + Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA-256").digest(cssContent.toByteArray(Charsets.UTF_8))) +val styleHash = "sha256-" + Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA-256").digest(cssContent.toByteArray(Charsets.UTF_8))) - val css = """ +val css = """ """ +fun process_dir(curr_dir: File, excludeSet: Set? = null, dirFiles: Array? = null){ + + val exclude: Set = excludeSet ?: process_ignore_file(curr_dir) + val index_top = """ diff --git a/src/test/kotlin/html4tree/CoverageTest.kt b/src/test/kotlin/html4tree/CoverageTest.kt index dccf3046..ebd60833 100644 --- a/src/test/kotlin/html4tree/CoverageTest.kt +++ b/src/test/kotlin/html4tree/CoverageTest.kt @@ -19,4 +19,11 @@ class CoverageTest { readOnlyDir.setWritable(true, false) } } + + @Test + fun testTopLevelProperties() { + assertTrue(cssContent.contains("body")) + assertTrue(styleHash.startsWith("sha256-")) + assertTrue(css.contains("