본문 바로가기

JPA

Dirty Checking(더티 체킹) 이란.

728x90
반응형
SMALL

JPA는 조회, 저장, 삭제에 대한 기능을 제공하지만, 수정에 대한 기능이 따로 존재하지않는다.

 

그래서 Dirty Checking 이란 것을 제공한다.

 

JPA에서는 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 데이터베이스에 자동으로 반영해준다.

변화의 기준은 최초 조회 상태이다.

 

이런 JPA 에서는 수정에 대한 기능이 따로 존재하지 않기 때문에, Dirty Checking 을 제공해주는데.

 

Dirty Checking은 Transaction 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베이스에 반영하는 JPA 특징이다.

 

이해를 위해 예시를 보자.

 

Member라는 테이블에 ID=5 에 해당하는 데이터가 들어있다.

[Controller]

 @PutMapping("/test")
    public void update(){
        String name = "박영재" ;
            memberService.updateMemberInfo(name);
    }

[Service]

    @Transactional
    public void updateMemberInfo(String name) {
        Long id = 5L;
        Member member = memberRepository.findById(id).orElse(null);
        member.updateinfo(name);
    }

id=5 인 Member 데이터를 조회 해온후, 컨트롤러에서 받은 name 값을 넣어줘 업데이트를 해줬다.

조회해온후, 업데이트를 해준 쿼리를 볼수있다. (값이 항상 변경되야지만, 업데이트 문을 날려준다!!!)

 

 

이게 JPA의 더티체킹이다.

 

여기서 중요한건 @Transactional 을 써줘야한다.

@Transactional을 메소드 상단에 써주면, 해당 메소드를 트랜잭션으로 감싼다.

그래서 엔티티의 변경감지를 인지하고, jpa의 더티체킹이 가능해진다.

 

@Transactional을 제거한 후 다시 테스트를 해보았다. (controller에서 name = 최영재 로 지정하였다,)


    public void updateMemberInfo(String name) {
        Long id = 5L;
        Member member = memberRepository.findById(id).orElse(null);
        member.updateinfo(name);
    }

업데이트 쿼리를 볼수 가 없다.

변경 없이 그대로다.

 

 

728x90
반응형
LIST

'JPA' 카테고리의 다른 글

JPA 와 Mybatis 같이 사용하기  (0) 2023.06.08
변경된 칼럼만 update 하기.  (0) 2023.05.15
QueryDSL 연산자 비교식 정보  (0) 2023.05.09
Insert Query 줄이기(성능개선)  (0) 2023.04.10
N+1 문제  (0) 2023.03.16