오늘의 주제. 안전코딩
1. JAVA
1) Object.equals() 을 활용해 볼까?
- 참조형 변수를 비교시 NULL이 있을경우 NPE가 발생
if ( myName != null && myName.equal("이름") ) {
// 당신은 멋쟁이!
}
- myName 이 String 이고 참조형 변수여서 null 가능 하기에 안전한 코드를 위하면 null 이 아님을 항상 확인 필요
if ( Objects.equals(myName, "이름") ) {
// 당신은 멋쟁이!
}
- Objects.equals()는 내부에서 NULL 체크하여 NPE 가능성을 줄여줌.
- Objects.equals(null, null) 의 값은 true
2) Object.toString()
- 우린 가끔 변수에 NULL이 오는 경우를 생각하지 못하고 toString을 실행하여 NPE 발생 시키지요.
- NPE 발생을 막기 위해 NULL 확인을 하는 조금 더 복잡한 코드가 필요.
예1) resultName = myName == null ? "이름" : myName;
예2) resultName = Objects.toString(myName, "이름");
// Objects.toString()
public static String toString(Object o, String nullDefault) {
return (o != null) ? o.toString() : nullDefault;
}
3) ObjectUtils.isEmpty(), ObjectUtils.isNotEmpty()
- 우리는 변수의 형별로 NULL 또는 빈 상태를 체크한는 불편함이 있음
- ObjectUtils.isEmpty 는 여러가지 형을 동시에 체크해줌!
// ObjectUtils
public static boolean isEmpty(@Nullable Object obj) {
if (obj == null) {
return true;
} else if (obj instanceof Optional) {
return !((Optional)obj).isPresent();
} else if (obj instanceof CharSequence) {
return ((CharSequence)obj).length() == 0;
} else if (obj.getClass().isArray()) {
return Array.getLength(obj) == 0;
} else if (obj instanceof Collection) {
return ((Collection)obj).isEmpty();
} else {
return obj instanceof Map ? ((Map)obj).isEmpty() : false;
}
}
ex) 잘못된 예
if(!ObjectUtis.isEmpty(...)) -> 명시적 코드가 아님
ex)올바른 예
//Empty가 아닌것을 체크할 경우 아래처럼 체크하는걸 추천
if(ObjectUtis.isNotEmpty(...))
- String 의 경우 NULL과 공백을 동시에 체크
- Spring의 ObjectUtils에는 isNotEmpty가 없음 isNotEmpty가 있는 apache ObjectUtils 추천
2. Javascript
1) !! 연산자를 사용하자.
- JS는 값이 없음을 체크 하기가 참 어렵다 ㅜㅜ ( ““, NaN, undefined, null 등)
- !! 는 값이 없음 체크에 좋다.
- !!의 정확한 정의는 : 값을 불리언 값으로 명시적 변환이다. 그래서 false, 0 에 !! 하는 겨우도 false를 반환
!!("str") //true
!!("") //false
!!true //true
!!false //false
!!NaN //false
!!undefined //false
!!null //false
!!0 //false -> 0을 허용하는 경우도있으니 조심해서 사용할것
!!777 //true
'개발 > Java, Spring' 카테고리의 다른 글
Spring Security Redis deserialize 오류 (Spring Boot 버전 업데이트) (0) | 2024.05.23 |
---|---|
Spring Boot 스레드 사용 동기 처럼 사용하기. (2) | 2024.05.14 |
Spring Boot 에서 Redis 사용해 볼까? (0) | 2024.05.14 |
MultipartFile로 받은 파일 Byte[]보내기 그리고 저장 (0) | 2024.03.19 |
[JPA] Spring JPA CascadeType 종류 (0) | 2023.08.25 |