본문 바로가기
스프링 부트/Error-Log

[Error-Log] ConcurrentModificationException 해결법

by illlilillil 2022. 2. 4.

@OnetoMany에서 collection 삭제할 때 에러 해결 방법

프로젝트에서 상품 이미지를 수정하려고 할 때 이미지를 새로 올리도록 설정해놨습니다. 그렇기 때문에 기존 이미지 url들을 삭제한 후에 이미지를 업로드하는 로직으로 구성하는 와중에 생긴 에러입니다.

 

orphanremoval 설정을 해두어 url쪽의 FK만 null로 설정해줘도 연관 관계가 끊기게 되고 자동으로 해당 url 엔티티는 delete가 됩니다.

그러나 일반적으로 for을 사용해서 삭제를 진행하게 되면 삭제될 때마다 index가 바뀌어  제대로 삭제가 진행되지 않으면서 ConcurrentModificationException 에러를 띄우게 됩니다.

for(Url url : productById.getUrlList()) {
     url.setProduct(null);
}

 

그럴때는 iterator를 사용해서 지워야 깔끔한 삭제가 가능합니다. it.remove()를 사용해야 합니다.

for(Iterator<Url> it = productById.getUrlList().iterator() ; it.hasNext() ; )
{
     Url url = it.next();
     url.setProduct(null);
     it.remove();
}

댓글