-
프로젝트를 하며 마주친 ConcurrentModificationException스프링 2022. 5. 6. 14:53
https://m.blog.naver.com/tmondev/220393974518
List 순회 중 만난 ConcurrentModificationException과 컬렉션 불변성
Java로 웹 서비스를 개발하다 보면 여러 가지 Exception을 만나게 된다. 특히 NullPointerException는...
blog.naver.com
해당 블로그 참고를 해서 문제를 해결했다.
미니 블로그 사이트를 제작하는 프로젝트를 수행하면서 ConcurrentModificationException에 부딛혔다.
이 익셉션은 한 번 부딛혀볼만한 익셉션이었는데 나에게는 처음보는 나름 생소한 익셉션이라 기록을 해두려한다.
이 익셉션이 발생한 나의 코드는
댓글 인스턴스가 들어있는 List객체를 foreach문으로 순회하면서,
목표하는 댓글 번호와 foreach로 순회 중인 댓글 객체의 댓글 번호가 서로 일치하는지 확인하여,
일치한다면 삭제를 구현하는 댓글 삭제 기능을 구현한 메소드였다.
위의 해당 조건이 발생할 때, List의 element를 remove하면 저 익셉션이 발생하였는데,
foreach 반복문 역시 내부적으로는 코드의 동작 방식이
Iterator<String> ite = targetList.iterator();while(ite.hasNext()) {String str = ite.next();if ("a".equals(str)) {targetList.remove(str);}}이렇게 iterator로 변환이 되어서 순회를하기때문이었다.iterator객체는 순회를 하면서 hasNext() 메소드를 통해 다음 객체를 호출함과 동시에 기존의 컬렉션 객체가 변화하였는지 감지하는데,
add나 remove 메소드를 사용하면 컬렉션 객체의 길이가 변화하여
컬렉션 객체의 순차적 접근에 문제가 있다고 판단하게된다.
따라서 ConcurrentModificationException, 이 익셉션을 발생시키는데 해결법은
1) 내부적으로 다음 컬렉션의 요소인 hasNext() 메소드를 호출시키기 전에 break로 빠져나오거나
2) 순회 로직이 마무리된 후, 목표하는 인덱스에 접근하면된다.
'스프링' 카테고리의 다른 글
SQLTransientConnectionException ??? (0) 2022.07.12 스프링부트에서 HttpResponse 헤더 객체를 React Client에 보내기. (0) 2022.04.25