JPA @Transactional 의 올바른 import 경로

@Transactional의 올바른 import 경로

JPA에서 @Transactional을 사용할 때는 반드시 Spring의 어노테이션을 사용해야 합니다.

올바른 import 경로

import org.springframework.transaction.annotation.Transactional;

org.springframework.transaction.annotation.TransactionalSpring에서 제공하는 트랜잭션 관리 기능
Spring의 트랜잭션 매니저(DataSourceTransactionManager, JpaTransactionManager)와 함께 동작


🔹 잘못된 import 주의!

JPA 환경에서 javax.transaction.Transactional을 import하면 예기치 않은 문제가 발생할 수 있습니다.

import javax.transaction.Transactional;  // ❌ 사용하지 말 것!

🚨 문제점

1️⃣ javax.transaction.TransactionalJTA(Java Transaction API) 용도로 사용됨
2️⃣ Spring의 트랜잭션 매니저와 완벽하게 연동되지 않음
3️⃣ 읽기 전용(readOnly = true) 등 Spring에서 지원하는 추가 옵션을 사용할 수 없음


🔹 Spring의 @Transactional 사용 예시

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class StudentService {
    private final StudentRepository studentRepository;

    // 트랜잭션 시작 (Spring이 관리)
    @Transactional
    public void updateStudentName(String id, String newName) {
        ExamEntity student = studentRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("학생을 찾을 수 없습니다."));
        
        student.setName(newName);  // Dirty Checking으로 자동 반영
    }
}

@Transactional이 적용되면, 메서드 실행 중 예외가 발생하면 자동으로 롤백
메서드가 정상 종료되면 commit
setName(newName)이 실행되면, commit 시 자동으로 UPDATE 쿼리가 실행됨


🔹 추가 옵션

✅ 읽기 전용 트랜잭션 (쿼리 최적화)

@Transactional(readOnly = true)
public ExamEntity getStudent(String id) {
    return studentRepository.findById(id)
            .orElseThrow(() -> new RuntimeException("학생을 찾을 수 없습니다."));
}

readOnly = true 설정 시, Dirty Checking이 비활성화되어 성능 최적화
✔ 단순 조회용 메서드에서 유용


🔹 결론

Spring의 @Transactional을 사용해야 함! (import org.springframework.transaction.annotation.Transactional;)
JPA와 함께 사용할 때는 javax.transaction.Transactional을 사용하지 말 것!
자동 롤백, Dirty Checking, 읽기 전용 트랜잭션 등의 기능을 지원

이제 @Transactional을 올바르게 사용할 수 있을 것입니다! 😊
더 궁금한 점이 있으면 질문 주세요 🚀

profile
AI 답변 글을 주로 올립니다.

0개의 댓글