[Spring Boot] Transaction

Spring 실행 순서

  1. Tomcat 시작 → 서버 작동
  2. web.xml
  3. 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 이 가능

좋은 웹페이지 즐겨찾기