인프런 김영한 강사님의 스프링부트와 JPA활용1 강의를 듣고 추가로 학습한 내용을 정리한 게시물입니다.
지난 게시물과 마찬가지로 강의를 들으면서 이해하지 못했던 것들을 기록하며 공부해보려고 한다.
추가학습 내용은 다음과 같다.
- Entity Manager에 대하여
- cascadeType이란?
- 알아둬야 할 거 (Exception 테스트 관련)
1. Entity Manager에 대해
Entity Manager는 JPA에서 엔터티를 저장, 수정, 삭제 , 조회 등 엔터티와 관련된 모든 일을 처리하는 역할을 한다. 또, 영속성 컨텍스트를 통해 (PersistenceContext) 데이터의 상태 변화를 감지하고 필요한 쿼리를 자동으로 수행한다!
즉 Entity Manager 내부에 Persistence Context를 두어서 엔터티를 관리하는 구조이다.
여기서 영속성은 비휘발성과 같은 뜻으로 영구저장 한다는 뜻으로 받아들이면 될 것 같다.
EntityManagerFactory
Entity Manager에 대해 찾아보다보니, EntityManagerFactory라는 것도 있었다.
엔터티 매니저는 여러 스레드가 동시에 접근하면 동시성 문제가 발생하기 때문에 스레드 간 공유를 하면 안 된다. 한 개의 엔터티 매니저를 계속 쓰는 것이 아니라, 상황에 따라 (스레드마다) 엔터티 매니저를 계속 생성해야 하는데, 이 역할을 해주는 게 EntityManagerFactory라고 한다.
Entity Manager 메소드
메소드 중에서 자주 쓰는 거 같은 메소드를 간단하게 정리하려 한다.
- find()
- 영속 컨텍스트에서 엔터티를 검색한다. 없을 경우엔 DB에서 데이터를 찾아 영속 컨텍스트에 저장한다.
- persist()
- INSERT쿼리를 실행하는 메소드라고 보면 된다.
- 트랜잭션 범위 내에서 실행해야한다.
- remove()
- 엔터티클래스를 영속 컨텍스트에서 삭제 후 DELETE 쿼리 실행
- 마찬가지로 트랜잭션 범위 내에서 실행
2. cascadeType?
영속성 전이
어떤 Entity를 영속성 컨텍스트에 등록할 때, 연관 객체도 함께 등록하는 기능이다.
Ex ) 부모 Entity를 영속성 컨텍스트에 저장할 때, 자식 Entity도 함께 저장되도록 하는 것
맵핑관계 (@OneToMany, @ManyToMany등)에 CascadeType을 지정해서 사용한다.
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
cascade를 사용하면, Parent객체를 persist() 할 때, 연관 객체를 모두 등록한다.
Cascade 대표 옵션
- CascadeType.ALL
- 모든 연관 객체를 영속화
- 가장 많이 사용
- CascadeType.PERSIST
- 연관 객체 등록할 때만 Cascade 옵션 적용
- 영속화 객체를 삭제할 땐 Cascade 옵션 작동 X
- CascadeType.REMOVE
- 어떤 객체를 삭제 (비영속화) 할 때, 모든 연관 객체를 함께 삭제
그러나 잘 모르면 안 쓰는 게 낫다고 하셨다!
3. 알아둘 거
이건 그냥 개인 기록..
테스트 할 때 에러가 뜨는 걸 체크할 경우 @Test(expected = ~) 는 이제 지원하지 않기 때문에 assertThrow(Exception명, () -> 조건) 으로 테스트코드를 작성해야 함!
24.2.25 추가학습 기록 끗
'백엔드 > JPA' 카테고리의 다른 글
[JPA] 강의 추가학습 기록(2) - 스프링부트와 JPA활용1 (0) | 2024.02.27 |
---|---|
[JPA] 강의 추가학습 기록(1) - 스프링부트와 JPA활용1 (0) | 2024.02.22 |