티스토리 뷰

JPA 쿼리 힌트 (SQL 힌트가 아니라 JPA 구현체에게 제공하는 힌트)

 

    @Test
    public void queryHint(){
        Member member = new Member("member1", 10);
        memberRepository.save(member);

        em.flush();
        em.clear();

        Member findMember = memberRepository.findById(member.getId()).get();

        findMember.setUsername("member2");

        em.flush();
        
    }

 

만약 이런 식의 코드가 있다면 현재 변경감지가 일어나서 setUsername이 변경되었을 것이다.

만약에 업데이트(수정)을 하지 않는다고 해도 조회시에 변경감지를 위해 어딘가에 원본을 놔두게 된다.

즉 변경하지 않아도 업데이트를 위한 메모리 소모가 있다는 것이다.

 

 

 

@QueryHints 사용

    @QueryHints(value=@QueryHint(name="org.hibernate.readOnly" , value = "true"))
    Member findReadOnlyByUsername(String username);

 

이렇게 추가해서 사용하면 오직 '조회'용으로만 데이터를 불러오기 때문에 JPA가 수정을 위한 스냅샷을 만들지 않는다.

만약 조회만 필요하다면 이렇게 사용해도 좋을 것이다. (하지만 안해도 성능은 잘나온다고 한다..???? 큰 서비스일 경우에는 필요할 듯..)

 

스냅샷 이란? 참고 블로그 : https://goneoneill.tistory.com/35

 

JPA 영속성 컨텍스트 내부동작

1.엔티티 매니저 팩토리와 엔티티매니저 웹 어플리케이션을 개발 한다고 하면 고객의 요청이 올때마다 entityManager를 생성하고 이 엔티티매니저는 내부적으로 db 커넥션을 맺는다 2.그러면 영속성

goneoneill.tistory.com

혹시 모를 스냅샷에 대한 설명

 

 

 

@Lock

    @Lock(LockModeType.PESSIMISTIC_WRITE)
    Member findLockByUsername(String username);

 

Lock은 업데이트가 불가하게 하는 것은 아니고, 어떤 고객이 먼저 select해서 사용하고 있다면 업데이트가 되기 전까지 다른 고객의 접근을 차단하게 되면 방식이라한다. sql에는 select절 마지막에 for update가 붙는다(어떤 db방언이냐에 따라 달라질 수도 있을 것 같다)

 

관련된 내용은 다음 블로그를 참고하는 것이 좋을 것 같다.

 

 

@Lock 과 for update에 대한 참고 블로그

https://dololak.tistory.com/446

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함