JPA를 쓰면 뭐가 좋을까

searchortype·2022년 7월 15일
1
post-thumbnail

이 글에서는 왜 jpa를 쓰면 좋은 것인지 다루어 보려고 한다.
jpa에서 가장 큰 장점을 꼽자면 영속성컨텍스트가 아닐까.

database 격리 수준이 높다는 것

여러 트랜젝션을 동시에 처리하는 상황에서 격리수준에 따라 다른 트랜젝션에게 보여주는 데이터 노출의 정도가 다르다. 격리수준이 높아질수록 다른 트랜젝션에 노출데이터 고립수준은 높아지고 동시성이 떨어진다. 격리수준이 높을 수록 다른 트랜젝션에게 데이터 노출을 줄여야하기 때문에 어떤 데이터베이스에서는 격리수준에 따라 레코드에 락(lock)을 걸기도 한다. 이는 데이터 무결성을 보장하지만 데이터베이스의 성능을 떨어뜨린다.


영속성컨텍스트는 1차 캐시로 REPEATABLE_READ 격리 수준을 애플리케이션 차원에서 제공해준다

영속성컨텍스트는 1차 캐시로 REPEATABLE_READ 격리 수준을 애플리케이션 차원에서 제공해준다. 영속성 컨텍스트의 1차 캐시는 하나의 트랜젝션이 지속되는 동안 이전에 사용했던 쿼리의 결과값을 저장해두었다가 같은 쿼리요청이 왔을 때 저장해 놓은 결과값을 돌려준다. 이는 트랜젝션 격리수준 중 하나인 REPEATABLE READ의 격리수준과 동일하다. (REPEATABLE READ는 하나의 트랜젝션 작업 중 읽어온 데이터를 다시 조회했을 때도 같은 데이터를 읽는 것을 보장하는 격리수준을 말한다.)
앞선 설명처럼 jpa를 사용하면 이 역할을 데이터베이스 차원에서 제공하는 것이 아니라, 애플리케이션에서 제공한다. REPEATABLE READ는 데이터베이스의 구현에 따라서 락을 걸수도 있는데 이 역할을 애플리케이션차원에서 제공함으로서 데이터베이스의 성능을 높일 수 있다.


영속성컨텍스트는 transactional한 쓰기 지연을 제공한다

transactional한 쓰기 지연이라는 것은 예를 들어 어떤 내용을 수정한다고 했을 때, 어떤 엔티티의 내용을 조회한 내용을 영속성 컨텍스트로 가져와서 영속성 컨텍스트 안에서 수정을 한다. 작업이 다 끝났을 때, flush를 하냐 안하냐에 따라서 영속성컨텍스트에서 했던 작업이 다 날아가거나 날아가지 않고 쓰여진다. (all or nothing) 영속성 컨테스트에서 한 작업들을 commit하기 전까지 데이터베이스 테이블 row에 락이 걸리지 않는다. 데이터베이스에 락이 걸리는 시간을 줄였기 때문에 데이터베이스의 전반적인 성능이 올라간다.

0개의 댓글