본문 바로가기

Spring/JPA

📝 트랜잭션(Transacction)이란?

데이터베이스에서 데이터에 대한 하나의 논리적 실행단계

특징

  • 원자성(Atomicity): 트랜잭션은 All or Noting의 실행만 가능(일부 실행 불가)
  • 일관성(Consistency): 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관된 데이터베이스 상태가 됨
  • 독립성/고립성(Isolation): 트랜잭션 작업 수행 중에는 다른 트랜잭션에 영향을 주어서도 안되고, 간섭을 받아서도 안됨. 예를들어 다수의 트랜잭션이 동시에 수행중인 상황에서 하나의 트랜잭션이 완료될 때까지 현재 실행중인 트랜잭션의 중간 수행결과를 다른 트랜잭션에서 참조 불가
  • 영구성/지속성(Durability): 트랜잭션이 실행을 성공적으로 끝내면 그 결과를 어떠한 경우라도 보장 받음

 

트랜잭션을 사용한 폴더 생성 예시

public List<Folder> addFolders(List<String> folderNames, User user) {
				// 트랜잭션의 시작
        TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition());
				try {
	        // 1) 입력으로 들어온 폴더 이름을 기준으로, 회원이 이미 생성한 폴더들을 조회합니다.
	        List<Folder> existFolderList = folderRepository.findAllByUserAndNameIn(user, folderNames);
	
	        List<Folder> savedFolderList = new ArrayList<>();
	        for (String folderName : folderNames) {
	            // 2) 이미 생성한 폴더가 아닌 경우만 폴더 생성
	            if (isExistFolderName(folderName, existFolderList)) {
	                // Exception 발생!
	                throw new IllegalArgumentException("중복된 폴더명을 제거해 주세요! 폴더명: " + folderName);
	            } else {
	                Folder folder = new Folder(folderName, user);
	                // 폴더명 저장
	                folder = folderRepository.save(folder);
	                savedFolderList.add(folder);
	            }
	        }

					// 트랜잭션 commit
          transactionManager.commit(status);

	        return savedFolderList;
        } catch (Exception ex) {
            // 트랜잭션 rollback
            transactionManager.rollback(status);
            throw ex;
        }
    }

 

트랜잭션을 사용한 폴더 생성 과정

 

@Transactional

클래스나 메서드에 붙여줄 경우, 해당 범위 내 메서드가 트랜잭션이 되도록 보장해 줌

선언적 트랜잭션이라고도 하는데, 직접 객체를 만들 필요 없이 선언만으로도 관리를 용이하게 해주기 때문

 

@Transactional을 사용한 폴더 생성

@Transactional
public List<Folder> addFolders(List<String> folderNames, User user) {
  // ...
}

 

@Transactional 사용한 폴더 생성 과정