개발/Java

[Java/Mybatis] java.lang.UnsupportedOperationException

Daram-e 2024. 1. 5. 13:12

새로운 mapper 파일을 만들일이 생겨서 MyBatis 문법 select 쿼리를 만들다가 마주친 에러가 있었다.

### Error querying database.  Cause: java.lang.UnsupportedOperationException 

 

찾아보니 위의 오류는 주로 'List 형을 new로 초기화하지 않는 상태에서 Arrays로 생성하였을 시 발생' 한다고한다.

Mapper에서 어떻게 이 오류가 발생하는가 싶어서 생각해보니 select된 정보를 mapper.xml에서 java쪽으로 다시 넘길 때, result를 만들면서 생기는 오류라는걸 깨달았다.

 

예상대로 resultType="java.util.List" 때문에 발생한 문제였다. 해결방법은 간단하다.

resultType="HashMap"으로 select 쿼리를 날린 후, service단에서 List로 변환시켜주면 된다. 

DAO를 쓰는 프로젝트라면

resultMap="DAO"로 받아주면 문제될 일은 없을 것이다. 


※ java.lang.UnsupportedOperationException 에 대해 조금 더 자세히 알아보자

해당 에러에 대한 공식문서는 이렇게 되어있다.

(참고 링크 : https://docs.oracle.com/javase/6/docs/api/java/lang/UnsupportedOperationException.html)

또한 모든List 는add()메서드를 구현, 지원하지 않는다.

(참고 링크 : https://docs.oracle.com/javase/6/docs/api/java/util/List.html#add%28E%29)

가장 일반적인 예로 Arrays.asList() 같은 경우 고정된 사이즈의 Array 를 리턴하기 때문에  사이즈를 수정할 수 없다.

 

공식문서에서 Arrays클래스에서 .asList()로 반환해주는건 우리가 알고있는 ArrayList가 아니라 Arrays클래스의 inner Class인 ArrayList로 반환을 한다.

 

asList()를 무조건 사용해야만 한다면, 몇가지 해결방법이 있다.

String[] sampleArray = request.getParameterValues('sample');
// 1. asList() 결과를 new ArrayList<>()
ArrayList<String> sampleList1 = new ArrayList<>(Arrays.asList(sampleArray));
// 2. Stream 사용
 ArrayList<String> sampleList1 = Stream.of(sampleArray).collect(Collectors.toCollection(ArrayList::new));

 

 

위에 공식문서나 스택오버플로우를 찾아보면서  

사용하고 있는 Object가 어떤 것인가에 대한 정확한 지식없이 그냥 개발하다보면 이런 오류가 발생했을 때 대처할 수 있는 방법을 찾기 힘들겠다는것을 느꼈다.