Transaction은 언제 쓸까??

황상익·2024년 9월 5일

@Transacitonal

  1. 서비스 계층 메서드
    원자성 보장 : CRUD의 연산이 하나의 트랜젝션으로 묶여야 할때 사용
    ex) -> 사용자의 계좌에서 돈 인출 -> 다른 계좌에 돈을 입금하는 경우, 두 연산 중 하나라도 실패하면 rollback 되어야 함.

    일관성 유지 : DB의 상태를 일관되게 유지하기 위해 필요, 트랜잭션 내의 연산이 모두 성공해야만 db에 commit

  2. TestCode에서의 사용
    테스트 격리 : 테스트 코드에서 @Transacitonal을 사용하면 텟트 메서드가 완료될 때 트랜잭션이 자동으로 롤백. 테스트 환경이 실행 전후로 깨끗하게 유지 된다.

    임시 데이터 사용 : 테스트 중에 임시로 데이트 추가, 수정하는 경우. 트랙젝션이 롤백되기 때문에, 테스트 이후 db에 영향을 주지 않음. 특히 단위테스트와 통합 테스트에서 유용.

  3. 데이터 일관성이 요구되는 경우
    여러 db 테이블을 걸쳐 데이터 변경이 필요한 경우, 하나의 트랜잭션으로 묶어야 데이터 일관성 보장

  4. 지연로딩시 사용
    엔티티의 연관 데이터를 지연로딩 (Lazy Loading), 해당 데이터에 접근하려면 트랜잭션이 활성화된 상태.
    그렇지 않으면 LazyInitializationException 발생

@Transactional의 주의사항

읽기 전용 트랜잭션 : @Transactional(readOnly = true)로 설정하면 데이터베이스에 대한 읽기 작업만 수행
전파 수준 (Propagation): @Transactional에는 트랜잭션의 전파 수준(Propagation)을 설정할 수 있음. REQUIRED는 이미 진행 중인 트랜잭션이 있으면 해당 트랜잭션을 사용, 없으면 새 트랜잭션을 시작
격리 수준 (Isolation): 트랜잭션의 격리 수준을 설정, 동시에 여러 트랜잭션이 수행될 때, 일관성 문제 처리 결정. READ_COMMITTED, REPEATABLE_READ

@Transactional을 사용할 때 고려해야 할 사항

트랜잭션 경계 설정: @Transactional을 서비스 계층 메서드에 설정하는 것이 일반적
성능 고려: 모든 메서드에 @Transactional을 남용하면 성능에 영향을 미칠 수 있다.
트랜잭션 전파: 트랜잭션의 전파 속성을 잘못 설정하면 의도하지 않은 트랜잭션 경계로 인해 데이터 일관성 문제가 발생

profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글