트랜잭션 = DB 트랜잭션 ?
소프트웨어는 데이터베이스가 필수적인 요소이며 서비스로직엔 대부분 DB와 커넥트가 이루어진다.
하지만 트랜잭션이 DB트랜잭션에 의존하는 용어는 아니며 DB를 사용하지 않는 소프트웨어도 데이터의 일관성과 무결성을 유지하기 위해 트랜잭션 관리를 필수이다. 따라서 트랜잭션은 다양한 컨텍스트에서 사용될 수 있으며 기본적인 트랜잭션의 의미를 정리하고 가장 많이 사용하며 필수적인 DB트랜잭션에 대해서 알아보자.
트랜잭션이란?
사전적인 의미는 "더 이상 분할이 불가능한 업무처리의 단위"를 의미하며 ACID라는 4가지 특징을 가지고있다.
트랜잭션 4가지 특징
1.원자성(Atomicity)
-> 트랜잭션 내에서 실행한 작업들은 모두 성공하거나 모두 실패해야 한다.
2.일관성(Consistency)
->트랜잭션이 완료된 후에 일관된 상태여야 한다. /ㅌ 트랜잭션이 실행하기 전과 실행 후의 시스탬 상태는 일관되어야 한다.
3.격리성
-> 여러 트랜잭션이 동시에 실행될 때, 각 트랜잭션은 다른 트랜잭션의 작업에 영향을 받지 않아야 한다.
-> 격리성을 유지하는 것은 동시성 제어 기술을 사용하여 구현되며 4가지 격리수준이 있다.
1. Read Uncommitted (미 허용 읽기)
-> 다른 트랜잭션에서 변경 중인 데이터도 읽을 수 있다.
2.Read Committed(허용 읽기)
-> 커밋된 데이터만 읽을 수 있다. 다른 트랜잭션이 수정중인 데이터는 읽을 수 없다.
3.Repeatable Read(반복 읽기)
-> 한 트랜잭션 내에서 같은 쿼리를 여러 번 실행하더라도 결과가 항상 동일하다. 다른 트랜잭션이 데이터를 변경해도 읽은 데이터는 동일하게 유지된다.
4.Serializable(직렬화 가능)
-> 가장 높은 격리 수준으로, 동시성이 완전히 제거되어 모든 트랜잭션을 순차적으로 실행
DB 트랜잭션
AutoCommit ?
DB에서 여러 개의 작업을 하나의 단위로 묶는 방법은 AutoCommit 옵션을 사용하는 것이다. 기본적으로 AutoCommit 옵션은 ture로 되어있어서 자동으로 쿼리가 실행되면 commit이 적용되어 하나의 쿼리가 하나의 작업 단위가 된다. AutoCommit =false 옵션은 수동으로 commit을 입력하기 전엔 실제로 데이터베이스에 적용이 안되며 1개 이상의 명령어를 작성하고 commit을 하면 여러 쿼리를 하나의 트랜잭션으로 묶을 수 있다. 따라서 AuoCommit =fasle 옵션을 이용하면 원하는 작업단위를 묶어서 처리가 가능하다.
-AutoCommit = True -> 자동으로 commit
-AutoCommit = Fasle -> 수동으로 commit 해야함
JAVA를 이용한 DB 트랜잭션 관리
JAVA에서 DB트랜잭션 관리 하는법을 알아보자. 자바에서 트랜잭션 관리는 JDBC에서 제공하는 Connection 클래스를 통해 데이터베이스와 연결이 가능하다.
public void query(String sql) {
try (Connection connection){
connection.setAutoCommit(false); // 설정하지 않으면 true이다.
비즈니스 로직
connection.commit(); // 비즈니스 로직에 에러가 발생하지 않으면 Commit
} catch (SQLException e){
connection.rollback(); // 에러가 발생하면 rollback
} finally {
connection.setAutoCommit(true);
}
}
위에 코드를 보면 일단 AutoCommit 옵션을 false로 하고 트랜잭션을 적용할 비즈니스 로직을 입력을 한다.
비즈니스 로직에 에러가 발생하지 않으면 Commit을 하고 에러가 발생하면 rollback을 한다. 마지막으로 AutoCommit을 true로 다시 한다.
이제 Spring에서 트랜잭션 처리 하는법을 알아보자.
@Transactional
public void query(String sql) {
비즈니스 로직
}
너무나 간단하다. try-catch문이 빠지고 @Transactional 이란 어노테이션이 생겼다.
그렇다. 기존 자바에서는 DB connection 클래스를 이용하여 commit 처리, rollback처리를 직접 했지만 @Transactional 어노테이션은 해당 코드를 프록시 객체를 이용하여 자동으로 처리 해주는 어노테이션이다.
@Transaction?
@Transaction 어노테이션은 AOP를 사용하여 구현된다. 메인 로직 앞 뒤로 begin과 commit을 수행해주는 기능을 담당한다.
private은 @Transaction이 적용되지 않는다. 왜냐하면 proxy형태로 동작하기 때문에 외부에서 접근이 가능한 메서드만 설정할 수 있다.
'Programming > Back-end Language' 카테고리의 다른 글
K6를 이용한 서버 성능 테스트 이슈 (0) | 2024.09.06 |
---|---|
Apache Tomcat과 JAVA (0) | 2024.05.16 |
[Spring] WebClient 란? (0) | 2022.08.29 |
[Spring] @Valid를 이용한 유효성검증 (1) | 2022.06.17 |
[JAVA] Comparable, Comparator이란? (0) | 2022.05.26 |