..
Troubleshooting: String.valueOf()가 'null' 문자열을 반환할 때
1. 문제 상황
데이터 Map에서 값을 꺼내 Null 체크를 하는 조건문을 작성했음에도 불구하고, 값이 없는 경우에 자꾸만 조건문을 통과하여 로그가 찍히는 기현상이 발생했습니다.
String value = String.valueOf(row.get("DATA"));
if (value != null) {
// value가 "null" 문자열인 경우 이 안으로 들어옴
logger.debug("Value is: [{}]", value);
}
// 결과: DEBUG : Value is: [null]
2. 원인 분석
String.valueOf() 메서드의 내부 구현을 살펴보면 원인을 알 수 있습니다.
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
인자로 받은 객체가 null일 경우, literal null이 아닌 문자열 "null"을 반환합니다. 이 때문에 value != null 체크는 무용지물이 됩니다.
3. 해결 방법
- 직접 비교: 문자열
"null"과 비교하거나, 원본 객체의 null 여부를 먼저 확인합니다. - 안전한 변환:
Objects.toString(obj, null)과 같이 기본값을 지정할 수 있는 라이브러리 메서드를 사용하거나, 단순히(String) obj캐스팅을 활용합니다.
“Null인데 Null이 아닌” 상황을 피하려면 사용하는 라이브러리 메서드의 내부 동작 방식을 정확히 이해하는 것이 중요합니다.