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 |
Tags
- tasklet
- cloud native
- SpringBoot
- REACT
- JavaScript
- UsernamePasswordAuthenticationFilter
- AuthenticatoinProvide
- stopPropogation
- gradle
- cheerio
- Spring REST Docs
- Filter
- Pender
- Reduxpender
- MFA
- Flyway
- Spring Security
- Crawling
- preventdefault
- MSA
- T-OTP
- OpenStack
- vue
- openapi3
- SWAGGER
- vuejs
- Spring Batch
- axios
- SpringRESTDocs
- 리액트
Archives
- Today
- Total
Miracle Morning, LHWN
7. 트랜잭션 본문
트랜잭션 범위의 영속성 컨텍스트
# 스프링 컨테이너의 기본 전략
- 동일 트랜잭션엔 동일 영속성 컨텍스트를 사용한다.
- 트랜잭션이 다르면 영속성 컨텍스트도 다르다.
# 트랜잭션 종료 이후 지연로딩 속성에 접근할 경우?
(1) 뷰가 필요한 엔티티를 미리 로딩하는 방법
- 글로벌 페치 전략 수정
- 사용하지 않는 엔티티를 로딩
- N + 1 문제 발생
- JPQL 페치 조인
- 무분별한 사용 시 리포지토리 메서드가 증가한다. →프리젠테이션 계층이 데이터 접근 계층을 침범한다.
- 강제 초기화
- 프록시 초기화 역할을 서비스 계층이 담당하면 뷰가 필요한 엔티티에 따라 서비스 계층의 로직을 변경해야 한다. →프리젠테이션 계층이 서비스 계층을 침범한다.
- FACADE 계층 추가
(2) OSIV 를 사용하여 엔티티를 항상 영속 상태로 유지하는 방법
- Open Session In View : 영속성 컨텍스트를 뷰까지 열어둔다.
- 클라이언트의 요청이 들어올 때 영속성 컨텍스트를 생성해서 요청이 끝날때까지 컨텍스트를 유지한다.
- 엔티티 수정은 트랜잭션이 있는 계층에서만 동작한다.
# 롤백 시 주의사항 - 트랜잭션 종료 이후 지연로딩 속성에 접근할 경우?
- 트랜잭션 롤백은 DB의 반영사항만을 롤백하는 것이다. 수정한 엔티티까지 원상태로 복구해주지 않는다.
- 트랜잭션이 롤백된 경우 영속성 컨텍스트를 그대로 사용하는 것은 위험하다. 새로운 영속성 컨텍스트를 생성하거나 EntityManager.clear() 를 호출하여 초기화 한다.
# 트랜잭션은 원자성, 일관성, 격리성, 지속성을 보장해야한다.
- 낙관적 락 : 트랜잭션 대부분 충돌이 발생하지 않는다고 가정하고 락을 사용하는 것
- 비관적 락 : 트랜잭션 대부분 충돌이 발생한다고 가정하고 락을 사용하는 것
※ 락을 잡고 데이터를 수정했을 경우 생기는 문제점? "두 번 갱신 문제"
→ 해결방법
(1) 마지막 커밋만 인정
(2) 최초 커밋만 인정
(3) 갱신 내용 병함
(4) @Version 컬럼
(5) JPA 락 사용
※ N+1 문제는 JPA 사용 시 성능 저하에 가장 큰 요인 중 하나이므로 주의를 요한다.
→ 페치 조인을 사용함으로써 해결한다.
'IT 기술 > [JAVA] Spring Boot' 카테고리의 다른 글
9. int 와 Integer 의 차이 (0) | 2021.05.10 |
---|---|
8-1. 프로젝트에서 JPA 직접 사용해보기 (0) | 2021.05.08 |
6. Spring Data JPA (0) | 2021.05.06 |
5. 객체지향 쿼리언어_2 (0) | 2021.05.06 |
4. 객체지향 쿼리언어_1 (0) | 2021.05.06 |
Comments