Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 고아객체
- 관계형 데이터베이스
- 영속성 컨텍스트
- Flush
- relational database
- DB
- Amortized Analysis
- DiscriminatorValue
- 영속성전이
- 플러시
- 즉시로딩
- JPA
- 엔티티 매핑
- Algorithm
- DiscriminatorColumn
- 정렬
- 지연로딩
- relational DB
- commit
- Spring Data JPA
- 값타입
- Spring
- 페치조인
- ROLLBACK
- Embeddable
- MappedSuperclass
- 분할상환분석
- n+1문제
- 순수jpa
- fetch join
Archives
- Today
- Total
Jun's note
직접 JPQL로 update문을 수행하면 안되는 이유 본문
728x90
JPQL은 1차캐시를 확인하지 않고 바로 DB에 쿼리문을 날린다.
JPA의 큰 장점에는 1차캐시와 변경감지 기능이 있었다.
우리가 값을 조회할때 먼저 DB를 확인하지 않고 1차캐시부터 확인한다. 1차캐시에 찾던 값이 존재하면 1차캐시만 확인하고, 1차캐시에 없을 경우에 DB를 조회한다.
만약 직접 JPQL로 update문을 수행하면 어떤일이 일어날까?
1. JPQL 수행
2. 트랜잭션이 커밋되면, 쿼리문이 DB에 반영된다. (DB에는 변경된 값이 업데이트됨)
이 때, 값을 조회하면 (1차캐시에 있는)
3. 1차캐시를 확인하여 값을 넘겨준다.
4. 넘겨받은 값은 수정안된 값이었다. -> 문제발생
문제점: JPQL로 직접 update했기때문에 1차캐시랑 DB에 저장된 값이 서로 다른 상황
만약 1차캐시에 없던 값을 조회했으면, 1차캐시에 값이 없기때문에 DB를 조회해서 변경된 값이 1차캐시에 반영되었을것이다.
결론: 직접 JPQL로 update문을 수행하지말자
추가로, 값을 변경하고 싶을때는 영속상태인 엔티티의 필드를 변경하여 알아서 jpa가 변경감지하도록 구현해야한다. (영속상태인 엔티티: 레파지토리를 통해 조회한 값을 의미)
JPQL을 통해 직접 조회할경우 과정 (select문)
1. DB에서 직접 값을 조회
2. 조회한 값이 1차캐시에 존재할경우, DB에서 조회한 값을 버리고 1차캐시에 존재하는 값을 반환
'Programming > JPA' 카테고리의 다른 글
[JPA] 페치조인 (fetch join) , n+1문제 (0) | 2022.01.24 |
---|---|
[JPA] 값 타입 (기본값 타입, 임베디드 타입, 컬렉션 값 타입) (0) | 2022.01.24 |
[JPA] 영속성 전이(CASCADE)와 고아 객체 (0) | 2022.01.23 |
[JPA] 프록시(Proxy), 지연로딩(LAZY)와 즉시로딩(EAGER) (0) | 2022.01.23 |
[JPA] 상속관계매핑, @MappedSuperclass (0) | 2022.01.14 |
Comments