일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 자바
- 추상메서드
- abstract
- 참조형변수
- Java
- 다형성
- 환경설정
- exception
- 객체 비교
- oracle
- 생성자오버로드
- 사용자예외클래스생성
- 정수형타입
- NestedFor
- 예외처리
- 메소드오버로딩
- 대덕인재개발원
- 집합_SET
- 예외미루기
- 자동차수리시스템
- 어윈 사용법
- GRANT VIEW
- 인터페이스
- 오라클
- 한국건설관리시스템
- 컬렉션 타입
- cursor문
- EnhancedFor
- 제네릭
- 컬렉션프레임워크
- Today
- Total
거니의 velog
(16) 스프링 트랜잭션 기능 사용하기 1 본문
1. 트랜잭션 기능
* 스프링은 트랜잭션 기능을 마이바티스 기능과 연동해서 사용한다. 트랜잭션 기능은 XML 파일에서 설정하는 방법과 애너테이션을 이용하는 방법이 있다. XML로 설정하는 방법은 설정 파일이 복잡해지면 불편하므로 현재는 애너테이션으로 트랜잭션을 적용하는 방법을 더 선호한다. 따라서 이번에는 애너테이션을 이용해 트랜잭션 기능을 구현해 보자.
* 트랜잭션(Transaction)은 여러 개의 DML 명령문을 하나의 논리적인 작업 단위로 묶어서 관리하는 것으로, All 또는 Nothing 방식으로 작업 단위가 처리된다. 즉, SQL 명령문들이 모두 정상적으로 처리되었다면 모든 작업의 결과를 데이터베이스에 영구 반영(commit)하지만 그중 하나라도 잘못된 것이 있으면 모두 취소(rollback)한다. 일단 웹 애플리케이션의 구조와 기능이 실행되는 과정을 보면 트랜잭션이 실제로 어떻게 동작하는지를 쉽게 이해할 수 있다.
* 다음 그림은 일반적인 애플리케이션 Service 클래스의 메서드 구조를 나타내었다.
* Service 클래스의 각 메서드가 애플리케이션의 단위 기능을 수행한다. 단위 기능1은 DAO 클래스의 SQL문 하나로 기능을 수행하는 반면에 단위 기능2나 단위 기능3은 여러 개의 SQL문을 묶어서 작업을 처리한다. 그런데 묶어서 작업을 처리할 때는 어느 하나의 SQL문이라도 잘못되면 이전에 수행한 모든 작업을 취소해야만 작업의 일관성이 유지된다.
* 따라서 트랜잭션은 각 단위 기능 수행 시 이와 관련된 데이터베이스 연동 작업을 한꺼번에 묶어서 관리한다는 개념이다.
* 보통 웹 애플리케이션에서 묶어서 처리하는 단위 기능은 다음과 같다.
- 게시판 글 조회 시 해당 글을 조회하는 기능과 조회 수를 갱신하는 기능
- 쇼핑몰에서 상품 주문 시 주문 상품을 테이블에 등록하는 기능과 주문자의 포인트를 갱신하는 기능
- 은행에서 송금 시 송금자의 잔고를 갱신하는 기능과 수신자의 잔고를 갱신하는 기능
2. 은행 계좌 이체를 통한 트랜잭션 기능
* 트랜잭션의 개념을 좀 더 이해하기 쉽게 두 예금자 사이의 계좌 이체 과정을 예로 들어 살펴보자. 다음 그림은 트랜잭션을 적용하지 않고 홍길동이 김유신에서 500만원을 인터넷 뱅킹으로 계좌 이체하는 과정을 나타낸 것이다.
* 그런데 홍길동의 계좌에서 500 만원이 인출되고 커밋한 후 김유신 계좌의 잔고(balance)를 갱신하려고 할 때 시스템에 이상이 생기면 어떻게 될까? 김유신의 계좌가 갱신되지 않으면 다음 날 김유신은 홍길동에게 자신의 계좌에 500 만원이 입금되지 않았다고 말할 것이다. 그런데 이미 홍길동의 계좌는 반영이 되었으므로 홍길동은 김유신에게 자신은 분명히 500 만원을 송금했다고 말할 것이다. 즉, 두 사람 사이에 엄청난 문제가 발생할 것이다.
* 다음 그림은 트랜잭션을 적용한 계좌 이체 과정이다.
* 이번에는 홍길동과 김유신 계좌 잔고의 갱신이 모두 정상적으로 이루어지면 최종적으로 반영(commit) 한다. 즉, 중간에 이상이 발생할 경우 이전의 모든 작업 취소, 즉, 롤백(rollback)되어 버린다. 앞에서보다 안전한 거래가 가능하고 문제 발생의 소지도 줄일 수 있을 것이다.
3. 스프링의 트랜잭션 속성 알아보기
* 스프링에서 사용하는 트랜잭션 기능의 속성은 다음 표와 같다. 지금은 일단 내용을 읽어보고 이후 실습을 통해 확실하게 이해하도록 하자.
< 스프링의 여러 가지 트랜잭션 속성들 >
속성 | 기능 |
propagation | 트랜잭션 전파 규칙 설정 |
isolation | 트랜잭션 격리 레벨 설정 |
realOnly | 읽기 전용 여부 설정 |
rollbackFor | 트랜잭션을 롤백(rollback)할 예외 타입 설정 |
norollbackFor | 트랜잭션을 롤백하지 않을 예외 타입 설정 |
timeout | 트랜잭션 타임아웃 시간 설정 |
* 다음 표들은 각각 propagation 속성과 isolation 속성에 관련된 값을 나타낸 것이다.
< propagation 속성이 가지는 값 >
값 | 의미 |
REQUIRED | - 트랜잭션 필요, 진행 중인 트랜잭션이 있는 경우 해당 트랜잭션 사용 - 트랜잭션이 없으면 새로운 트랜잭션 생성, 디폴트 값 |
MANDATORY | - 트랜잭션 필요 - 진행중인 트랜잭션이 없는 경우 예외 발생 |
REQUIRED_NEW | - 항상 새로운 트랜잭션 생성 - 진행 중인 트랜잭션이 있는 경우 기존 트랜잭션을 일시 중지시킨 후 새로운 트랜잭션 시작 - 새로 시작된 트랜잭션이 종료되면 기존 트랜잭션 계속 진행 |
SUPPORTS | - 트랜잭션 필요 없음 - 진행 중인 트랜잭션이 있는 경우 해당 트랜잭션 사용 |
NOT_SUPPORTED | - 트랜잭션 필요 없음 - 진행 중인 트랜잭션이 있는 경우 기존 트랜잭션을 일시 중지시킨 후 메서드 실행 - 메서드 실행이 종료되면 기존 트랜잭션 계속 진행 |
NEVER | - 트랜잭션 필요 없음 - 진행 중인 트랜잭션이 있는 경우 예외 발생 |
NESTED | - 트랜잭션 필요 - 진행 중인 트랜잭션이 있는 경우 기존 트랜잭션에 중첩된 트랜잭션에서 메서드 실행 - 트랜잭션이 없으면 새로운 트랜잭션 생성 |
< isolation 속성이 가지는 값 >
속성 | 기능 |
DEFAULT | 데이터베이스에서 제공하는 기본 설정 사용 |
READ_UNCOMMITED | 다른 트랜잭션에서 커밋하지 않은 데이터 읽기 가능 |
READ_COMMITED | 커밋한 데이터만 읽기 가능 |
REPEATABLE_READ | 현재 트랜잭션에서 데이터를 수정하지 않았다면 처음 읽어온 데이터와 두 번째 읽어온 데이터가 동일 |
SERIALIZABLE | 같은 데이터에 대해 한 개의 트랜잭션만 수행 가능 |
'Java_Spring Framework part1' 카테고리의 다른 글
(18) 스프링 애너테이션 기능 1 (0) | 2023.11.11 |
---|---|
(17) 스프링 트랜잭션 기능 사용하기 2 (0) | 2023.11.11 |
(15) 스프링과 마이바티스 연동하기 (0) | 2023.11.10 |
(14) 마이바티스 프레임워크 사용하기 5 (0) | 2023.11.10 |
(13) 마이바티스 프레임워크 사용하기 4 (0) | 2023.11.10 |