ex) 멀티 태스킹 - 우리는 문서를 작성하면서 노래를 듣고 동시에 여러가지 일을 하고 있는 것처럼 보이지만, 프로세스는 독립적인 task들을 번갈아가면서 실행하고 있는 것
ex) DB가 종료되어도 데이터는 물리적인 저장소에 계속 저장되어 있어야 한다.
선언형 트랜잭션 방식
1-1) 애너테이션 사용
1-2) AOP 방식 사용
프로그래밍 코드 베이스 트랜잭션 방식 -> 트랜잭션은 AOP이기 때문에 해당 방식은 적절하지 않다.
트랜잭션 방식은 두 가지가 있지만, 선언형 트랜잭션 방식을 사용해볼 것이다!
PlatformTransactionManager
인터페이스에 의해 관리된다.PlatformTransactionManager
의 구현 클래스인 JpaTransactionManager
를 사용한다.@Transactional
애너테이션을 트랜잭션이 필요한 영역에 추가한다.
클래스 레벨에 추가하면, 모든 메서드에 트랜잭션이 적용된다.
@Transactional
의 우선 순위는 "메소드 > 클래스"이다.
@Transactional
이 클래스와 메소드 모두에 적용된 경우, 메서드 레벨의 @Transactional
이 적용된다.조회 메서드에는 @Transactional(readOnly = true)
를 붙인다.
💡 조회 메서드에
@Transactional(readOnly = true)
로 설정하는 이유
커밋은 하나의 트랜잭션을 종료하는 것이므로@Transactional(readOnly = true)
로 설정해도 커밋은 진행된다.
하지만 커밋 내부의 flush는 작동하지 않는다.
즉@Transactional(readOnly = true)
로 설정하면 커밋은 flush 처리를 하지 않고, 스냅샷도 생성하지 않아 불필요한 동작을 줄이게 된다.
* flush : 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것
✅ 조회 메서드에는readOnly = true
속성을 주어, JPA가 성능 최적화 과정을 거치도록 해야한다.
@Transactional
을 사용하면, 트랜잭션 종료 시점에 자동으로 commit이 발생한다.Repository.save()
를 하지 않아도 내부적으로 처리된다.