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
'Web(웹)_관련 공부 모음' 카테고리의 다른 글
JPA | @ManyToOne, @OneToMany 이해하기 (0) | 2023.07.27 |
---|---|
[해결] java.lang.IllegalArgumentException: null (0) | 2023.07.25 |
개념 | 트랜잭션 (Transaction)의 개념, commit과 rollback (0) | 2023.07.24 |
개념 | SQL 직접 사용하는 것의 문제, 그 해결책인 JPA (0) | 2023.07.21 |
개념 | 스프링 컨테이너와 스프링 빈 (0) | 2023.07.18 |