콘텐츠로 건너뛰기

JPA Page 쿼리는 Immutable List를 반환한다

이번에 맡은 업무에서 Spring Batch를 중점적으로 사용하고 있는데, 기존 로직을 리팩토링하면서 겪게 된 이슈를 기록해본다.

먼저 기존 로직은 아래와 같다. (코드 스니핏이고, 일부 업무와 관계된 네이밍은 모두 dummy로 치환하였다)
결국 배치로직에서 bulk로 읽어온 것을 하나씩 read/process/write 구조로 처리하고,
해당 내용이 없어지면 다음 page를 bulk로 읽어온다.
이 포스팅에 다루는 문제의 핵심은 bulk로 받아온 List의 첫 element를 마치 Queue처럼 순차적으로 빼서 쓰는 부분이다.

그런데 조금 불필요한 부분(redundancy)이 보이는 것 같다.
entitiesAtDb.getContent()한 내용이 List<SomeEntity>인데 왜 굳이 new ArrayList()로 래핑을 한 것일까.

그래서 해당 부분을 제거하기로 결정했다.

이제 코드가 불편한 느낌이 없이 깔끔해졌다.
어? 그런데 테스트코드에서 런타임에 오류가 발생한다.

new ArrayList()로 래핑해놓은 이유가 있었다.
아마도 내부 List가 immutable하게 구성되어 있나보다. 말이 나온 김에 좀더 찾아보기로 했다.

일반적으로 JPA에서는 List 엄밀히 따지면, mutableList를 반환한다.
그래서 element를 추가, 삭제할 수 있다.
어찌보면 JPA 철학상 당연히 그래야 하는지도 모른다.

다만, Paging을 사용하는 경우에는 readonly처럼 생각한 모양이다.
그래서 element를 추가, 삭제할 수 없도록 immutableList를 반환하고 있다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다