JPA - 더티 체킹과 업데이트 그리고 벌크 연산

JPA 에서의 업데이트 - 더티 체킹

Entity 에 대한 더티 체킹 을 통한 업데이트가 이뤄집니다.

JPA 에서는 Entity 를 업데이트 하기 위한 메소드가 별도로 존재하지 않습니다. JPA 에서의 업데이트는 엔티티 변경더티 체킹 을 통해 업데이트가 이뤄집니다.

JPA 에서 엔티티를 변경하기 위해서는 변경하고자 하는 엔티티를 조회한 후 해당 엔티티의 값을 변경하면 트랜잭션을 커밋할 때 변경 감지(Dirty Checking) 가 동작해서 데이터베이스에 UPDATE SQL 이 실행하는 방식으로 Entity 에 대한 변경을 반영합니다.

@Override
@Transactional
public ItemDto.Response modifyItemPrice(Long id, ItemDto.Request itemDto) {
// 1. 변경하고자 하는 Entity 를 조회합니다.
Optional<Item> optionalItem = itemRepository.findById(id);

if (optionalItem.isPresent()) {
Item item = optionalItem.get();

// 2. Entity 의 값을 변경합니다.
item.updatePrice(itemDto.getPrice());

return ItemDto.Response.toDto(item);
} else {
throw new RuntimeException("Item not found");
}
}

Update 쿼리문 발생

update
item
set
item_type_id=?,
modified_date=?,
name=?,
price=?,
version=?
where
id=?
and version=?

더티체크를 통한 업데이트의 한계

더티 체킹을 통한 업데이트는 변경된 Entity 개수만큼 Update 문을 실행합니다. 그렇기 때문에 변경된 Entity 가 100개라면 100번의 Update 문이 실행되는 문제점이 있습니다.

그래서 JPA 에서는 벌크 연산을 통해 한번에 여러 Entity 를 변경할 수 있도록 지원합니다.

벌크 연산을 통한 업데이트

벌크 연산을 통한 업데이트의 한계

벌크 연상의 경우 JPA 를 통해서 업데이트하는 방식이 아니기 때문에 EntityManager 에서 캐싱해놓은 데이터와 DB 에 저장된 데이터의 불일치가 발생합니다.

Share