1. 서비스 계층의 분리 - 비지니스 로직의 분리
계층 | 설명 | |
Controller ( @Controller ) |
Presentation Layer Spring MVC에서 사용자 요청을 받아 흐름을 제어. |
|
DAO ( @Service ) |
Business Layer 트렌잭션 적용하기 적합 서비스 계층은 여러 컨트롤러에서 재사용 가능한 서비스를 제공하여 프레젠테이션 계층과 데이터 액세스 계층 간의 중재자 역할 (데이터 유효성 검사, 데이터 조작 및 데이터 처리와 같은 애플리케이션의 비즈니스 논리 구현을 담당) |
|
DAO ( @Repository ) |
Persistance Layer DB에 접근해서 DB를 다룸. |
2. Transaction Manager란?
DAO의 각 메서드는 개별 Connection을 사용. 그런데, 트랜잭션은 1개의 Connection에서 이루져야함.
( why? 에러시 rollback처리해야하는데 개별이면 바로 commit하기에 불가능)
이 문제를 해결하기 위해 나온게 Transaction Manager
3. TransactionManager로 Transaction 적용하기
4. @Transactional : AOP를 이용한 핵심기능과 부가기능의 분리
※ @Transactional은 클래스나 인터페이스에도 붙일 수 있다. (즉 모든메서드에 적용 )
TransactionManager 직접생성
TransactionManager를 bean으로 등록 (root-context.xml)
5. @Transactional의 속성
속성 | 설명 | |
propagation | Tx의 경계 (boundary)를 설정하는 방법을 지정 | |
isolation | Tx의 isolation level을 지정. DEFAULT, READ_UNCOMMTIED, READ_COMMITTED, REPEATEABLE_READ, SERIALIZABLE |
|
readOnly | Tx이 데이터를 읽기만 하는경우, true로 지정하면 성능이 향상 | |
rollbackFor | 지정된 예외가 발생하면, Tx을 rollback RuntimeException과 Error는 자동 rollback |
|
noRollbackFor | 지정된 예외가 발생해도, Tx을 rollback하지 않음 | |
timeout | 지정된 시간(초) 내에 Tx이 종료되지 않으면, Tx을 강제종료 |
6. propagation속성의 값
값 | 설명 | |
REQUIRED | Tx이 진행중이면 참여하고, 없으면 새로운 Tx시작 ( 디폴트 ) | |
REQUIRES_NEW | Tx이 진행중 무관하게, 새로운 Tx시작 ( Tx안에 다른 Tx ) | |
NESTED | Tx이 진행중이면, Tx의 내부 Tx으로 실행 ( Tx안에 subTx ) | |
MANDATORY | 반드시 실행중인 Tx내에서만 실행가능. 아니면 예외발생 | |
SUPPORTS | Tx이 진행중이건 아니건 상관없이 실행 | |
NOT_SUPPORTED | Tx없이 처리. Tx이 진행중이면 잠시 중단 ( suspend ) | |
NEVER | Tx없이 처리. Tx이 진행중이면 예외발생 |
7. REQUIRED와 REQUIRES_NEW
REQUIRED
REQUIRES_NEW
@Transactional을 쓰지 않고, 직접 경계 설정
참고 :
남궁성, 스프링의 정석
'Spring의 정석' 카테고리의 다른 글
게시판만들기 ( 목록, 페이징 )3~4 (0) | 2023.03.30 |
---|---|
게시판만들기 ( MyBatis 소개와 설정 )1~2 (0) | 2023.03.27 |
Spring_DI와 AOP(Transaction, AOP)_17~18 (1) | 2023.03.25 |
Spring_DI와 AOP(Spring 으로 DB연결)_14~16 (0) | 2023.03.24 |
Spring_DI와 AOP(Spring 으로 DB연결)_13 (0) | 2023.03.23 |