From d0f339df00914ea5a2e1a3b69af9d9baf3f3b21c Mon Sep 17 00:00:00 2001 From: Ohjintaek Date: Mon, 16 Oct 2023 02:33:40 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20TransactionManager=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A0=84=EB=8B=AC=EB=B0=9B=EC=9D=84=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=ED=98=95=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=EB=A5=BC=20=EB=AA=85=EC=8B=9C=EC=A0=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/techcourse/service/TxUserService.java | 17 ++---- .../support/JdbcTransactionManager.java | 55 +++++++++++++++++++ .../support/TransactionExecutor.java | 32 +---------- .../support/TransactionManager.java | 5 +- .../support/TransactionSupplier.java | 6 ++ 5 files changed, 73 insertions(+), 42 deletions(-) create mode 100644 jdbc/src/main/java/org/springframework/transaction/support/JdbcTransactionManager.java create mode 100644 jdbc/src/main/java/org/springframework/transaction/support/TransactionSupplier.java diff --git a/app/src/main/java/com/techcourse/service/TxUserService.java b/app/src/main/java/com/techcourse/service/TxUserService.java index 082b17685d..833c01224c 100644 --- a/app/src/main/java/com/techcourse/service/TxUserService.java +++ b/app/src/main/java/com/techcourse/service/TxUserService.java @@ -1,14 +1,14 @@ package com.techcourse.service; import com.techcourse.domain.User; -import org.springframework.transaction.support.TransactionExecutor; +import org.springframework.transaction.support.JdbcTransactionManager; import org.springframework.transaction.support.TransactionManager; import javax.sql.DataSource; public class TxUserService implements UserService { - private final TransactionManager transactionManager = new TransactionExecutor(); + private final TransactionManager transactionManager = new JdbcTransactionManager(); private final DataSource dataSource; private final UserService userService; @@ -19,22 +19,17 @@ public TxUserService(DataSource dataSource, UserService userService) { @Override public User findById(long id) { - return transactionManager.execute(dataSource, () -> userService.findById(id)); + return transactionManager.executeAndReturn(dataSource, () -> userService.findById(id)); } @Override public void insert(User user) { - transactionManager.execute(dataSource, () -> { - userService.insert(user); - return null; - }); + transactionManager.execute(dataSource, () -> userService.insert(user)); } @Override public void changePassword(long id, String newPassword, String createBy) { - transactionManager.execute(dataSource, () -> { - userService.changePassword(id, newPassword, createBy); - return null; - }); + transactionManager.execute(dataSource, () -> userService.changePassword(id, newPassword, createBy) + ); } } diff --git a/jdbc/src/main/java/org/springframework/transaction/support/JdbcTransactionManager.java b/jdbc/src/main/java/org/springframework/transaction/support/JdbcTransactionManager.java new file mode 100644 index 0000000000..fd1de9d997 --- /dev/null +++ b/jdbc/src/main/java/org/springframework/transaction/support/JdbcTransactionManager.java @@ -0,0 +1,55 @@ +package org.springframework.transaction.support; + +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.datasource.DataSourceUtils; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; + +public class JdbcTransactionManager implements TransactionManager { + + @Override + public void execute(DataSource dataSource, TransactionExecutor method) { + final var connection = TransactionManager.getConnection(dataSource); + try { + connection.setAutoCommit(false); + method.execute(); + connection.commit(); + } catch (RuntimeException | SQLException e) { + handleTransactionException(connection, e); + } finally { + cleanUpTransaction(dataSource, connection); + } + } + + @Override + public T executeAndReturn(DataSource dataSource, TransactionSupplier method) { + final var connection = TransactionManager.getConnection(dataSource); + try { + connection.setAutoCommit(false); + T result = method.get(); + connection.commit(); + return result; + } catch (RuntimeException | SQLException e) { + handleTransactionException(connection, e); + return null; + } finally { + cleanUpTransaction(dataSource, connection); + } + } + + private static void handleTransactionException(Connection connection, Exception e) { + try { + connection.rollback(); + throw new DataAccessException(e); + } catch (SQLException rollbackException) { + throw new RuntimeException(rollbackException); + } + } + + private void cleanUpTransaction(DataSource dataSource, Connection connection) { + DataSourceUtils.releaseConnection(connection, dataSource); + TransactionSynchronizationManager.unbindResource(dataSource); + } +} diff --git a/jdbc/src/main/java/org/springframework/transaction/support/TransactionExecutor.java b/jdbc/src/main/java/org/springframework/transaction/support/TransactionExecutor.java index 776a1974c1..ae84933bdc 100644 --- a/jdbc/src/main/java/org/springframework/transaction/support/TransactionExecutor.java +++ b/jdbc/src/main/java/org/springframework/transaction/support/TransactionExecutor.java @@ -1,32 +1,6 @@ package org.springframework.transaction.support; -import org.springframework.dao.DataAccessException; -import org.springframework.jdbc.datasource.DataSourceUtils; - -import javax.sql.DataSource; -import java.sql.SQLException; -import java.util.function.Supplier; - -public class TransactionExecutor implements TransactionManager { - - @Override - public T execute(DataSource dataSource, Supplier method) { - final var connection = TransactionManager.getConnection(dataSource); - try { - connection.setAutoCommit(false); - T result = method.get(); - connection.commit(); - return result; - } catch (RuntimeException | SQLException e) { - try { - connection.rollback(); - throw new DataAccessException(e); - } catch (SQLException rollbackException) { - throw new RuntimeException(rollbackException); - } - } finally { - DataSourceUtils.releaseConnection(connection, dataSource); - TransactionSynchronizationManager.unbindResource(dataSource); - } - } +@FunctionalInterface +public interface TransactionExecutor { + void execute(); } diff --git a/jdbc/src/main/java/org/springframework/transaction/support/TransactionManager.java b/jdbc/src/main/java/org/springframework/transaction/support/TransactionManager.java index 8091850a7d..ae74cdabef 100644 --- a/jdbc/src/main/java/org/springframework/transaction/support/TransactionManager.java +++ b/jdbc/src/main/java/org/springframework/transaction/support/TransactionManager.java @@ -4,7 +4,6 @@ import javax.sql.DataSource; import java.sql.Connection; -import java.util.function.Supplier; public interface TransactionManager { @@ -12,5 +11,7 @@ static Connection getConnection(DataSource dataSource) { return DataSourceUtils.getConnection(dataSource); } - T execute(DataSource dataSource, Supplier method); + void execute(DataSource dataSource, TransactionExecutor method); + + T executeAndReturn(DataSource dataSource, TransactionSupplier method); } diff --git a/jdbc/src/main/java/org/springframework/transaction/support/TransactionSupplier.java b/jdbc/src/main/java/org/springframework/transaction/support/TransactionSupplier.java new file mode 100644 index 0000000000..67705e04fd --- /dev/null +++ b/jdbc/src/main/java/org/springframework/transaction/support/TransactionSupplier.java @@ -0,0 +1,6 @@ +package org.springframework.transaction.support; + +@FunctionalInterface +public interface TransactionSupplier { + T get(); +}