[java] Java MyBatis에서 트랜잭션 처리

MyBatis는 자바 언어를 위한 오픈 소스 ORM(Object Relational Mapping) 프레임워크로, 데이터베이스와의 상호 작용을 쉽게 처리할 수 있게 해줍니다. 트랜잭션은 데이터베이스 작업의 원자성과 일관성을 보장하기 위해 필수적인 요소입니다. 이번 포스트에서는 MyBatis에서 트랜잭션을 어떻게 처리하는지 알아보겠습니다.

1. 마이바티스 트랜잭션 설정

마이바티스에서는 Java에서 트랜잭션을 다루기 위해 TransactionFactory를 지원합니다. 다양한 TransactionFactory가 제공되지만, 가장 일반적인 방법은 JdbcTransactionFactory를 사용하는 것입니다.

// 마이바티스 설정 파일 (mybatis-config.xml)에서 트랜잭션 관련 설정을 추가해야 합니다.
<configuration>
  ...
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      ...
    </environment>
  </environments>
  ...
</configuration>

해당 설정에서 transactionManagertypeJDBC로 설정하여 JdbcTransactionFactory를 사용하도록 지정합니다.

2. 트랜잭션 시작과 종료

트랜잭션은 일반적으로 비즈니스 로직에 의해 시작되고, 성공 또는 실패에 따라 종료됩니다.

SqlSession sqlSession = MyBatisUtils.getSqlSession(); // SqlSession을 얻어옵니다.

try {
  sqlSession.getConnection().setAutoCommit(false); // 수동 커밋 모드로 설정합니다.

  // 비즈니스 로직 실행

  sqlSession.commit(); // 트랜잭션 커밋
} catch (Exception e) {
  sqlSession.rollback(); // 예외 발생 시 트랜잭션 롤백
} finally {
  sqlSession.getConnection().setAutoCommit(true); // 다음 작업을 위해 자동 커밋 모드로 복원합니다.
  sqlSession.close(); // SqlSession을 닫습니다.
}

위의 예제에서는 수동 커밋 모드로 SqlSession을 설정하고, 비즈니스 로직 실행 후에 commit() 또는 rollback()을 호출하여 트랜잭션을 종료합니다. 예외가 발생하면 rollback()이 호출되어 트랜잭션이 롤백됩니다.

3. 어노테이션을 통한 트랜잭션 관리

마이바티스는 @Transactional 어노테이션을 제공하여 메서드 단위로 트랜잭션을 관리할 수 있도록 도와줍니다.

@Transactional
public void performTransaction() {
  // 비즈니스 로직 실행
}

@Transactional 어노테이션을 메서드에 추가하면, 해당 메서드에서 실행되는 모든 SQL 문은 하나의 트랜잭션으로 처리됩니다. 메서드가 성공적으로 완료되면 트랜잭션은 커밋되고, 예외가 발생하면 트랜잭션이 롤백됩니다.

4. 트랜잭션 격리 수준

마이바티스에서는 트랜잭션 격리 수준을 설정하여 동시성 문제를 방지할 수 있습니다. 기본적으로 READ_COMMITTED 수준을 사용하며, 필요에 따라 다른 수준으로 변경할 수 있습니다.

// 트랜잭션 매니저의 설정에 따라 해당 메서드를 호출하기 전에 트랜잭션 격리 수준을 설정합니다.
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void performTransaction() {
  // 비즈니스 로직 실행
}

@Transactional 어노테이션의 isolation 속성을 사용하여 트랜잭션 격리 수준을 설정할 수 있습니다.

결론

이 글에서는 마이바티스에서 트랜잭션을 처리하는 방법에 대해 알아보았습니다. MyBatis의 TransactionFactory를 설정하고, 수동 및 어노테이션 기반의 트랜잭션 관리를 통해 안정적인 데이터베이스 작업을 수행할 수 있습니다. 트랜잭션 격리 수준도 필요에 따라 설정하여 동시성 문제를 해결할 수 있습니다.