[Jpa] 트랜잭션 범위와 영속성 컨텍스트

  • JPA 사용 환경의 비교
    • J2SE 환경
      • 개발자가 엔티티 매니저 생성 및 트랜잭션 관리가 필요하다
    • 스프링/J2EE 컨테이너
      • 컨테이너가 제공하는 전략을 따라야 한다.
  • 스프링 컨테이너의 기본 전략
    • 트랜잭션 범위의 영속성 컨텍스트
      • 트랜잭션을 시작하는 경우
        • 영속성 컨텍스트를 생성
      • 종료시
        • 영속성 제거
    • 구현
      • @Transactional 어노테이션
  • 스프링의 트랜잭션의 관리
    • 트랜잭션 AOP
      • 메서드 호출 전
        • 트랜잭션 시작
      • 메서드 정상 종료
        • 트랜잭션 커밋 및 종료
      • 영속성 플러시
        • 변경내용을 DB에 반영
      1. 예외가 발생하는 경우
        1. 트랜잭션을 롤백하고 , 플러시를 호출하지 않는다.
  • 코드예제
    @Controller
    class HelloController {
        @Autowired
        HelloService helloService;
    
        public void hello() {
            // 반환된 member 엔티티는 준영속 상태다.
            Member member = helloService.logic();
        }
    }
    @Service
    class HelloService {
        @PersistenceContext
        EntityManager em;
    
        @Autowired
        Repository1 repository1;
        @Autowired
        Repository2 repository2;
    
        // 트랜잭션 시작
        @Transactional
        public Member logic() {
            repository1.hello();
            Member member = repository2.findMember();
            return member; // 트랜잭션 종료
        }
    }
    @Repository
    class Repository1 {
        @PersistenceContext
        EntityManager em;
    
        public void hello() {
            // ... (엔티티 매니저를 사용한 데이터 접근)
        }
    }
    @Repository
    class Repository2 {
        @PersistenceContext
        EntityManager em;
    
        public Member findMember() {
            return em.find(Member.class, "id1"); // B. 엔티티 조회
        }
    }
    • @Transactional 어노테이션을 통하여 스프링이 트랜잭션을 관리
    • 영속성 컨텍스트
      • HelloService 내의 logic 메서드 내에서 영속성 컨텍스트가 유지
      • 메서드가 종료되면서 트랜잭션 종료
      • 영속성 컨텍스트 종료
      • 이후 컨트롤에서는 준영속 상태의 Member 가 됨

트랜잭션내의 영속성

  1. 동일 트랜잭션
    1. 같은 영속성 컨텍스트를 사용한다.
    1. 레포1 과 2는 동일한 트랜잭션의 범위 내에서 같은 영속성 컨텍스트에 접근
  1. 스레드별 트랜잭션
    1. 다른 스레드에서 서로 다른 트랜잭션과 영속성 컨텍스트를 사용한다
    1. 멀티 스레드에 안전함


Uploaded by N2T

'자바 > JPA' 카테고리의 다른 글

[JPA] 그 유명한 N+1 문제  (0) 2023.11.19
[Jpa] @Convertor 사용  (0) 2023.11.19
[Jpa] 준영속과 지연 로딩  (0) 2023.11.17
[Jpa] 준영속과 변경  (0) 2023.11.17
[Jpa] 파사드 계층을 추가하는 법  (0) 2023.11.17