Skip to content

Commit

Permalink
refactor: TransactionManager에서 전달받을 함수형 인터페이스를 명시적으로 정의
Browse files Browse the repository at this point in the history
  • Loading branch information
Ohjintaek committed Oct 15, 2023
1 parent e531b69 commit d0f339d
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 42 deletions.
17 changes: 6 additions & 11 deletions app/src/main/java/com/techcourse/service/TxUserService.java
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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)
);
}
}
Original file line number Diff line number Diff line change
@@ -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> T executeAndReturn(DataSource dataSource, TransactionSupplier<T> 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);
}
}
Original file line number Diff line number Diff line change
@@ -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> T execute(DataSource dataSource, Supplier<T> 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();
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@

import javax.sql.DataSource;
import java.sql.Connection;
import java.util.function.Supplier;

public interface TransactionManager {

static Connection getConnection(DataSource dataSource) {
return DataSourceUtils.getConnection(dataSource);
}

<T> T execute(DataSource dataSource, Supplier<T> method);
void execute(DataSource dataSource, TransactionExecutor method);

<T> T executeAndReturn(DataSource dataSource, TransactionSupplier<T> method);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package org.springframework.transaction.support;

@FunctionalInterface
public interface TransactionSupplier<T> {
T get();
}

0 comments on commit d0f339d

Please sign in to comment.