메서드나 클래스에 붙어 트랙잭션 범위를 통합해주는 어노테이션
JPA 전용은 아니지만 JPA의 동작과 밀접한 연관이 있음
@Transactional 어노테이션 종류가 많은데
import org.springframework.transaction.annotation.Transactional;
스프링 걸로 import하면 됨
public void updateUser() {
// 객체 반환과 함께 트랜잭션 종료
User user = userRepository.findById(1L).orElseThrow(new BusinessLoginException(ExeptionType.MEMBER_NOT_FOUND));
user.setName("수정"); // 트랜잭션이 종료되었기 때문에 영속성 컨텍스트에 해당 객체가 없음
// user가 JPA의 추적 대상이 아니기 때문에 변경사항이 DB에 반영 안 됨!
}
JPA 영속성 컨텍스트는 트랜잭션과 생명주기를 같이함
user 객체를 조회하면서 트랜잭션이 종료되었기 때문에 JPA와의 연결이 끊어지면서 변경사항이 반영되지 않음
명시적으로 save()를 호출하여 저장해줄 수도 있지만 여러 트랜잭션으로 나뉘게 되면 원자성이 보장되지 않음
@Transactional
public void updateUser() {
// 어노테이션에 의해 트랜잭션 유지
User user = userRepository.findById(1L).orElseThrow(() -> new BusinessLoginException(ExeptionType.MEMBER_NOT_FOUND));
user.setName("수정"); // 영속성 컨텍스트에 해당 객체 존재
// 메서드 종료와 함께 트랜잭션 종료 -> 명시적 save() 없이도 상태 변경 반영
}
클래스에 붙으면 해당 클래스에 선언된 모든 public 메서드에 일괄 적용됨
해당 메서드의 시작과 함께 트랜잭션이 생성되어 종료될 때 사라지고,
중간에 호출되는 다른 메서드에 @Transactional이 없다면 자동으로 단일 트랜잭션에 통합됨