https://www.inflearn.com/course/스프링-db-1
스프링과 문제 해결 - 트랜잭션
문제점들
- mapper vs repository
- 서비스 계층을 특정 기술에 종속적이지 않게 개발해야 한다.
- 컨트롤러에서 UI 변경점 해결 가능하도록, Repository 에서만 데이터 접근기술 해결하도록 진행 - 서비스 계층은 가급적 비즈니스 로직만 구현하고 특정 구현 기술에 직접 의존해서는 안된다.
- JDBC 구현 기술이 서비스 계층에 누수되는 문제
- 데이터 접근 계층에 JDBC 코드에 다 몰아두는것이다.
- 서비스 계층은 특정 기술에 종속되지 않아야 한다.
트랜잭션을 적용하면서 결국 서비스 계층에 JDBC 구현 기술의 누수가 발생했다. - SQLException 이 서비스 단에 있으면 결국 DB에 종속하는 것이라 문제가 있는 것이다.
트랜잭션 추상화
- 구현 기술마다 트랜잭션 시작이 다름
- jdbc : setautocommit
- jpa : transaction.begins - 트랜잭션 추상화 인터페이스 : begin, commit, rollback
- JpaTxManager, JdbcTxManager 를 의존성 주입받으며 상황에 따라 변경하여 사용
- platformTxManager 가 인터페이스 이며 이걸 구현한게 많다.
(jpa, jdbc, 하이버네이트, 기타)
트랜잭션 동기화
- 트랜잭션 매니저는 트랜잭션 추상화 및 리소스 동기화를 진행함
- 리소스 동기화
- 트랜잭션을 유지하려면 트랜잭션의 시작부터 끝까지 같은 데이터베이스 커넥션을 유지해야 한다. - 스프링은 트랜잭션 동기화 매니저를 제공한다.
- 쓰레드 로컬을 사용해서 커넥션을 동기화 해준다.
- 트랜잭션 동기화 매니저는 트랜잭션 매니저로 부터 커넥션을 가져와 보관함
-> TransactionSynchronizationManager
트랜잭션 문제 해결 - 트랜잭션 매니저1
- 트랜잭션 동기화 매니저가 관리하는 커넥션이 있으면 해당 커넥션을 반환한다.
- 트랜잭션 동기화 매니저가 관리하는 커넥션이 없는 경우 새로운 커넥션을 생성한다.
- DatasourceUtils를 통해 트랜잭션 종료시, 트랜잭션을 사용하기 위해 동기화된 커넥션은 커넥션을 닫지 않고 그대로 유지
트랜잭션 문제 해결 - 트랜잭션 매니저2
- 데이터 접근 계층에서 DatasourceUtils 에서 커넥션을 가져오는데,
이것인 트랜잭션동기화매니저를 통해 가져오는것이 된다.
-> 즉 서비스 계층과 데이터 접근 계층은 트랜잭션동기화 매니저를 통해 커낵션을 공유하게된다. (쓰레드 로컬 기준으로 판별)
트랜잭션 문제 해결 - 트랜잭션 템플릿
- 템플릿 콜백 패턴을 활용하여 반복문제를 해결한다.
-> 스프링이 TransactionTemplate 이라는 편리한 기능을 제공함
트랜잭션 문제 해결 - 트랜잭션 AOP 이해
- 프록시를 통한 문제해결
- 프록시를 사용하면 트랜잭션을 처리하는 객체와 비즈니스 로직을 처리하는 서비스 객체를 명확하게 분리할 수 있다. - 스프링이 제공하는 트랜잭션 AOP
- 스프링이 제공하는 AOP 기능을 사용하면 프록시를 매우 편리하게 적용할 수 있다.
트랜잭션 문제 해결 - 트랜잭션 AOP 적용
- 스프링 AOP 를 사용하려면 스프링 컨테이너를 사용해야 한다.
- 스프링이 제공하는 AOP 는 스프링에 등록된 트랜잭션 매니저를 찾아가기 때문에 컨테이너 환경을 사용해야함
트랜잭션 AOP 정리
- 선언적 트랜잭션 관리 vs 프로그래밍 방식 트랜잭션 관리
스프링 부트의 자동 리소스 등록
- 기존에는 데이터소스와 트랜잭션 매니저를 직접 스프링 빈으로 등록해야 함
- 개발자가 직접 데이터소스를 빈으로 등록하면 스프링 부트는 데이터소스를 자동으로 등록하지 않음
- application.properties 에 있는 속성을 사용해서 dataSource를 생성
- 속성이 없으면 내장 DB를 사용하려고 한다. - 스프링 부트는 적절한 트랜잭션 매니저 를 자동으로 스프링 빈에 등록한다.
- 어떤 트랜잭션 매니저를 선택할지는 현재 등록된 라이브러리를 보고 판단한다.
- jpaTxManager가 JDBCTx도 커버 가능하긴 한다.
'Spring' 카테고리의 다른 글
[Spring] 스프링 DB 1편 - 데이터 접근 핵심 원리 - 5 (0) | 2022.10.30 |
---|---|
[Spring] 스프링 DB 1편 - 데이터 접근 핵심 원리 - 4 (0) | 2022.10.28 |
[Spring] 스프링 DB 1편 - 데이터 접근 핵심 원리 - 2 (0) | 2022.09.18 |
[Spring] 스프링 DB 1편 - 데이터 접근 핵심 원리 - 1 (0) | 2022.06.06 |
[Spring] ThymeLeaf 정리 - 1 (0) | 2021.11.22 |