데이터베이스/mongoDB
MongoDB 필드명 특수문자 예외 처리 및 치환
silvereun
2025. 6. 12. 10:40
1. 문제 상황
MongoDB에 데이터를 적재할 때, 도큐먼트의 필드명(key)에 다음과 같은 문자가 포함되면 저장 오류가 발생합니다.
- 점(.)
- 달러 기호($)
- null 문자(\0)
- 백슬래시(\)
- 큰따옴표(")
예외 메시지 예시:
org.springframework.data.mapping.MappingException: Map key 1. OR contains dots but no replacement was configured! Make sure map keys don't contain dots in the first place or configure an appropriate replacement!
또는
"errmsg": "Document can't have $ prefixed field names: $CAGDATE"
MongoDB 내부적으로 $로 시작하는 필드명은 예약어이고, .은 도큐먼트 경로 탐색에 사용되는 특수 문자이기 때문입니다.
2. 발생 원인
- 사용자가 직접 입력한 명칭이 그대로 파일에 저장됩니다.
- 이 명칭에 점(.), 달러 기호($) 같은 특수문자가 포함될 수 있습니다.
- 그런데 MongoDB는 필드명(키)에 이런 특수문자가 들어가면 저장할 수 없습니다.
- 그래서 특수문자가 포함된 필드명을 MongoDB에 저장하려 하면 오류가 발생합니다.
3. 해결 방법
1) 필드명(key)에서 예외 문자 치환 처리
MongoDB에 적재 전에 key명에 포함된 특수문자를 안전한 문자(예: 언더스코어 _)로 치환합니다.
예를 들어, Java 코드에서는 아래와 같이 처리했습니다.
String filedName = StringUtils.nvl(headerList.get(i));
filedName = filedName.replaceAll("[\\\\$.\\\"]", "_"); // MongoDB 필드명 예외 문자 치환
- 정규식 [\\\\$.\\\"] 는 백슬래시(\), 달러($), 점(.), 큰따옴표(")를 찾아서 _로 대체합니다.
- 필요에 따라 null 문자(\0)도 추가해서 치환할 수 있습니다.
5. 참고 사항
문자 | MongoDB 도큐먼트 필드명 제한 이유 |
---|---|
$ |
예약어, 연산자 접두어로 사용 |
. |
도큐먼트 내 하위 필드 접근 구분자 (dot notation) |
\0 |
널 문자, 문자열 종료 신호 |
\ |
이스케이프 문자 |
" |
문자열 구분용 큰따옴표 |