쉬운 프로그래밍

[JPA] JPA를 통해 업데이트를 할 경우 왜 쿼리를 안날려도 될까? 본문

Programming/JPA

[JPA] JPA를 통해 업데이트를 할 경우 왜 쿼리를 안날려도 될까?

쉬운형 2021. 3. 19. 23:20

아래는 서비스 코드이다.

 

1. 더티체킹

위의 메소드는 update 기능을 수행하고 있지만 DB에 쿼리를 날리는 부분이 존재하지 않는다.

 

이것이 가능한 이유는 JPA의 영속성 컨텍스트 때문이다.

 

영속성 컨텍스트는 엔티티를 영구 저장하는 환경으로 생각하면 된다.

 

JPA는 엔티티가 영속성 컨텍스트에 포함되어있는지, 아닌지를 중시한다.

 

엔티티 매니저가 활성화된 상태로 트랜잭션 안에서 DB를 통해 데이터를 가져오면 이 데이터는 영속성 컨텍스트가 유지된 상태이다.

 

즉 이 상태에서 해당 데이터의 값을 변경하면 트랜잭션이 끝나는 시점에 해당 테이블에 변경사항을 반영한다.

 

요약해서 말하면 Entity 객체의 값만 변경하면 별도로 Update 쿼리를 날릴 필요가 없다는 것이다. 

 

이 개념을 더티 체킹(Dirty Checking)이라고 한다.

 

이러한 경우와 다른 여러가지 이유를 포함에서 Entity를 다루는 데는 극도의 주의가 필요하며, 컨트롤러 내에서는 꼭 DTO 사용이 권장된다.

 

2. 테스트 코드

실제 테스트 코드를 통해 별도의 쿼리 없이 정상적으로 Update를 수행하는지 테스트 해보겠다.

 

1) UPDATE 이전 데이터

 

아래와 같은 테스트 코드를 통해 위 데이터를 update 해보겠다.

 

전처리 코드가 길어 핵심 코드만 긁어왔다.

 

수정사항이라고 적어둔 주석 밑의 Dto의 값들로 위 데이터를 변경한 모습은 아래와 같다.

 

2) UPDATE 이후 데이터

ID, seller값은 그대로고 name, price, category가 잘 변경된 것을 확인할 수 있다.

 

 

 

 

Comments