POTATO THAT WANT TO BE HUMAN

[Java] Transaction Annotation 본문

BACKEND/Java & Spring

[Java] Transaction Annotation

녜힝 2023. 5. 17. 20:55
반응형

트랜잭션이란,
데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야하는 연산들을 의미한다.


트랜잭션은

  • begin, commit을 자동으로 수행하며
  • 예외가 발생할 경우 자동으로 rollback 처리를 한다.


트랜잭션의 성질은 다음과 같다.

  1. 원자성
  2. 일관성
  3. 격리성
  4. 영속성

Transactional Annotation을 사용하기 위해서는

다음과 같이 서비스 상단에 @Transactional Annotation을 추가하면 된다.

@Transactional
public void userService(UserDTO dto) throws Exception {
	// 서비스 로직
}

@Transactional Annotation을 사용하면 서비스에 여러 쿼리가 있는 경우 

하나의 쿼리에서 에러가 발생해도 위에서 실행된 쿼리들은 자동 rollback 된다.

 

그렇다면 모든 서비스에 Transactional Annotation을 사용하지 않는 이유는 뭘까?

트랜잭션의 성질 중 격리성이 있다.

격리성이란, 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리하는 것을 말한다.

 

이처럼 트랜잭션이 실행 중이면 다른 트랜잭션은 격리되어 끼어들 수 없다. 그래서 트랜잭션을 걸어놓고 테이블에서 작업을 하게 되면 테이블에 LOCK을 먼저 걸어놓고 작업을 시작한다. LOCK이 걸린 사이에는 해당 테이블에서 다른 작업을 하지 못하고 LOCK이 풀릴 때까지 기다려야 한다.

 

이런 성질에서 답을 찾을 수 있다.

일단 테이블에 LOCK을 거는 것부터 cost가 들어가는 일이다.

예를 들어 하나의 테이블에 간단한 INSERT 작업을 하는데도 LOCK이 걸려 다른 작업을 수행하지 못한다고 하자.

이런 하나하나의 작업들이 쌓여 결국 시스템이 느려지는 결과를 부를 것이다.

 

개인 프로젝트나 프로젝트의 규모가 작은 경우엔 큰 영향을 미치지 않지만, 프로젝트가 커질수록 속도 측면에서 큰 차이를 보이게 된다.

 

사용자 측에서는 서비스가 3초 이상만 지연되어도 해당 서비스에 만족하지 못할 만큼 속도는 중요한 요소이다. 따라서 INSERT, UPDATE, DELETE 쿼리 여러 개가 하나의 서비스에서 수행되는 경우에만 Transactional Annotation을 사용하는 것이 바람직하다.

반응형

'BACKEND > Java & Spring' 카테고리의 다른 글

[Spring] mybatis 쿼리 작성 시 concat 사용하기  (0) 2023.04.11
Comments