Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

[IT]Zero-MG

JPA 병합(merge)과 변경감지 :: Update 방법 본문

백엔드 기록/JPA

JPA 병합(merge)과 변경감지 :: Update 방법

민1009 2022. 8. 8. 14:55

 

일반적으로 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에 값이 없는 것을 집중해서 봐주시면 좋겠습니다.

 

test Table이라고 이름을 가정합니다.

위와같이 테이블에 데이터가 있다고 가정한 뒤 idx 3번을 수정해보겠습니다.

JPA 메서드인 merge를 사용하여 DTO를 넣어 값을 DB에 Update해보면

 

test Table이라고 이름을 가정합니다.

이러한 식으로 변경이 됩니다.

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