본문 바로가기
스프링 부트/Error-Log

[Error-Log] ORA-01861: literal does not match format string

by illlilillil 2022. 8. 25.

ORA-01861: literal does not match format string 리터럴이 형식 문자열과 일치하지 않음

 

해커톤 마감을 앞두고 로컬에선 잘만 되던 API가 EC2에선 400에러를 뱉는 상황이 있었습니다.

 

OS의 LANG 설정이 달라 문자열을 날짜로 제대로 변환을 못해서 발생하는 이슈였습니다.

 

맥 OS와 아마존 리눅스 LANG 설정 차이

 

OS의 LANG에 대해 전혀 인지를 못해 발생했었습니다.

이런 경우 서로 서버의 LANG을 맞춰주는 것보단 조회 쿼리에서 데이트 포맷을 명시적으로 맞춰주는게 좋아보입니다.

EC2 인스턴스가 여러가지 이유들로 교체될 수도 있고 로컬 Lang 또한 상황에 따라 바뀔수도 있기 때문입니다.

 

NLS_LANG이란 것이 등장하는데 OS 계정의 환경 변수를 말합니다.

JDBC는 JVM의 JAVA Local에서 언어와 지역 설정을 읽어옵니다. 따라서 날짜 형식이 지역 설정에 따라 바뀔 수가 있는 것입니다.

 

NLS_DATE_FORMAT은 OS에 따라 달라집니다.

  • window - RR-MM-DD
  • linux - ko_kr.utf-8 - RR-MM-DD
  • linux - en_us.utf-8 - DD-MON-RR

 

따라서 Date Format을 사용하는 경우 배포 서버에서의 에러를 방지하기 위해 TO_DATE로 감싼 쿼리를 날려줘야 합니다.

년월일을 조건문에 써야하는 경우는 TO_DATE(:beforeOneHour,'YYYY-MM-DD')로 작성하시면 됩니다. TO_DATE 사용을 위해 nativeQuery로 날리셔야 합니다.


SQL 두 가지 예시

to_date('2014-03-21 09:15:00', 'YYYY-MM-DD HH24:MI:SS'), or timestamp '2014-03-21 09:15:00.0

 

댓글