ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA의 entity update는 어떻게 이루어질까?
    Back-End/JPA 2022. 5. 3. 10:04
    728x90

    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에 나와있다.

     

    댓글

Designed by Tistory.