[Spring] Transaction 정리

Transaction은 DB와 연관된 개발을 함에 있어서 중요한 개념으로 자리 잡았다. 트래픽이 많은 요즘 제품 개발에 있어 더 중요해 진것 같다. Python에서는 라이브러리설정에서 몇가지 설정만 하면 transaction을 구현 가능 헸다. 이 글은 spring에서 transaction을 구현하는 방법을 알아보기 전에 JDBC을 이용하여 transaction을 어떻게 구성할 수 있을지에 대해 알아보고 Spring에서의 사용법에 대하여 간단히 알아볼 예정이다.

JDBC를 이용한 Transaction

아래 코드는 JDBC 연결을 하고 AutoCommit를 false로 설정 한 후 코드 실행 도중 Exception이 발생하면 rollback를 수행하는 코드 이다. (roolback은 JDBC에서 savepoint를 이용하여 구현 되었다.[링크] )

val connection: Connection = DriverManager.getConnection()
try (connection) {
        connection.setAutoCommit(false)
    // execute some SQL statements...
        connection.commit()

} catch (SQLException e) {
    connection.rollback()
}

Spring에서의 Transaction 사용

spring 어플리세이션에 @EnableTransactionManagement 설정을 하면 로직 구현 시 사용 할 수 있다.

@EnableTransactionManagement
@SpringBootApplication(exclude = [DataSourceAutoConfiguration::class])
class OrderApplication
fun main(args: Array<String>) {
    runApplication<OrderApplication>(*args)
}

아래는 사용자 생성을 처리하는 로직에 Transaction을 적용한 예이다.

@Transactional
@Throws(ServiceException::class)
fun checkValidateAndCreatUser(userDTO: UserDTO): User {
    val checkUser = userRepository.findByName(userDTO.name).orElse(null)
    if(checkUser != null){
        throw ServiceException("The user name have been used")
    }

    return  userRepository.save(
        User(
            name=userDTO.name,
            password = BCrypt.hashpw(userDTO.password,BCrypt.gensalt())
	    ))
}

creatUser함수에서 또다른 Transactional 함수를 호출했을 경우 호출한 method의 Transactional propagation이 REQUIRES_NEW로 설정되면 물리적으로 두개의 Transaction을 만들어 처리하고 나머지 경우는 하나의 Transaction으로 처리한다.(참고 링크)

Tansaction Propagation

Transaction 이노테이션에서는 전파레벨을 아래 7가지로 설정 할 수 있다.

  • Required(default): 새로운 프랜잭션을 생성해 주거나 같은 기존에 존재하느 것을 사용(호출하는 윗단계에서 이미 생성한 경우)
  • Support: Transaction을 신경 쓰지 않고 실행(JDBC에 영향을 주지 않음)
  • Mandatory: Transaction을 열지 않을거고 만약 열려 있지 않다면 ㅠㅠ
  • Required_new: 현재 method만의 Transaction이 필요, 무조건 새로 생성
  • Nested: save point를 이용하여 rollback 위치를 정해 줄 수 있음.
    ** Mandatory 모드로 사용할때 가지고 있는 Transaction 이 없다면 excetion을 발생 시킨다.

ref:

https://jsonobject.tistory.com/467

https://www.marcobehler.com/guides/spring-transaction-management-transactional-in-depth

https://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html#tx-resource-synchronization

'Spring boot' 카테고리의 다른 글

[Spring] EJB, POJO 그리고 Spring  (0) 2021.12.12
[Spring] Kotllin + Spring boot 시작하기  (0) 2021.12.08
[Spring] Logging 구성 및 구현  (0) 2021.11.22
[Spring] Async 대해  (0) 2021.11.22
[Spring] 사용자 Token 인증 방식  (0) 2021.11.20