[IT]Zero-MG
JPA 병합(merge)과 변경감지 :: Update 방법 본문
일반적으로 Update라 하면 특정 값을 대상으로 조회하여
해당 데이터에 접근 후 관련 데이터들을 수정하고 저장하여 수정된 데이터를 유지시킵니다.
:: (말 그대로 Update는 수정)
하지만 JPA에서는 병합(merge) 이라는 Update 기능을 지원하는데요.
글로만 쓰면 이해가 어려울 테니 간단하게 데이터를 만들어 확인해보겠습니다.
public class testDTO{
private Long idx = 3;
private String title = null;
private String writer = 이에이;
private String main_text = JPA가 좋아!;
}
이러한 DTO Form이 있다고 가정하고, DTO에 데이터를 담아서 Update 해보는 과정으로 설명을 진행하겠습니다.
이 DTO에서는 title에 값이 없는 것을 집중해서 봐주시면 좋겠습니다.
위와같이 테이블에 데이터가 있다고 가정한 뒤 idx 3번을 수정해보겠습니다.
JPA 메서드인 merge를 사용하여 DTO를 넣어 값을 DB에 Update해보면
이러한 식으로 변경이 됩니다.
title은 값도 없고 업데이트를 원하지도 않았는데 idx, writer, main_text 세가지만 Update 요청을 했지만,
title이 null이 된 것입니다.
왜 그럴까요?
여기서 중요한 것이 있습니다.
merge는 병합이라고 해서 해당 데이터 들을 교체, 즉 완전 갈아끼운다고 보시면 됩니다.
위와같은 이유 때문에 병합(merge)은 실무에서 사용하기 굉장히 위험하다 라고 볼 수 있습니다.
실수로 한개의 데이터만 수정 하려고 merge를 사용하다 나머지 데이터들이 전부 날아가는 현상을 겪으신다면
굉장히 난감하겠죠...?
그래서 JPA에서 지원하고 권장하는 변경감지 또 다른말로는 Dirty Checking이라고 합니다.
변경감지란?
위 자료로 똑같이 예를 들어 가정한다면,
사용자: 앗! idx 3번 게시물에 main_text를 수정해야겠어!
' JPA가 좋아! '로 수정해야지!!
----- 수정 후 트랜잭션 커밋 ! ! -----
JPA: 삐리릭 삐리릭! idx 3번 의 main_text가 기존 데이터와 다르다!
이거 데이터 변경요청이 들어온거군! Update 쿼리를 쏴서 변경 해주지!!
JPA: UPDATE test FROM main_text WHERE idx = 3;
사용자: 잘 변경 되었군!
약간 이런 느낌입니다.
JPA가 값이 바뀌었는지 모든 컬럼에 데이터를 더티체킹 후 변경되었다면
알아서 Update 쿼리를 만들어서 날려줍니다.
그러므로 JPA에서도 권장하는 변경감지를 사용하는 것을 추천드립니다!
오늘은 JPA의 병합:머지(merge), 변경감지:Dirty Checking 를 알아보았습니다.
감사합니다.

'백엔드 기록 > JPA' 카테고리의 다른 글
JPA :: CRUD와 Transaction(트랜잭션) (0) | 2022.07.19 |
---|