개념 | 트랜잭션 적용과 영속성 컨텍스트

728x90

🏓 트랜잭션 적용과 영속성 컨텍스트

🟦 트랜잭션 적용 방법 | @Transactional

<주의>

org.springframework.transaction.annotaion.Transactional 을 imort 해야 한다. 

이 어노테이션이 붙은 대상 메소드 내부에 있는 sql처리들이 묶인다고 생각하자.

  • 1) 이 어노테이션이 붙은 메소드를 호출하면, start transaction; 을 해주며 (트랜잭션을 시작)
  • 2) 함수가 예외 없이 잘 끝나면 commit
  • 3) 문제가 발생할 경우 rollback

→ @Transactional 어노테이션은 Unchecked Exception에 대해서만 롤백이 일어난다.

IOException과 같은 Checked EXception에서는 롤백이 일어나지 않는다.


🟦 영속성 컨텍스트

  • 영속성 컨텍스트 : 테이블과 매핑된 Entity 객체를 관리, 보관하는 역할을 수행한다.
  • 스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생겨나고, 트랜잭션을 종료하면 영속성 컨텍스트가 종료된다.

♦️ 영속성 컨텍스트 능력 4가지

1) 변경 감지

  • 영속성 컨텍스트 안에서 불러와진 Entity는 명시적으로 save하지 않아도, 변경을 감지하여 자동으로 저장한다.
@Transactional
public void updateUser(UserUpdateRequest request) {
	User user= userRepository.findById(request.getId())
		.orElseThrow(IllegalArgumentException::new);
	user.updateName(request.getName());
	~~userRepository.save(use)~~ //이 부분 생략해도 변경 자동으로 감지하여 저장시킨다.
}

2) 쓰기 지연 능력

  • 트랜잭션이 commit되는 시점에 SQL을 모아서 한꺼번에 날린다.

3) 1차 캐싱 능력

  • 1차 캐싱 : ID를 기준으로 Entity를 기억하는 기능이다.
@Transactional(readOnly=true)
public void saveUsers() {
	userRepository.findById(1L); //최초 1회만 select쿼리 해두고 
	userRepository.findById(1L); 
	userRepository.findById(1L);
} //나머지 두번은 영속성 컨텍스트가 캐싱 중(보관하던)인 데이터들을 활용한다. 
728x90