- JPA 사용 환경의 비교
- J2SE 환경
- 개발자가 엔티티 매니저 생성 및 트랜잭션 관리가 필요하다
- 스프링/J2EE 컨테이너
- 컨테이너가 제공하는 전략을 따라야 한다.
- J2SE 환경
- 스프링 컨테이너의 기본 전략
- 트랜잭션 범위의 영속성 컨텍스트
- 트랜잭션을 시작하는 경우
- 영속성 컨텍스트를 생성
- 종료시
- 영속성 제거
- 트랜잭션을 시작하는 경우
- 구현
@Transactional
어노테이션
- 트랜잭션 범위의 영속성 컨텍스트
- 스프링의 트랜잭션의 관리
- 트랜잭션 AOP
- 메서드 호출 전
- 트랜잭션 시작
- 메서드 정상 종료
- 트랜잭션 커밋 및 종료
- 영속성 플러시
- 변경내용을 DB에 반영
- 예외가 발생하는 경우
- 트랜잭션을 롤백하고 , 플러시를 호출하지 않는다.
- 메서드 호출 전
- 트랜잭션 AOP
- 코드예제
@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 과 2는 동일한 트랜잭션의 범위 내에서 같은 영속성 컨텍스트에 접근
- 스레드별 트랜잭션
- 다른 스레드에서 서로 다른 트랜잭션과 영속성 컨텍스트를 사용한다
- 멀티 스레드에 안전함
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 |