본문 바로가기

개발일지

20240101 - @Transactional

내가 코드를 짜면서 Service단에서 주로 @Transactional을 사용하고 있지만 사실 정확한 동작원리나 사용방법에 대해서 알고 있지 않은 것 같다. 그래서 오늘은 @Transactional에 대해 정리해보려 한다.

 

우선 트랜잭션이 무엇인지 알아야 한다.
트랜잭션이란 데이터베이스 관리 시스템에서의 상호작용의 단위를 뜻하며 쉽게 말해서 데이터베이스의 상태가 변경될 때의 수행되는 연산들을 말한다. @Transactional를 클래스나 메서드등에 선언해 주면서 해당 범위를 트랜잭션으로 묶어준다.

 

그러면 우리는 왜 @Transactional을 사용해야 할까?

이는 트랜잭션의 특징(ACID)으로 알아볼 수 있는데 해당 범위를 트랜잭션으로 정해주면서 데이터베이스 관리중에 발생할 수 있는 여러 문제들을 해결해 줄 수 있기 때문이다.

 

1.Atomicity(원자성)

트랜잭션 내에서 어떤 하나의 작업이라도 실패할 경우, 전체 트랜잭션이 실패해야 한다.

@transactional을 통해 트랜잭션 내의 작업이 성공하여 작업이 완료되거나, 하나라도 실패하였을 경우 롤백될 수 있도록 한다.

 

2.Consistency(일관성)

트랜잭션이 실행되기 전과 실행된 후의 데이터베이스는 일관된 상태여야 한다.

데이터베이스의 일관성은 도메인의 규칙을 어기지 않거나, 참조하는 키들 간의 관계가 유효해야 하고, 제약 조건이나 비즈니스 논리들이 조건에 위반하지 않고 실행되어야 함을 뜻한다.

@transactional은 트랜잭션이 일관성을 유지하도록 보장해주고 실패할 경우 롤백되어 이전의 일관된 상태로 돌아갈 수 있도록 한다.

 

3.Isolation(독립성)

여러 트랜잭션이 동시에 실행될 경우 각각의 트랜잭션은 다른 트랜잭션에게 영향이 미치지 않도록 독립되어야 한다.

@transactional은 이러한 독립성을 보장하여 다른 트랜잭션과의 충돌을 방지한다.

 

4.Durability(지속성)

성공적으로 완료된 트랜잭션의 결과는 영구적으로 저장된다. 시스템이 비정상적으로 종료되더라도 트랜잭션이 커밋된 데이터는 손실되지 않는다.