다른 서버에서 DB 업데이트시 캐시에 있는 엔티티는 어떻게 될까요?
2943
작성한 질문수 3
find시에 캐시를 먼저 뒤져서 있다면 재사용한다고 하셨는데요
다른 서버에서 해당 DB 값을 바꾼다면 이런것도 dirty checking해주나요?
이런 케이스에서는 캐시를 업데이트 해야 할 것 같은데요?
답변 1
36
안녕하세요. jdkjfkd fjfjdk님 좋은 질문입니다.
find에서 조회하는 캐시는 정확히는 영속성 컨텍스트, 또는 1차 캐시라고 합니다. 이 캐시는 우리가 일반적으로 말하는 애플리케이션 전체에서 공유하는 캐시가 아니라, 해당 트랜잭션의 시작과 끝에서만 짧게 유지되는 캐시입니다. 쉽게 이야기하면 특정 한 유저의 API 호출의 시작과 끝 사이에서 그 유저에게만 유지되는 짧은 캐시입니다. (설명을 돕기위해 유저라고 설명했지만 정확히는 트랜잭션을 시작할 때 생성되고, 트랜잭션이 끝날때 지워지는 캐시 입니다.)
그래서 같은 트랜잭션 안에서 같은 엔티티를 조회할 때만 캐시가 히트됩니다. (그래서 실무에서 이 1차 캐시로 성능 이득을 얻는 일은 많지 않습니다.)
다음으로 변경에 대한 부분을 설명드릴께요 :)
앞서 설명드린대로 트랜잭션 안에서만 캐시가 유효범위를 가지기 때문에, DB에 맞추어 캐시를 업데이트 하거나 더티 채킹을 하지 않습니다. 그리고 한다고 해도 다음에 설명드릴 내용 때문에 정확하게 맞출 수 도 없습니다.
예를 들어서 JPA를 사용하지 않고 자바로 직접 SQL을 사용한다고 가정하겠습니다. SQL로 상품 정보를 조회했는데 조회 당시 가격이 5000원인 것을 확인하고, 내가 그 가격에 500원을 더해서 정확히 5500원을 만들고 싶었는데, 중간에 누군가 가격은 6000원으로 변경해버리면 어떻게 해야할까요? 중간에 체크하는 로직을 넣으면 가능할 것 도 같지만, 체크를 통과하는 시점의 미묘한 지점에 누군가 6000원으로 변경해버릴 수도 있습니다. 결론적으로 이런 문제는 SQL을 직접 사용해도 락을 걸지 않는 이상 단순하게 해결이 안됩니다.
JPA는 데이터베이스가 제공하는 락 기능을 적극 제공하고, 추가로 더 나아가서 낙관적 락이라는 기능도 제공합니다.
이 부분을 설명드리면 좋겠지만, 책에서도 수십 Page로 풀어서 설명을 해야 하는 부분이어서, 자세한 내용은 JPA 책 16장 트랜잭션과 락, 2차 캐시 부분을 읽어보시길 권장드립니다^^
감사합니다.
0
로우 락을 거는 DBMS에서는 직접 SQL을 사용해 트랜잭션을 진행하면 로우 락으로 인한 성능 저하가 발생할 수 있지만
JPA를 사용하면 애플리케이션 레벨에서 트랜잭션을 진행해 X 락을 걸지 않고 엔티티를 수정한 후 낙관적 락으로 변경 사항을 적용할지 말지 정한다로 이해할 수 있을까요?
1
안녕하세요. acisliver님
JPA를 사용해도 X락을 걸거나 또는 낙관적 락을 사용하도록 선택을 해야 합니다.
자세한 내용은 JPA 책 16장 트랜잭션과 락, 2차 캐시 부분을 읽어보시길 권장드립니다^^
Entity 동등성 비교
0
10
1
실무 조언 관련 질문입니다.
0
41
1
H2데이터베이스 파일 생성
0
51
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
49
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
48
1
JPQL 메소드와 락
0
52
1
Delivery @OneToOne
0
57
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
89
2
UnsupportedOperationException 발생
0
82
3
H2 Database 연결이 안됩니다.
0
89
2
연관관계 매핑 질문드립니다.
0
82
2
h2데이터베이스 실행오류
0
105
2
persistence.xml
0
103
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
77
1
영속성 컨텍스트
0
62
1
JPA 프록시
0
90
1
Native Query와 MyBatis
0
63
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
83
1
임베디드 타입 예시 코드 관련 질문
0
112
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
90
3
인텔리제이 패키지 커서 단축키 질문
0
106
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
136
1
양방향 연관관계 시 연관관계 주인을 설정하는 이유
0
68
1
임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.
0
95
1





