028_트랜잭션(Transaction)

Dec 21, 2023
028_트랜잭션(Transaction)

트랜잭션(Transaction)

  • 데이터를 처리하는 하나의 논리적인 작업 단위를 말한다.
  • 일의 최소 단위라 한다.
  • 여러 개의 명령으로 구성될 수 있으며, 명령을 모두 성공하거나 모두 실패하는 ‘원자성(Atomicity)’을 가져야 한다.
  • '일관성(Consistency)', '독립성(Isolation)', '지속성(Durability)'을 보장해야하며 이를 ACID라고 부른다.
트랜젝션의 예시는 은행의 입금, 출금, 이체 서비스를 들 수 있다! ex) 행위 : 입금 → 입금 / 출금 → 출금 서비스 : 이체 → 출금, 이체 파일에 대한 입출력 작업을 하나의 트랜잭션으로 묶어 일관성과 안정성을 유지하는 트랜잭션입니다.
예제 코드
User 코드 (사용자)
package ex04.example.model; public class User { private final int id; private String name; private String email; public User(int id, String name, String email) { this.id = id; this.name = name; this.email = email; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + '}'; } }
Account 코드 (계좌)
package ex04.example.model; // 객체의 상태를 변경, 객체의 상태를 확인 public class Account { private final int id; private long balance; private int userId; public boolean 잔액부족하니(long amount) { if (balance < amount) { return true; } return false; } // 메서드는 하나의 책임만 가지는게 좋다. (못하는 경우가 생길 수도 있다) public void 출금(long amount) { this.balance = this.balance - amount; } public void 입금(long amount) { this.balance = this.balance + amount; } public Account(int id, long balance, int userId) { this.id = id; this.balance = balance; this.userId = userId; } @Override public String toString() { return "Account{" + "id=" + id + ", balance=" + balance + ", userId=" + userId + '}'; } }
BankService 코드 (서비스)
package ex04.example; import ex04.example.model.Account; // 트랜잭션 관리 public class BankService { public static void 출금(Account withdrawAccount, long amount) { if (amount <= 0) { System.out.println("0원 이하 금액을 이체할 수 없습니다."); return; } if (withdrawAccount.잔액부족하니(amount)) { System.out.println("잔액이 부족합니다"); return; } withdrawAccount.출금(amount); } public static void 이체(Account senderAccount, Account receiverAccount, long amount) { if (amount <= 0) { System.out.println("0원 이하 금액을 이체할 수 없습니다."); return; } if (senderAccount.잔액부족하니(amount)) { System.out.println("잔액이 부족합니다"); return; } senderAccount.출금(amount); receiverAccount.입금(amount); } }
BankApp 코드 (실사용)
package ex04.example; import ex04.example.model.Account; import ex04.example.model.User; // 객체 지향 프로그래밍 public class BankApp { public static void main(String[] args) { // 1. 고객 2명 만들기 User ssar = new User(1, "ssar", "ssar@naver.com"); User cos = new User(2, "cos", "cos@naver.com"); User love = new User(3, "love", "love@naver.com"); // 2. 계좌 2개 만들기 Account ssarAccount = new Account(1111, 1000L, 1); Account cosAccount = new Account(2222, 1000L, 2); Account loveAccount = new Account(3333, 1000L, 3); // 3. 고객에게 정보를 받기 (amount) long amount = 100L; // 4. 이체 (ssar -> cos 100원) BankService.이체(ssarAccount, cosAccount, amount); // 5. 이체 (ssar -> love 100원) BankService.이체(ssarAccount, loveAccount, amount); // 6. 이체 (cos -> love 500원) BankService.이체(cosAccount, loveAccount, amount); // 7. 객체 상태 확인 System.out.println(ssarAccount); System.out.println(cosAccount); System.out.println(loveAccount); // 8. 출금 BankService.출금(ssarAccount, amount); BankService.출금(loveAccount, amount); } }
👉
트랜잭션의 이해를 위해 만든 은행의 이체 시스템을 만든 코드이다. User 코드 에서는 사용자의 필요 정보를 받아주고 Account 코드 에서는 이체를 위한 입금, 출금과 잔액이 충분한지 확인하는 메서드를 구현하였다. BankService 코드 에서는 Account 코드의 메서드를 활용하여 이체 및 출금 때 필요로 하는 정보를 넣어 이체 시스템을 사용 가능하도록 만들어 주었다. BankApp 코드 에서는 필요한 메서드들을 호출하여 출력하게 구현하였다. 이처럼 Account의 입금, 출금, 잔액확인 메서드와 BankService의 이체, 출금 등 모두 ’트랜잭션’ 이라고 한다.
 
Share article
RSSPowered by inblog