[Spring Boot] 변경감지와 머지(merge) - 아이템 수정 (update)

seulki·2022년 12월 15일
0

[springboot]

목록 보기
27/27
post-thumbnail

🎈 준영속(detached) 상태

  • 영속성 컨텍스트에 저장되었다가 분리된 상태로 현재는 영속상태가 아닌 상태이다.
  • 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.


🎈준영속 엔티티를 수정하는 2가지 방법

  • 변경 감지 기능 사용(권장)
  • 병합(merge)사용(권장X)
  • 준영속비영속의 차이점
    -> 준영속과 비영속의 차이는 바로 영속상태가 되어본 경험이다.
    -> 영속상태가 되기 위해서는 식별자가 반드시 필요하다. 준영속 상태
    엔티티는 식별자가 존재한다.
    -> 비영속 상태의 엔티티는 식별자가 존재할 수도, 존재하지 않을 수도 있다.

🗝️merge

  • 신규등록 시 item의 id가 없으므로 em.persist
  • 만약 id가 있다면 한번 등록된 상태이기 때문에 재등록 em.merge
  • 컨트롤러에서 update 시, 변경된 값으러 다시 저장로직을 타게된다.

  • merge가 위험한 이유 : 만약 준영속상태의 item 객체에서 어떤 값에 대한 수정(update)을 원하지 않는다면, null로 값을 받아오게 된다.

  • 데이터 손실 위험 가능성이 있기 떄문에 권장하지 않고, 변경감지를 사용해야한다.


🗝️변경상태 감지

  • 준영속 상태의 Item을 영속상태로 만들어서, set을 해준다.

  • 컨트롤러에서 서비스로 파라미터 전달

  • 서비스에서 select문을 통해 Item 객체를 영속상태로 만들어준다.
    -> 영속상태가 된 후에 set을 해주게 되면, 변경감지를 통해 update가 이루어진다.

  • merge할때는 비영속상태로 merge를 했을 때, Item 객체에서 변경하지 않는 값을 set을 누락한다면 null로 넘어왔지만, 여기서는 영속상태로 만들어 주었기 때문에, 변경하지 않는 값을 set해주지 않아도 기존값이 그대로 저장된다.
    -> name값을 주석처리하여 set을 해주지 않았다.


  • 수정 전

  • 수정 후
    -> name값(상품명)에 set을 주석처리 하였지만 기존값이 잘 들어와있다.

profile
웹 개발자 공부 중

0개의 댓글