JPA Hint
개념
JPA Hint는 JPA의 구현체, 예를 들어 Hibernate에게 제공하는 힌트다.
이는 SQL 자체에 대한 힌트가 아니라, JPA 구현체에 특정 동작을 요구하는 힌트이다.
JPA는 기본적으로 Entity를 조회해와서 값을 변경하면 Dirty Checking이 일어나고 트랜잭션 커밋 시점에 이를 DB에 반영한다.
만약 값을 바꿔서 화면에 뿌려주는데 DB에는 반영하기 싫을 땐 어떡할까?
JPA는 이러한 기능을 제공하지 않지만 Hibernate는 이를 제공한다. 그렇기 때문에 JPA Hint를 사용한다.
// JpaRepository
@QueryHints(value =
@QueryHint(name = "org.hibernate.readOnly", value = "true"))
Member findReadOnlyByUsername(String username);
// 실제 비즈니스 사용위치
Member findMember = memberRepository.findReadOnlyByUsername("userA");
findMember.setUsername("member2");
실제 사용할때 JPA가 이는 readOnly이기 때문에 영속성 컨텍스트 내의 1차캐시 안에서 스냅샷을 생성하지 않는다.
다만 최적화하기 위해서 다음과같이 한다고해서 큰 차이가 아닌 미미한 성능향상이 있다. 아주 조금의 튜닝효과가 있다.
Lock
비관적 락(Pessimistic Lock)
비관적 락은 데이터가 동시에 수정되는 것을 방지하기 위해 데이터에 락을 걸어 다른 트랜잭션이 해당 데이터를 수정하거나 읽는 것을 제한하는 방법이다.
@Lock(LockModeType.PESSIMISTIC_WRITE)
List<Member> findLockByUsername(String username);
이 예시에서 findLockByUsername 메서드에 @Lock 어노테이션을 적용하면, 해당 메서드 실행 중에는 지정된 락 모드(PESSIMISTIC_WRITE)에 따라 데이터에 락이 걸린다.
LockModeType.PESSIMISTIC_WRITE의 특징
읽기와 쓰기 차단: 다른 트랜잭션이 해당 데이터를 읽거나 쓰는 것을 차단한다.
데이터 일관성 유지: 여러 트랜잭션이 동시에 같은 데이터를 수정하는 상황에서 데이터의 일관성을 유지할 수 있다.
데드락 주의: 비관적 락은 데드락을 일으킬 가능성이 있으므로 사용 시 주의가 필요하다.
이 메서드를 호출하는 동안 해당 엔티티들은 다른 트랜잭션에 의해 수정될 수 없다.
하지만 트래픽이 많은 환경에서 이 방법을 사용하는 것은 위험할 수 있으며, 정말 중요한 데이터를 보호해야 할 때만 사용하는 것이 좋다.
'JPA > Spring Data JPA' 카테고리의 다른 글
[Spring Data JPA] 7. BaseEntity (1) | 2023.11.24 |
---|---|
[Spring Data JPA] 6. 사용자 정의 Repository. DI 활용 (0) | 2023.11.24 |
[Spring Data JPA] 4. @EntityGraph (0) | 2023.11.23 |
[Spring Data JPA] 3. 벌크성 수정 쿼리 (0) | 2023.11.23 |
[Spring Data JPA] 2. Spring Data JPA Paging (0) | 2023.11.23 |