TIL-Spring 숙련주차(3)
2024-05-23
오늘의 학습 🌠
지연 로딩과 즉시 로딩
- JPA는 연관관계가 설정된 Entity의 정보를 바로 가져올지, 필요할 때 가져올지 정할 수 있음.
즉, 가져오는 방법을 정하게 되는데 JPA에서는 Fetch Type이라고 부름
- Fetch Type의 종류에는 2가지가 있는데 하나는 LAZY, 다른 하나는 EAGER임.
LAZY
는 지연 로딩으로 필요한 시점에 정보를 가져옴.EAGER
는 즉시 로딩으로 이름의 뜻처럼 조회할 떄 연관된 모든 Entity의 정보를 즉시 가져옴.
기본적으로 @OneToMany 애너테이션은 Fetch Type의 default 값이 LAZY로 지정되어있고 반대로 @ManyToOne 애너테이션은 EAGER로 되어있음.
- 영속성 컨텍스트의 기능
1차 캐시
- 쓰기 지연 저장소
- 변경 감지
- 지연 로딩도 마찬가지로 영속성 컨텍스트의 기능 중 하나임.
- 따라서 지연 로딩된 Entity의 정보를 조회하려고 할 때는 반드시 영속성 컨텍스트가 존재해야 함.
- ‘영속성 컨텍스트가 존재해야한다’라는 의미는 결국 ‘트랜잭션이 적용되어있어야 한다’라는 의미와 동일함.
- 즉, 지연 로딩은 @Transactional 걸어줘야됨
고아 Entity 삭제
- orphanRemoval
- CASCADE의 REMOVE 옵션을 적용하면 해당 Entity 객체를 삭제 했을 때 연관된 Entity 객체들을 자동으로 삭제할 수 있었음.
하지만 REMOVE 옵션 같은 경우 연관된 Entity와 관계를 제거했다고 해서 자동으로 해당 Entity가 삭제 되지는 않음.
- JPA에서는 이를 간편하게 처리할 수 있는 방법으로 orphanRemoval 옵션을 제공
- orphanRemoval 같은 경우 @ManyToOne 같은 애너테이션에서는 사용할 수 없음.
- ManyToOne이 설정된 Entity는 해당 Entity 객체를 참조하는 다른 Entity 객체들이 있을 수 있기 때문에 속성으로 orphanRemoval를 가지고 있지 않음.
🐱🏍— —🤸🏻♀️ ~~~ 야~호~
This post is licensed under CC BY 4.0 by the author.