잡동사니
[SimpleDateFormat] java.lang.NumberFormatException 처리하기 본문
안녕하세요. yeTi입니다.
오늘은 간헐적으로 java.lang.NumberFormatException이 발생하는 현상에 대해 얘기하고자 합니다.
근래에 서버에서 다음과 같은 오류가 발생했습니다.
- java.lang.NumberFormatException: For input string: ".77E1."
- java.lang.NumberFormatException: multiple points
우연히 발생하는 위치가 SimpleDateFormat 객체로 parse하는 부분이었습니다.
그래서 SimpleDateFormat 객체와 관련하여 버그를 찾던 중 Thread Safe 관련한 내용들을 찾았습니다.
1. Stack Overflow나 다른 개발자분들의 블로그에서 비슷한 상황에 대한 문제를 찾았습니다.
- 주요 내용은 Multi Thread 환경에서 SimpleDateFormat을 static으로 공유해서 사용하면 parse할때 간헐적으로 문제가 발생한다는 내용입니다.
2. DateFormat에 대한 Javadoc 문서를 확인해봤습니다.
- 다음과 같은 내용이 있습니다.
Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.
- Multi Thread 환경에서는 synchronize를 관리하라는 내용이 있습니다.
3. 제시한 해결 방법들을 찾아봤습니다.
- static하게 전역으로 사용하지 말고 내부 변수로 선언하고 사용하라는 제안이 있습니다.
- synchronized를 활용하라는 제안이 있습니다.
- 다른 라이브러리(Joda, FastDateFormat, DateTimeFormatter)를 활용하라는 제안이 있습니다.
저는 DateTimeFormatter로 교체하여 테스트 중입니다.
참고 문헌
- Stack Overflow : https://stackoverflow.com/questions/4021151/java-dateformat-is-not-threadsafe-what-does-this-leads-to
- nklee님의 블로그 : http://lng1982.tistory.com/229
- Javadoc : https://docs.oracle.com/javase/8/docs/api/java/text/DateFormat.html
- David Ford의 Medium: https://medium.com/@daveford/numberformatexception-multiple-points-when-parsing-date-650baa6829b6
- fahd의 블로그 : http://fahdshariff.blogspot.com/2010/08/dateformat-with-multiple-threads.html
- FreeLife님의 블로그 : http://javafactory.tistory.com/300
'IT > Java' 카테고리의 다른 글
[Spring] Cassandra 연동 및 Insert (0) | 2018.08.30 |
---|---|
[Spring] AOP기반 SQL Logging (4) | 2018.08.08 |
[Spring] Spring Boot에서 HikariCP Datasource 연동하기 (0) | 2018.07.19 |
[산출물] 클래스 명세서 쉽게 작성하기 (0) | 2017.07.04 |
[Window] 톰캣으로 배포시 한글이 깨지는 경우 해결법 (0) | 2017.04.14 |