..

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이 아닌” 상황을 피하려면 사용하는 라이브러리 메서드의 내부 동작 방식을 정확히 이해하는 것이 중요합니다.