17 트랜잭션

p296 - src/main/java/spring/domain/Account

@Data
public class Account {
    private String name;
    private int amount;
}

p297, 298 - src/main/java/spring/jdbc/repository/AccountRepository

public class AccountRepository {
    // 잔액 조회 메서드
    public Account findByName(Connection connection, String name) throws SQLException {
        String sql = "SELECT name, amount FROM Account WHERE name = ?";
        PreparedStatement pstmt = connection.prepareStatement(sql);
        pstmt.setString(1, name);

        ResultSet rs = null;
        try {
            rs = pstmt.executeQuery();
            if (rs.next()) {
                Account account = new Account();
                account.setName(rs.getString("name"));
                account.setAmount(rs.getInt("amount"));
                return account;
            } else {
                throw new RuntimeException("Account not found: " + name);
            }
        } finally {
            if (rs != null) {
                rs.close();
            }
            pstmt.close();
        }
    }

    // 출금 메서드
    public void withdraw(Connection connection, String name, int amount) throws SQLException {
        Account account = findByName(connection, name);
        if (account.getAmount() < amount) {
            throw new RuntimeException("Insufficient balance");
        }

        String sql = "UPDATE Account SET amount = amount - ? WHERE name = ?";
        PreparedStatement pstmt = connection.prepareStatement(sql);
        try {
            pstmt.setInt(1, amount);
            pstmt.setString(2, name);
            pstmt.executeUpdate();
        } finally {
            pstmt.close();
        }
    }

    // 입금 메서드
    public void deposit(Connection connection, String name, int amount) throws SQLException {
        String sql = "UPDATE Account SET amount = amount + ? WHERE name = ?";
        PreparedStatement pstmt = connection.prepareStatement(sql);
        try {
            pstmt.setInt(1, amount);
            pstmt.setString(2, name);
            pstmt.executeUpdate();
        } finally {
            pstmt.close();
        }
    }

    // 계좌 생성 메서드
    public void createAccount(Connection connection, String name, int amount) throws SQLException {
        String sql = "INSERT INTO Account (name, amount) VALUES (?, ?)";
        PreparedStatement pstmt = connection.prepareStatement(sql);
        try {
            pstmt.setString(1, name);
            pstmt.setInt(2, amount);
            pstmt.executeUpdate();
        } finally {
            pstmt.close();
        }
    }

    // 계좌 삭제 메서드
    public void deleteAccount(Connection connection, String name) throws SQLException {
        String sql = "DELETE FROM Account WHERE name = ?";
        PreparedStatement pstmt = connection.prepareStatement(sql);
        try {
            pstmt.setString(1, name);
            pstmt.executeUpdate();
        } finally {
            pstmt.close();
        }
    }
}

p299, 300 - src/main/java/spring/jdbc/service/AccountService

p301, 302 - src/test/java/spring/jdbc/service/AccountServiceTest

p303, 304, - src/main/java/spring/jdbc/repository/AccountRepositoryTransactionManager

p309 - src/main/java/spring/jdbc/repository/AccountRepositoryTransactionManager

p310 - src/main/java/spring/jdbc/repository/AccountRepository

p311, 312, - src/main/java/spring/jdbc/service/AccountServiceTransactionManager

p313 - src/test/java/spring/jdbc/service/AccountServiceTransactionManagerTest

p318, 320, 321 ~ 324 - src/test/java/spring/jdbc/service/AccountServiceTransactionTest

p325 - src/test/resources/application.properties

p326, 327 - src/test/java/spring/jdbc/transaction

p328 - src/test/java/spring/jdbc/transaction/TransactionLevelTest

p329 - src/test/java/spring/jdbc/transaction/TransactionActiveTest

p330, 331 - src/test/java/spring/jdbc/transaction/TransactionNotApplied

p332 - src/test/java/spring/jdbc/transaction/PostConstructTransactionTest

p336(왼쪽이미지) - src/test/java/spring/jdbc/exception/CheckedExceptionServiceTest

p336(오른쪽이미지) - src/test/java/spring/jdbc/exception/UncheckedExceptionServiceTest

p338 - src/test/resources/application.properties

p339 - src/test/java/spring/jdbc/transaction/TransactionExceptionTest

p347 ~ 350 - src/test/java/spring/jdbc/transaction/NestedTransactionTest

Last updated