- Spring Transaction 12022년 09월 22일
- starryeye
- 작성자
- 2022.09.22.:44
트랜잭션을 공부하기 앞서..
순수 JDBC를 사용할 경우에 트랜잭션을 처리하는 법과
JPA를 사용할 경우에 트랜잭션을 처리하는 법에 대해
잠깐 복습해보자.
순수 JDBC 트랜잭션
Connection con = dataSource.getConnection(); try { con.setAutoCommit(false); //트랜잭션 시작 //비즈니스 로직 con.commit(); //비즈니스 로직 성공 시.. }catch(Exception e) { con.rollback(); //비즈니스 로직 실패 시.. throw new IllegalStateException(e); }finally { release(con); }
JPA 트랜잭션
//Entity 매니저 팩토리 생성 EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa"); //Entity 매니저 생성 EntityManager em = emf.createEntityManager(); //트랜잭션 기능 획득 EntityTransaction tx = em.getTransaction(); try { tx.begin(); //트랜잭션 시작 //비즈니스 로직 tx.commit(); //성공시 커밋 }catch(Exception e) { tx.rollback(); //실패시 롤백 }finally { em.close(); //Entity 매니저 종료 } emf.close(); //Entity 매니저 팩토리 종료
순수 JDBC 환경에서 JPA를 사용하는 환경으로 바꿔야 한다면..
트랜잭션을 사용하는 코드도 함께 변경해야한다...
이러한 문제를 위해 스프링은 트랜잭션 추상화를 제공한다.
-> PlatformTransactionManager 인터페이스
(DB 접근 기술에 따른 구현체도 모두 제공한다.)
-> Spring Boot는 어떤 데이터 접근 기술을 사용하는지를 자동으로 인식한다.
-> 적절한 트랜잭션 매니저를 선택해서 스프링 빈으로 등록해준다.
-> (그래서.. @Transaction 어노테이션만 적용해도 동작할 수 있다.)
PlatformTransactionManager는 이전 포스팅한 자료인 아래 링크를 참고해보자..
https://starryeye.tistory.com/47?category=1109600
JDBC 5
트랜잭션 여러개의 SQL 쿼리를 하나의 묶음 단위로 관리하겠다는 의미이다. 예를 들면, 돈을 이체 할때 A계좌에서는 돈이 빠져나가야 하며 B계좌에서는 돈이 들어와야한다. -> 다양한 원인의 장애
starryeye.tistory.com
PlatformTransactionManager를 사용하는 방법은 크게 2가지가 있다.
1. 선언적 트랜잭션
@Transaction 어노테이션을 사용한 방법이다.
(org.springframework.transaction.annotation.Transactional)
-> 실무에서는 선언적 트랜잭션 방식으로 주로 사용된다.
2. 프로그래밍 방식 트랜잭션
트랜잭션 매니저를 직접 사용하여 트랜잭션 코드를 직접 작성하는 방법이다.
-> Service 계층은 트랜잭션 기술 코드에 종속성이 생긴다.
(위에 java 코드로 포스팅한 2개의 코드가 여기에 해당)
다음으로 @Transaction 에 대해 알아보자
ElementType.TYPE 으로 클래스,인터페이스,enum 에 붙일 수 있으며,
ElementType.METHOD 로 메서드에 붙일 수 있다.
일단 어노테이션을 붙이면...
붙인 곳의 클래스에 트랜잭션이 적용되며..
해당 객체는 트랜잭션 AOP 적용의 대상이 되고,
실제 객체 대신에 트랜잭션을 처리해주는 프록시 객체가 스프링 빈에 등록된다.
따라서..
어떤 객체에 주입을 당할 때, 프록시 객체가 주입이 된다.
또한,
프록시 객체의 내부에서 실제 객체를 참조하게 된다.
아래 그림으로 다시 보자..
<참고>
프록시 객체는 @Transaction 이 적용된 클래스를 상속받아 만들어진다.
@Transaction 적용 우선 순위
1. 클래스의 메서드에 적용
2. 클래스에 적용
3. 인터페이스의 메서드에 적용
4. 인터페이스에 적용
(인터페이스에 @Transaction 을 적용할 경우 버전에 따라 적용 안될 경우도 있다.)
'Spring > DB, Cache 연동' 카테고리의 다른 글
Spring Transaction 3 (0) 2022.09.22 Spring Transaction 2 (0) 2022.09.22 JPA 찍먹 1 (1) 2022.09.09 MyBatis 1 (0) 2022.08.23 JdbcTemplate 1 (0) 2022.08.09 다음글이전글이전 글이 없습니다.댓글