트랜잭션
쪼갤 수 없는 업무의 최소 단위
start transaction;
commit;
rollback;
- 스프링에서 트랜잭션을 적용하는 법 (생성자 위)
@Transactional (*org.springframework.~에 있는 걸로 선택해야함)
SELECT 쿼리만 사용한다면,readOnly 옵션을 쓸 수 있다.
//ex
@Transactional(readOnly = true)
조회만 하는 곳에 쓴다면, 성능적 이점이 있다.
- IOException과 같은 checked Exception은 롤백이 일어나지 않는다.
영속성 컨텍스트
- 엔티티를 영구 저장하는 환경
- 테이블과 매핑된 Entity 객체를 관리/보관하는 역할
- 스프링에서 트랜잭션을 사용하면 영속성 컨텍스트가 시작되고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료된다.
- 영속성 컨텍스트 특징
- 변경 감지 : 영속성 컨텍스트 안에서 불러와진 Entity는 명시적으로 save하지 않더라도, 변경을 감지해 자동으로 저장된다.
@Transactional
public void updateUser(UserUpdateRequest request) {
User user = userRepository.findById(request.getId())
.orElseThrow(IllegalArgumentException::new);
user.updateName(request.getName());
- 쓰기 지연 : DB의 INSERT/UPDATE/ DELETE SQL을 바로 날리는 것이 아니라, 트랜잭션이 commit될 때 모아서 한 번만 날린다.
- 1차 캐싱 : ID를 기준으로 Entity를 기억한다. 이렇게 캐싱된 객체는 완전하게 동일하다.