Reference. 자바 ORM 표준 JPA 프로그래밍
책 목차 및 이전 글
더보기
들어가기 전 JPA 특징, Q&A
1. JPA 소개
3. 영속성 관리
4. 엔티티 매핑
4.1 - 4.3 @Entity, @Table, 다양한 매핑
4.4 - 4.5 데이터베이스 스키마 자동 생성, DDL 생성 기능
5. 연관관계 매핑 기초
6. 다양한 연관관계 매핑
7. 고급매핑
8. 프록시와 연관관계 관리
9. 값 타입
9.3~5 값 타입과 불변 객체, 값 비교, 값 타입 컬렉션
10. 객체지향 쿼리 언어
11. 웹 애플리케이션 제작
11.1 프로젝트 환경설정
11.2 도메인 모델과 테이블 설계
11.3 애플리케이션 구현
12. 스프링 데이터 JPA
13.1 트랜잭션 범위의 영속성 컨텍스트
- 순수하게 J2SE 환경에서 JPA를 사옹하면 엔티티 매니저를 생성하고 트랜잭션 관리도 필요
- 하지만 스프링이나 J2EE 컨테이너 환경에선 컨테이너가 제공하는 전략을 사용하면 가능
13.1.1 스프링 컨테이너의 기본 전략
- 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본 사용
- 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝나면 영속성 컨텍스트도 종료
- 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근
- 보통 비즈니스 로직을 시작하는 서비스 계층에 @Transactional 어노테이션을 선언하여 사용
- 이 어노테이션이 있으면 메소드를 실행하기 직전에 스프링의 트랜잭션 AOP가 먼저 동작
- 스프링 트랜잭션 AOP는 메소드 호출 직전에 트랜잭션을 시작, 정상 종료할 떄 커밋하면서 종료
- 트랜잭션 커밋하면 JPA는 영속성 컨텍스트를 플러시해서 변경내용을 DB에 반영 후 커밋
- 만약 예외가 발생하면 트랜잭션을 롤백하고 이 때는 플러시 호출X
- 트랜잭션 범위의 영속성 컨텍스트 예제
@Contorller class HelloController { @Autowired HelloService helloService; public void hello() { //반환된 member 엔티티는 준영속 상태 -- 4 Member member = helloService.logic(); } }
@Service class HelloService { @PersistenceContext //엔티티 매니저 주입 EntityManager em; @Autowired Repository1 repository1; @Autowired Repository2 repository2; //트랜잭션 시작 -- 1 @Transactional public void logic() { repository1.hello(); //member는 영속 상태 -- 2 Member member = repository2.findMember(); return member; } //트랜잭션 종료 -- 3 }
@Repository class Repository1 { @PersistenceContext EntityManager em; public void hello() { em.xxx(); //A. 영속성 컨텍스트 접근 } } @Repository class Repository2 { @PersistenceContext EntityManager em; public Member member() { return em.find(Member.class, "id1"); //B. 영속성 컨텍스트 접근 } }
- 1. HelloService.logic() 메소드에 @Transactional을 선언해서 트랜잭션을 먼저 시작
- 2. findMember()를 통해 조회한 member 엔티티는 트랜잭션 범위 안이므로 영속성 컨텍스트 관리 상태, 따라서 영속 상태
- 3. @Transactional을 선언한 메소드가 정상 종료되면 트랜잭션 커밋, 이때 영속성 컨텍스트를 종료하고 영속성 컨텍스트가 사라졌으므로 엔티티는 준영속 상태
- 4. 서비스 메소드가 끝나면 트랜잭션과 영속성 컨텍스트가 종료되므로 반환된 member 엔티티는 준영속 상태
트랜잭션이 같으면 같은 영속성 컨텍스트를 사용
- 트런잭션 범위의 영속성 컨텍스트 전략은 다양한 위치에서 엔티티 매니저를 주입받아 사용해도 트랜잭션이 같으면 항상 같은 영속성 컨텍스트를 사용
- 엔티티 매니저를 쓰는 A, B는 같은 트랜잭션 범위 안이므로 같은 영속성 컨텍스트 사용
트랜잭션이 다르면 다른 영속성 컨텍스트를 사용
- 같은 엔티티 매니저를 사용해도 트랜잭션에 따라 접근하는 영속성 컨텍스트가 다름
- 스프링 컨테이너는 스레드마다 각각 다른 트랜잭션을 할당
- 같은 엔티티 매니저를 호출해도 접근하는 영속성 컨텍스트가 다르므로 멀티스레드 상황에 안전
- 스프링, J2EE 컨테이너의 가장 큰 장점은 트랜잭션과 복잡한 멀티 스레드 상황을 컨테이너가 처리해준다는 점
'개발서적 > 자바 ORM 표준 JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 13.3 OSIV (0) | 2021.09.21 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 13.2 준영속 상태와 지연 로딩 (0) | 2021.09.21 |
[자바 ORM 표준 JPA 프로그래밍] 12.5~10 명세, 사용자 정의 리포지토리, Web 확장... (0) | 2021.09.21 |
[자바 ORM 표준 JPA 프로그래밍] 12.4 쿼리 메소드 기능 (0) | 2021.09.21 |
[자바 ORM 표준 JPA 프로그래밍] 12.1~3 스프링 데이터 JPA 소개, 공통 인터페이스 기능 (0) | 2021.09.21 |