-
JPA의 entity update는 어떻게 이루어질까?Back-End/JPA 2022. 5. 3. 10:04728x90
spring-data-JPA에서, entity에 대해 save 메서드는 있지만 update에 대한 메서드가 따로 없다.
이유는 JPA는 '변경감지'라는 기능을 활용하기 때문이다.
엔티티를 영속 상태로 만들 때, 처음 엔티티의 정보에 대한 스냅샷을 저장을 해 둔다.
이 후, 트랜잭션이 끝날때 까지 해당 정보를 유지하다가, 트랜잭션이 종료될 때(혹은 flush를 날릴 때)
해당 엔티티의 변화를 스냅샷과 비교한 뒤 이를 감지하여 update 쿼리를 자동으로 생성하여 DB에 날리게 된다.
@Transactional public void update(Long id, String name){ Member member = memberRepository.findById(id); member.setName(name); }
id와 name을 갖는 Entity인 Member가 있다고 가정했을 때, 이름을 update 하고 싶으면
@RequiredArgsContructor @RequstMapping("/member") public Class MemberApiController{ @PutMapping("/api/v2/members/{id}") public UpdateMemberResponse updateMemberV2( @PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest request){ memberService.update(id, request.getName()); } //MemberDto @Data @AllArgsConstructor static class UpdateMemberRequest { private String name; } } // MemberService.class @Transactional public void update(Long id, String name){ Member member = memberRepository.findById(id).orElseThrow(MemberNotFoundException::new); member.setName(name); }
다음과 같이 영속 상태의 member에 대해 setName을 통해 name을 변경한다.
@Transactional에 의해, 해당 AOP가 종료되면서 영속성 컨텍스트의 member가 DB에 commit이 된다.(flush)
자세한 원리는 JPA 프로그래밍 578p에 나와있다.
'Back-End > JPA' 카테고리의 다른 글
JPA의 연관관계에 대한 고찰 (0) 2022.11.18 JPA Auditing과 MappedSuperClass 활용 (0) 2022.09.14 JPA에서, Many To One 관계의 Post 요청에서 주의할 점 (0) 2022.08.25