From c8a119a3a66f8ee32cf5102032b754bf331823d8 Mon Sep 17 00:00:00 2001 From: z3rotig4r Date: Fri, 12 Jun 2026 20:44:15 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20convert2CamelCase=20=EB=B9=88/null=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=98=88=EC=99=B8=20=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CamelUtil.convert2CamelCase와 CamelCaseUtil.convert2CamelCase는 입력이 빈 문자열이면 charAt(0)에서 StringIndexOutOfBoundsException이, null이면 NullPointerException이 발생합니다. CamelUtil은 EgovMap.put이 모든 맵 키마다 호출하므로(키가 빈 문자열이거나 null인 경우) MyBatis EgovMap resultType 처리 경로에서 예외로 이어질 수 있습니다. 두 유틸 모두 진입부에 null/빈 문자열 가드를 추가해 입력을 그대로 반환하도록 했습니다. 각 테스트 클래스에 빈 문자열·null 회귀 테스트를 추가했습니다. --- .../fdl/security/userdetails/util/CamelCaseUtil.java | 6 ++++++ .../fdl/security/userdetails/CamelCaseUtilTest.java | 11 +++++++++++ .../egovframe/rte/psl/dataaccess/util/CamelUtil.java | 6 ++++++ .../rte/psl/dataaccess/utils/CamelUtilTest.java | 11 +++++++++++ 4 files changed, 34 insertions(+) diff --git a/Foundation/org.egovframe.rte.fdl.security/src/main/java/org/egovframe/rte/fdl/security/userdetails/util/CamelCaseUtil.java b/Foundation/org.egovframe.rte.fdl.security/src/main/java/org/egovframe/rte/fdl/security/userdetails/util/CamelCaseUtil.java index 02516b47..b4bef39a 100755 --- a/Foundation/org.egovframe.rte.fdl.security/src/main/java/org/egovframe/rte/fdl/security/userdetails/util/CamelCaseUtil.java +++ b/Foundation/org.egovframe.rte.fdl.security/src/main/java/org/egovframe/rte/fdl/security/userdetails/util/CamelCaseUtil.java @@ -37,6 +37,12 @@ private CamelCaseUtil() { } public static String convert2CamelCase(String underScore) { + // null 또는 빈 문자열은 변환할 대상이 없으므로 그대로 반환한다. + // (빈 문자열일 때 isSkipCase의 charAt(0)에서 StringIndexOutOfBoundsException이, + // null일 때 NullPointerException이 발생하던 문제를 방지한다.) + if (underScore == null || underScore.isEmpty()) { + return underScore; + } if (isSkipCase(underScore)) { return underScore; } diff --git a/Foundation/org.egovframe.rte.fdl.security/src/test/java/org/egovframe/rte/fdl/security/userdetails/CamelCaseUtilTest.java b/Foundation/org.egovframe.rte.fdl.security/src/test/java/org/egovframe/rte/fdl/security/userdetails/CamelCaseUtilTest.java index 07eae3c3..622077d9 100755 --- a/Foundation/org.egovframe.rte.fdl.security/src/test/java/org/egovframe/rte/fdl/security/userdetails/CamelCaseUtilTest.java +++ b/Foundation/org.egovframe.rte.fdl.security/src/test/java/org/egovframe/rte/fdl/security/userdetails/CamelCaseUtilTest.java @@ -10,6 +10,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; /** * CamelCase 유틸리티 테스트 (JUnit 5) @@ -29,4 +30,14 @@ public void convert2CamelCase() { assertEquals("Column1Test", CamelCaseUtil.convert2CamelCase("_column_1_test_")); } + /** + * 빈 문자열은 charAt(0)에서, null은 NullPointerException이 발생하던 것을 + * 그대로 반환하도록 가드를 추가했다. + */ + @Test + public void convert2CamelCaseEmptyAndNull() { + assertEquals("", CamelCaseUtil.convert2CamelCase("")); + assertNull(CamelCaseUtil.convert2CamelCase(null)); + } + } diff --git a/Persistence/org.egovframe.rte.psl.dataaccess/src/main/java/org/egovframe/rte/psl/dataaccess/util/CamelUtil.java b/Persistence/org.egovframe.rte.psl.dataaccess/src/main/java/org/egovframe/rte/psl/dataaccess/util/CamelUtil.java index 20a5b6f6..33c10acf 100755 --- a/Persistence/org.egovframe.rte.psl.dataaccess/src/main/java/org/egovframe/rte/psl/dataaccess/util/CamelUtil.java +++ b/Persistence/org.egovframe.rte.psl.dataaccess/src/main/java/org/egovframe/rte/psl/dataaccess/util/CamelUtil.java @@ -44,6 +44,12 @@ private CamelUtil() { * @return Camel 표기법 변수명 */ public static String convert2CamelCase(String underScore) { + // null 또는 빈 문자열은 변환할 대상이 없으므로 그대로 반환한다. + // (빈 문자열일 때 charAt(0)에서 StringIndexOutOfBoundsException이, + // null일 때 indexOf 호출에서 NullPointerException이 발생하던 문제를 방지한다.) + if (underScore == null || underScore.isEmpty()) { + return underScore; + } // '_' 가 나타나지 않으면 이미 camel case 로 가정함. // 단 첫째문자가 대문자이면 camel case 변환 (전체를 소문자로) 처리가 // 필요하다고 가정함. --> 아래 로직을 수행하면 바뀜 diff --git a/Persistence/org.egovframe.rte.psl.dataaccess/src/test/java/org/egovframe/rte/psl/dataaccess/utils/CamelUtilTest.java b/Persistence/org.egovframe.rte.psl.dataaccess/src/test/java/org/egovframe/rte/psl/dataaccess/utils/CamelUtilTest.java index e31f5ebc..42c6d123 100755 --- a/Persistence/org.egovframe.rte.psl.dataaccess/src/test/java/org/egovframe/rte/psl/dataaccess/utils/CamelUtilTest.java +++ b/Persistence/org.egovframe.rte.psl.dataaccess/src/test/java/org/egovframe/rte/psl/dataaccess/utils/CamelUtilTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; public class CamelUtilTest { @@ -18,4 +19,14 @@ public void testConvert2CamelCase() { assertEquals("uppercase", CamelUtil.convert2CamelCase(upperCaseString)); } + /** + * 빈 문자열은 charAt(0)에서, null은 indexOf 호출에서 예외가 발생하던 것을 + * 그대로 반환하도록 가드를 추가했다. + */ + @Test + public void testConvert2CamelCaseEmptyAndNull() { + assertEquals("", CamelUtil.convert2CamelCase("")); + assertNull(CamelUtil.convert2CamelCase(null)); + } + }