어느날과 다름없이 개발을 진행하고 있는데 개발서버에서 오류가 난다는 말을 듣고 가서 보니
java.lang.UnsupportedOperationException: null 이런 오류가 발생하고 있었다.
처음에는 무심코 NULL만 보고 ' 아 쿼리에 NULL이들어갈수 없는데 들어갔구나 ' 라는 생각으로 Parameter에서부터 Mapper까지 전체적인 흐름과 로직, 쿼리를 살펴보고있었다.
근데 아무리봐도 이상이 없는 로직인데 계속해서 해당 오류를 내뿜고 있었고 데이터도 등록이 되지 않는 상황...
한참을 시간소요하다가 다른곳이 문제인거같아서 Service 단에서 한줄한줄 Log를 찍어보기 시작...
문제는 쿼리나 파라미터가 아닌 다른곳에서 발생하고 있었다.
Map<String, Object> searchMap = mapDTO.getMap("dma_SearchMap");
searchMap.put("SE", dataMap.get("BGT_YR") + String.valueOf(dataMap.get("BALC_SE_CD")) + String.valueOf(dataMap.get("SN")));
이렇게 searchMap이라는 Map 변수에 put을 해주고 있는데...
Log를찍어보니 searchMap을 생성할때 mapDTO에서 getMap으로 해당 맵 객체의 이름을 통해 Map 객체를 복사해주는데... 빈객체인것이다.
근데 아무리 그래도 이 오류가 날수가 있나? 싶어서 검색해보니
UnsupportedOperationException 에러는 불변의 다양한 객체의 요소를 수정, 추가, 삭제하려고 할때 발생하는 오류였던것.
음? 불변의 객체? 그럴수 있나? 싶어서 mapDTO의 getMap 메서드를 살펴보니
public Map<String, Object> getMap(String dataSetName) {
List<Map<String, Object>> mapList = getList(dataSetName);
if (ObjectUtils.isEmpty(mapList)) {
return Collections.emptyMap();
}
return mapList.get(0);
}
Aㅏ.... 객체가 비어있으면 Collections.emptyMap()으로 불변의 객체를 반환하고 있는것이 아닌가...
그래서 이 오류가 발생한다는것을 알고 나서 반환된 searchMap을 다시 가변 객체로 생성해주고 나서 put을 실행하였더니 정상적으로 오류도 해결되고 Data도 정상적으로 입력되는것을 확인할수 있었다...
Map<String, Object> searchMap = mapDTO.getMap("dma_SearchMap");
Map<String, Object> resultMap = new HashMap<>(searchMap); //가변 객체 새로 생성
resultMap.put("SE", dataMap.get("BGT_YR") + String.valueOf(dataMap.get("BALC_SE_CD")) + String.valueOf(dataMap.get("SN")));
return resultMap;
이렇게 가변객체를 생성후 다시 put을 해주고 해당 가변객체를 반환하니 정상적으로 수행되었다.
NULL 문자만 보고 쿼리 오류일것이라고 단정지은 나, 그리고 Parameter만 수없이 쳐다본 나. 뭣도 모르면서 여기서 오류일것이라고 넘겨짚고 2시간 남짓을 허비한 나. 반성하자
역시 모르는 오류일때는 검색이 우선. 그리고 아무리 모르겠으면 빨리 포기하고 한줄한줄 Log 찍어보는게 최고다.
'Study > 에러해결' 카테고리의 다른 글
SQL Error [972] [42000]: ORA-00972: 식별자의 길이가 너무 깁니다 (1) | 2024.09.24 |
---|---|
Mapper.xml에서 동적쿼리 조건식 for input String 에러 (0) | 2024.07.15 |