@Transactional 정리
1. 트랜잭션의 성질
▶ 원자성(Atomicity)
- 한 트랜잭션 내에서 실행한 작업들은 하나로 간주한다. 즉, 모두 성공 또는 모두 실패.
▶ 일관성(Consistency)
- 트랜잭션은 일관성 있는 데이타베이스 상태를 유지한다. (data integrity 만족 등.)
▶ 격리성(Isolation)
- 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해야한다.
▶ 지속성(Durability)
- 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 한다.
2. 스프링에서 트랜잭션 처리 방법
스프링에서는 트랜잭션 처리를 지원하는데 그중 어노테이션 방식으로 @Transactional을 선언하여 사용하는 방법이 일반적이며, 선언적 트랜잭션이라 부른다.
클래스, 메서드위에 @Transactional 이 추가되면, 이 클래스에 트랜잭션 기능이 적용된 프록시 객체가 생성된다.
이 프록시 객체는 @Transactional이 포함된 메소드가 호출 될 경우, PlatformTransactionManager를 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit 또는 Rollback 한다.
2-1. 스프링부트에서 트랜잭션을 처리하는 방법들
1)
(1) DB연결 세션 생성 = JDBC 커넥션 생성 = DB에 쿼리문을 날릴수 있다는 말.
2)
JDBC 커넥션 생성과 종료 , 트랜잭션 시작과 종료 지점을 변경함으로서 DB의 부화를 줄여 첫번째 그림의 설계보다 더 개선 됨을 보여줄 수 있다.
하지만 이 역시 문제점이 있는데 service가 종료 되는 시점에서 영속성 컨텍스트를 종료하기에 controller에서 추가적인 객체의 접근이 불가능하다.
3) 스프링 JPA의 OSIV 전략
위의 설명 된 문제를 해결하기 위해서는 영속성 컨텍스트의 시작지점과, 종료시점을 controller 생성 종료시 관리하는 것이다. 즉,
- 세션의 시작은 서블릿이 시작되는 시점 부터~ (세션은 영속성 컨텍스트를 포함)
- 트랜잭션의 시작은 서비스 레이어부터, JDBC 커넥션도 이 시점부터.
- 트랜잭션의 종료는 서비스 계층에서 종료, JDBC 커넥션도 이 시점 부터 종료.
- 세션은 컨트롤러 영역까지 끌고 가기 때문에 영속성이 보장되어 select가 가능해진다.(update,delete,insert는 트랜잭션이 종료되어 불가능 하다.)
그런데 이 방법에서 두가지로 추가적으로 나누어 지는데,
spring boot의 yml 설정시 open-in-view 의 T/F 여부이다.
True = lazy , False = Eager 전략으로 나누어 진다.
jpa:
open-in-view: true
- open-in-view: flase, 즉 Eager 모드일 때는, DB에서 특정 Entity를 영속성 컨텍스트의 1차 캐시로 객체로 가져올 때 FK로 연결된 Entity도 함께 가져와 객체화 시킨다.
예시 ) fetch = FetchType.EAGER
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER ) private List<Reply> reply; //board에 연결된 Reply의 Table의 값을 영속성 컨텍스에 함께 객체화 시킨다는 의미
- open-in-view: true, 즉 lazy 모드일 때는, DB에서 특정 Entity를 영속성 컨텍스트의 1차 캐시로 객체로 가져올 때 Entity의 FK로 연결된 Entity 데이터는 가져오지 않고 FK의 프록시만 형성 시킨다. 그래서 만약 추후에 FK Entity의 접근이 있으면 JDBC가 연결되어 있으면 그냥 테이블에 접근하여 가져오고 연결되지 않아있으면 JDBC를 일시적으로 연결하고 데이터를 가져온 다음 연결을 종료한다.
참고자료
https://goddaehee.tistory.com/167
https://www.youtube.com/watch?v=fSXh4hWJtKo&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=45
Author And Source
이 문제에 관하여(@Transactional 정리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tsi0521/Transactional-정리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)