JPA 준영속 엔티티를 수정할때 방법
JPA에서는 업데이트를 진행할때 2가지 방법이 있습니다.
1. 변경감지 기능
2. merge
변경감지 기능이란?
- id를 기반으로 실제 DB에 있는 영속 상태의 엔티티 findItem을 조회한후 변경하고자 하는 필드만 지정해서
set을 해주면, 따로 persist를 할필요 없이 jpa에서 변경사항을 찾아서 flush를 해줍니다. 따라서 알아서 db에 변경하고자 하는값이 업데이트가 됩니다.
@Transactional
public Item updateItem(Long itemId, Book param){
Item findItem = itemRepository.findOne(itemId);
findItem.setPrice(param.getPrice());
findItem.setName(param.getName());
findItem.setStockQuantity(param.getStockQuantity());
return findItem;
}
merge (병합) 이란?
위에 선언한 set문을 설정하지 않고 em.merge 한줄로 jpa에서 알아서 넘어온 파라미터로 수정을 해줍니다.
merge 사용시 주의사항은 변경감지 기능 같은경우에는 원하는 속성을 선택해서 변경할수 있었지만, 병합은 선택권이 없이 이 모든 속성이 변경됩니다. 병합시 값이 null로 넘어오면 null로 업데이트 되는 위험도 있습니다.
private final EntityManager em;
public void save(Item item){
if (item.getId() == null){
em.persist(item);
} else{
em.merge(item);
}
}
결론
merge가 편해 보이지만 사용하면 굉장히 위험합니다. 엔티티를 변경할경우 변경감지 기능을 사용해서 각각 설정해줘야 됩니다.
'스프링' 카테고리의 다른 글
[Spring Jpa] 1. 게시판 만들기 - 프로젝트 설정 (InteliJ+Spring Data Jpa+QueryDsl+H2+타임리프+BootStrap5+Gradle) (0) | 2022.08.01 |
---|---|
[Spring] 서버 시작시 invalid source release: 11 오류 대처법 (0) | 2022.08.01 |
[Spring] InteliJ 주석 템플릿 설정 (0) | 2022.07.20 |
[Spring] Intelij Gradle 설정 (0) | 2022.07.18 |
[JPA] 매핑 어노테이션 정리 (0) | 2022.06.20 |