평소에 valueOf를 많이 썼는데 valueOf는 예외에 안전하지 않은 함수라서 org.apache.commons.lang3의 toLong을 사용하라는 코드 리뷰를 받았다. 무슨 차이가 있는 걸까?
형변환 함수
자바에서 형변환 할 수 있는 함수는 parse와 valueOf가 있다.
parse는 원시형으로 타입을 반환하고 valueOf는 이를 wrap 한 클래스형으로 반환한다.
long a = Long.parseLong(1);
Long A = Long.valueOf(1);
이러한 형식의 문제점은 변환하려는 값에 문자가 올 경우 예외를 던진다는 것이다. 물론 그럴 가능성은 적겠지만, 안정적인 프로그램을 만들려면 사용자가 넣을 수 있는 값을 모두 고려해야 한다.
Long.parseLong("99", 8) // throws a NumberFormatException
Long.parseLong("Hazelnut") // throws a NumberFormatException
이렇게 예외를 던지면 서비스를 유지하기 위해 따로 예외처리가 필요한데 번거롭기도 하고 중복된 코드가 생길 것이다.
라이브러리 형변환 함수
그럼 라이브러리 toLong 함수는 어떻게 돼 있을까?
NumberUtils.toLong(null) = 0L
NumberUtils.toLong("") = 0L
NumberUtils.toLong("1") = 1L
NumberUtils.toLong(null, 1L) = 1L
NumberUtils.toLong("", 1L) = 1L
NumberUtils.toLong("1", 0L) = 1L
기본적으로 처리할 수 없는 값이 들어오면 0으로 반환하고 두 번째 인자로 default 값을 받아서 커스텀할 수 있다.
나의 경우에는 String으로 들어온 회원 ID를 Long으로 변환하려 했기 때문에 에러 대신 0으로 반환하게 변경했다.
이렇게 하면 NumberFormatException에 대한 예외를 따로 처리할 필요 없이, 서비스에서 ID가 0인 회원을 조회할 때 이미 예외처리해둔 UserNotFound 커스텀 에러가 반환될 것이다.
'Backend > Java' 카테고리의 다른 글
Spring Security JWT Token (0) | 2021.03.22 |
---|---|
@RequestBody 모델에 기본생성자, setter/getter가 필요한가? (4) | 2021.01.21 |
Repository와 DAO 차이? (0) | 2021.01.14 |
[Spring Boot] 유효성 검사 (0) | 2020.12.16 |
[JSP] 쿼리문 실행 오류 (0) | 2020.07.09 |