상세 컨텐츠

본문 제목

더티체킹 (JPA 더티체킹이란)(스프링부트 @Transactional)

카테고리 없음

by shika 2022. 4. 30. 16:04

본문

자바 코드를 변경시키면

영속성 컨텍스트에 정보가

(트랜잭션이 종료될때) 변경감지를 통해 그 변경을 감지하고

실제 DB에 수정을 날려주는 것을 의미한다

 

이것을 "더티 체킹"이라고 한다

 

그래서 springboot jpa 등에서

DB update가 필요할 때에는

.save()보다는 이러한 더티체킹을 통해서 update를 진행을 할 것이다.

 

좀더 쉽게

코드로 살펴보자면

// save함수는 id를 전달하지 않으면 insert를 해주고
// save함수는 id를 전달하면 해당 id에 대한 데이터가 있으면 update를 해주고
// save함수는 id를 전달하면 해당 id에 대한 데이터가 없으면 insert를 한다. (update시에는 save메소드를 많이 안쓴다)
// email, password바꾸기
@Transactional //이거 넣으면 save함수 주석처리(이거 없으면 save있어야됌), 함수종료시에 자동 commit이 된다
@PutMapping("/dummy/user/{id}") //요청주소가 같아도 밑에 get과 put은 알아서 구분이 된다 & put은 update이다
public User updateUser(@PathVariable int id, @RequestBody User requestUser) { //json데이터 받으려면 @RequestBody해줘야된다
    System.out.println("id : "+id);																		//Json데이터요청 => 스프링부트(MessageConverter의 Jackson)가 JAVA Object로 변환해서 받아준다
    System.out.println("password : "+requestUser.getPassword());
    System.out.println("email : "+requestUser.getEmail());

    //람다식은 findById를 실행해서 못찾을경우 람다식을 실행해라 라는 뜻이다
    User user = userRepository.findById(id).orElseThrow(()->{
        return new IllegalArgumentException("수정에 실패하였습니다");
    });
    user.setPassword(requestUser.getPassword());
    user.setEmail(requestUser.getEmail());
    //userRepository.save(user);

    //더티 체킹
    return null; 
}

이런 코드가 있을 때

save()메소드도 없고

update에 관련된 코드도 한줄도 없는것을 알 수 있다.

 

하지만 마지막 리턴문 앞에있는

user.setPassword(requestUser.getPassword());
user.setEmail(requestUser.getEmail());

이 코드를 통해서

내가 넣은 데이터에 맞게 DB의 값이 변경이 된다.

 

왜냐고?

바로 위에서 설명한 더티체킹 때문이다.

메소드가 @Transactional 어노테이션을 사용하고 있으므로

메소드가 종료될때 자동으로 commit을 날려주고

 

지금 보는 자바코드의 메소드가 완료될때

user의 값이 변경이 되면

save() 메소드 없이도

영속성 컨텍스트의 값을 변경하고 이것을 DB까지 전달하여

커밋 후 자바 메소드가 종료되게 되는것이다.

 

update를 할때는 save()함수 보다는 @Transactional 을 통해서

진행하도록 하자

 

댓글 영역