티스토리 뷰
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
@Lock
@Lock(LockModeType.PESSIMISTIC_WRITE)
Member findLockByUsername(String username);
Lock은 업데이트가 불가하게 하는 것은 아니고, 어떤 고객이 먼저 select해서 사용하고 있다면 업데이트가 되기 전까지 다른 고객의 접근을 차단하게 되면 방식이라한다. sql에는 select절 마지막에 for update가 붙는다(어떤 db방언이냐에 따라 달라질 수도 있을 것 같다)
관련된 내용은 다음 블로그를 참고하는 것이 좋을 것 같다.
@Lock 과 for update에 대한 참고 블로그
'dev_공부일지 > spring data JPA' 카테고리의 다른 글
Auditing (등록일, 수정일, 등록자, 수정자 공통 관리) (0) | 2024.03.06 |
---|---|
확장 기능 - 사용자 정의 레퍼지토리 (0) | 2024.03.06 |
@EntityGraph (0) | 2024.03.06 |
벌크성 수정 쿼리 (0) | 2024.03.05 |
변환 타입 (중요, null체크) , 페이징과 정렬 (0) | 2024.03.05 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 인터셉터
- ArgumentResolver
- thymleaf
- 로그인
- SpringBoot
- rejectValue
- react실행
- 항해플러스
- BindingResult
- 스프링공부
- 리터럴
- JPA
- 향해플러스
- 백엔드 개발자 공부
- Java
- Intercepter
- 스프링부트
- exception
- React
- filter
- hypertexttransferprotocol
- jpa api
- 컨트
- 항해99
- 백엔드 개발자 역량
- reject
- 예외처리
- 향해플러스백엔드
- HTTP
- 향해99
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함