Backend/Java

parse, valueOf 차이와 문제점

비비빅B 2021. 1. 21. 11:02

Long타입 회원ID를 파싱하는 코드에서 받은 리뷰

평소에 valueOf를 많이 썼는데 valueOf는 예외에 안전하지 않은 함수라서 org.apache.commons.lang3toLong을 사용하라는 코드 리뷰를 받았다. 무슨 차이가 있는 걸까?


형변환 함수

자바에서 형변환 할 수 있는 함수는 parsevalueOf가 있다.

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