[Spring Boot] Transaction
Spring 실행 순서
- Tomcat 시작 → 서버 작동
- web.xml
- context.xml → DB 연결 테스트
Spring 2.0 미만 버전 Transaction 동작
1. 송금 요청(request)
▶️ web.xml
1. DB 연결 세션 생성 (JDBC)
2. transaction 시작
3. 영속성 컨텍스트 시작(생성)
▶️ Servlet filter
▶️ 요청 분기 (Controller)
▶️ 송금 (Service)
▶️ **Update 로직 (repo)**
*in 영속성 컨텍스트*
- A Select & B Select (JPA)
- DB 를 통해서 응답 받아서 변경 (객체의 값) → Controller 로 돌아감
1. JDBC connection 종료
2. Controller 에서 Data(json)으로 응답
3. transaction 종료 (`commit`)
▶️ 영속성 컨텍스트 데이터 변경 감지하여 DB를 `**flush**`, 실제 DB 에 업데이트 해줌, 영속성 컨텍스트 종료
▶️ DB 연결 섹션 종료
> 기존 Spring boot 의 문제점
→ Transaction 종료가 늦음
→ JDBC Connection, Transaction 시작이 빠름
Spring 2.0 Transaction 동작
1. 송금 요청(request)
▶️ web.xml
1. 영속성 컨텍스트 시작(생성)
▶️ Servlet filter
▶️ 요청 분기 (**Controller**)
1. DB 연결 세션 생성
2. transaction 시작
3. JDBC 시작
▶️ 송금 (**Service**)
▶️ Update 로직 (repo 접근)**
*in 영속성 컨텍스트 (1차캐시가 없으면 DB 접근)*
- A Select & B Select (JPA)
- DB 를 통해서 응답 받아서 변경 (객체의 값) → Service 로 값 전달
▶️ Controller 에서 Data(json)으로 응답 → Service 종료
1. 영속성 컨텍스트 데이터 변경 감지하여 DB를 `**flush**`, 실제 DB 에 업데이트 해줌
2. JDBC connection 종료
3. transaction 종료 (`commit`)
4. DB 연결 섹션 종료
▶️ Controller 종료
1. 영속성 컨텍스트 종료
* 프록시에 접근하는경우 DB connection 을 다시 연결하여 값을 **select** 해서 가져오고, 연결을 종료
→ Transaction을 시작하지 않기 때문에 DB에 값을 변경하는 **update** 는 안됨
@ManyToOne(fetch = FetchType. )
- EAGER
→ DataBase 에서 바로 가져옴- LAZY : 지연 로딩
→ Database에서 바로 안들고 옴 (1차 캐시 존재 안함)
연결된 객체를 프록시로 연결하여 가져옴 [Persistence 상태 유지]
영속성을 프리젠테이션 계층까지 가져갈 수 있음
✔️정리
- Transaction 세션의 시작은 Servlet이 시작되는 시점 부터 (영속성 컨텍스트 포함)
- Transaction 의 시작은 서비스 계층 부터 (JDBC connection 도 시작)
- Transaction의 종료는 서비스 계층에서 종료 (JDBC connection 도 종료)
- 세션은 Controller 영역까지 끌고가기 때문에 영속성이 보장되어
select
가 가능해지고 LAZY_Loading 이 가능
Author And Source
이 문제에 관하여([Spring Boot] Transaction), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yewon/Spring-Boot-Transaction저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)