▶ 원자성(Atomicity)
▶ 일관성(Consistency)
▶ 격리성(Isolation)
▶ 지속성(Durability)
스프링에서는 트랜잭션 처리를 지원하는데 그중 어노테이션 방식으로 @Transactional을 선언하여 사용하는 방법이 일반적이며, 선언적 트랜잭션이라 부른다.
클래스, 메서드위에 @Transactional 이 추가되면, 이 클래스에 트랜잭션 기능이 적용된 프록시 객체가 생성된다.
이 프록시 객체는 @Transactional이 포함된 메소드가 호출 될 경우, PlatformTransactionManager를 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit 또는 Rollback 한다.
(1) DB연결 세션 생성 = JDBC 커넥션 생성 = DB에 쿼리문을 날릴수 있다는 말.
JDBC 커넥션 생성과 종료 , 트랜잭션 시작과 종료 지점을 변경함으로서 DB의 부화를 줄여 첫번째 그림의 설계보다 더 개선 됨을 보여줄 수 있다.
하지만 이 역시 문제점이 있는데 service가 종료 되는 시점에서 영속성 컨텍스트를 종료하기에 controller에서 추가적인 객체의 접근이 불가능하다.
위의 설명 된 문제를 해결하기 위해서는 영속성 컨텍스트의 시작지점과, 종료시점을 controller 생성 종료시 관리하는 것이다. 즉,
그런데 이 방법에서 두가지로 추가적으로 나누어 지는데,
spring boot의 yml 설정시 open-in-view 의 T/F 여부이다.
True = lazy , False = Eager 전략으로 나누어 진다.
jpa:
open-in-view: true
예시 ) fetch = FetchType.EAGER
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER ) private List<Reply> reply; //board에 연결된 Reply의 Table의 값을 영속성 컨텍스에 함께 객체화 시킨다는 의미
https://goddaehee.tistory.com/167
https://www.youtube.com/watch?v=fSXh4hWJtKo&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm&index=45