티스토리 뷰
사용자 입력값(String)에 대한, 검증(validation)을 하다보면 Null, Empty, Blank에 대한 검사는 필수적으로 들어간다고 생각한다.
나도 현재 진행 중인 미션에서 이에 대한 검증이 필요했으며, 다음과 같은 코드 리뷰를 받게됐다.
생각해보면 이때의 나는 Null, Empty, Blank에 대한 구분을 넘어서 구분의 필요성 자체를 못 느꼈던 것 같다... 이제는.. 안다.. 😊
분명 어디인가에 나와 같은 사람이 있을것이라 생각하며 이 글을 쓴다.
Null, Empty, Blank가 각각 무엇을 의미하는지 살펴보고, 어떻게 검사하는지, 또 사용자 입력값 검증에 어떻게 적용해야할 지 살펴보자!!
Null
변수에 아무것도 할당되지 않은 상태를 의미한다.
String nullString = null;
다음의 방법으로 문자열이 Null인지 검사할 수 있다.
boolean isNullString(String string) {
return string. == null;
}
Empty
변수에 문자열값이 할당되었지만, 그 길이가 0임을 의미한다.
String emptyString = "";
다음의 방법으로 문자열이 Empty인지 검사할 수 있다.
boolean isEmptyString(String string) {
return string.isEmpty();
}
null-safe하게 하려면 다음의 방법을 사용한다.
boolean isEmptyString(String string) {
return string == null || string.isEmpty();
}
물론 문자열의 길이가 0인지 비교하는 방법으로도 Empty인지 검사할 수 있다.
하지만 isEmpty() 메서드를 지원하는 Java6 이상의 사용자라면 자바에서 제공하는 기본 라이브러리를 활용하는 것이 좋다고 생각한다!!
Blank
변수에 할당된 문자열에 whitespace(스페이스, 탭 등)만 있음을 의미한다.
String blankString = " ";
문자열을 trim() 메서드를 이용해 문자열 내의 앞,뒤의 whitespace를 모두 제거하면 Empty와 같게된다.
따라서 다음의 방법으로 null-safe하게 Blank인지 검사할 수 있다.
boolean isBlankString(String string) {
return string == null || string.trim().isEmpty();
}
Java11에서는 Blank인지 바로 검사해주는 isBlank() 메서드를 제공한다. 이 또한 Java11 이상의 사용자라면 자바에서 제공하는 기본 라이브러리를 활용하는 것이 좋다고 생각한다!!
다음의 방법으로 null-safe하게 Blank인지 검사할 수 있다.
boolean isBlankString(String string) {
return string == null || string.isBlank();
}
여기서 또 알 수 있는 것은 isBlank() 메서드 하나로 Empty와 Blank를 모두 잡아낼 수 있다는 것이다.
따라서 사용자 입력값(String)에 대한 검증(validation)을 하는 경우 다음과 같이 구현하면 된다.
1. 입력값에 Blank는 들어와도 되지만 Empty는 안 될 경우
boolean isEmptyString(String string) {
return string == null || string.isEmpty();
}
2. 입력값에 Empty, Blank 모두 안 될 경우
boolean isBlankString(String string) {
return string == null || string.isBlank();
}
나 또한 다음과 같은 방법으로 사용자 입력값(자동차 이름)에 대한 검증을 진행하였다.
private static void validateNullAndBlank(String carName) {
if ((carName == null) || (carName.isBlank())) {
throw new IllegalArgumentException(CAR_NAME_BLANK_ERROR_MESSAGE);
}
}
그리고 이에 대한 테스트 코드를 작성하여 잘 동작하는 지 테스트 해보았다.
@Test
@DisplayName("자동차 이름에 null이 들어오는 경우 에러 발생 테스트")
void validateCarNamesNull() {
String[] carNames = {null};
assertThatThrownBy(() -> {
CarNamesValidator.validateCarNames(carNames);
}).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("[ERROR] 자동차 이름은 공백이 될 수 없습니다.");
}
@Test
@DisplayName("자동차 이름에 빈값이 들어오는 경우 에러 발생 테스트")
void validateCarNamesEmpty() {
String[] carNames = {"aa", "", "cc"};
assertThatThrownBy(() -> {
CarNamesValidator.validateCarNames(carNames);
}).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("[ERROR] 자동차 이름은 공백이 될 수 없습니다.");
}
@Test
@DisplayName("자동차 이름에 공백이 들어오는 경우 에러 발생 테스트")
void validateCarNamesBlank() {
String[] carNames = {"aa", " ", "cc"};
assertThatThrownBy(() -> {
CarNamesValidator.validateCarNames(carNames);
}).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("[ERROR] 자동차 이름은 공백이 될 수 없습니다.");
}
앞으로는... 까묵지 말자 👍
Ref.
https://www.baeldung.com/java-blank-empty-strings
https://stackabuse.com/java-check-if-string-is-null-empty-or-blank/
'Backend > Java' 카테고리의 다른 글
try-finally 보다는 try-with-resources를 사용하라 (0) | 2022.02.28 |
---|---|
동일성(Identity) vs. 동등성(Equality) (feat. equals(), hashCode()) (0) | 2022.02.25 |
부생성자에서 주생성자를 호출하라 (0) | 2022.02.17 |
Random vs. ThreadLocalRandom (2) | 2022.02.17 |
@SupperessWarning의 쓰임을 알고 사용하자 (0) | 2022.02.14 |