문제 상황
토이프로젝트 진행중 파라미터로 전달된 문자열이 유효할 경우에만 수행해야 하는 로직이 있었다.
여기서 의미하는 유효함은 공백을 제외하고 길이가 1이상인 경우를 의미한다.
String 클래스에 있는 isEmpty를 사용해봤지만 NPE가 발생해서 내용을 확인해보니,
null 체크는 하지 않고 바로 길이가 0인지만 판별함을 알 수 있었다.
org.springframework.util.StringUtils#isEmpty
String을 파라미터로 전달하면, null체크도 해주고, 길이가 0이 아닌지 체크해주는 메소드가 필요했다.
익숙하게 사용하던 것은 아니지만 스쳐가며 본 기억이 있는 StringUtils 클래스를 활용해보기로 했다.
이 포스팅에서 다루는 StringUtils는 org.springframework.util 패키지의 StringUtils 이다.
따라서 스프링부트를 사용한다면 추가적 의존성이 불필요하다.
마침 StringUtils 클래스에도 똑같은 isEmpty() 메소드가 있어서 사용하려 했더니 Deprecated 되어있었다.
감사하게도 대체 메소드를 명시해뒀다.
설명을 대략 해석해보면 명백히 String 타입인 경우 hasLength나 hasText를 권장한다고 되어있다.
Object 타입으로 진행하고자 한다면 ObjectUtils의 isEmpty를 권장하고 있다.
아무래도 기존 StringUtils의 isEmpty는 파라미터를 Object로 받고 있었는데,
이 역할을 ObjectUtils로 보내고, 명백히 String 을 검증하고자할때에는
StringUtils의 다른 메소드를 사용하게 유도하려는 듯 하다.
StringUtils.hasLength, hasText
대용 메소드로 권장받은 두 메소드를 확인해봤다.
먼저 hasLength 다.
null체크 후, String클래스의 isEmpty를 호출하여 길이가 0인지 판별한다.
맨 위에서 NPE를 만났던 이유가 null체크가 선행되지 않았던 때문인데,
StringUtils 클래스의 hasLength는 딱 그 null체크만 앞에 선행되는 메소드이다.
Note에도 적혀있듯이, 공백만 있는 문자열, 가령 " "에 대해서도 true가 반환되는 점에 유의해야 한다.
즉, 공백만으로 이루어졌더라도 상관없이 null체크와 길이가 1이상인지 확인하고자 할 때 사용하면 된다.
다음으로 hasText 다.
이름에서 유추할 수 있듯이, hasLength에다 추가적으로 공백이 아닌 문자열이 존재하는지까지 검증해주는 메소드다.
설명만 읽어보면 명백하다. null이 아니어야 하고, 길이가 0보다 커야하고, 공백이 아닌 문자가 포함되어있어야 한다.
containsText 메소드는 문자열을 하나씩 순회하며 공백이 아닌 character가 하나라도 있으면 true를 리턴하는 메소드다.
최초 나의 요구사항은 공백을 제외한 길이가 1이상인 문자열을 유효하다라고 정했기 때문에,
hasLength는 사용불가하고, hasText를 사용하면 되는 것으로 결론지어졌다.
hasLength와 hasText는 아마 앞으로 유용하게 자주 쓰일 것 같다.
참고로 ObjectUtils의 isEmpty 메소드는 먼저 null체크를 하고,
검증대상이 Optional인지, CharSequence인지, Array인지, Collection인지, Map인지 확인하고,
각 타입에 맞는 isEmpty 메소드를 호출한 결과를 반환해준다.
결론
StringUtils 클래스의 hasText(String) 메소드는
null 체크, 길이가 0보다 큰지 체크, 공백이 아닌 문자열이 하나라도 포함되었는지까지 한번에 검증해준다!
'Java & Spring' 카테고리의 다른 글
오라클 클라우드 Autonomous Database DB접속 로컬 + 서버 (0) | 2021.10.18 |
---|---|
모의면접 복기 (2) - 가비지 컬렉션 Garbage Collection (0) | 2021.09.27 |
스프링부트가 정적 리소스 제공하는 과정 (0) | 2021.08.30 |
SpringBoot 로그 레벨 동적으로 변경하기 (runtime logging level change) (0) | 2021.06.12 |
SpringBoot에서 오라클 클라우드 Autonomous Databases 접속하기 (10) | 2021.05.19 |