- cascade : entity 의 상태변화를 연관된 entity로 전이
- orphanremoval = true : parent와 연관이 끊어진 child 삭제
- cascadeType.REMOVE : parent 삭제 시, 연관된 child 모두 삭제 (공통) (delete 쿼리)
- orphanremoval = true : parent의 컬렉션에서 특정 child 삭제 시, 해당 child 삭제 (delete 쿼리)
- parent의 life cycle 에 완전히 종속적
- lazy + fetch join (객체 그래프 루프를 돌아서 모두 영속화)
- lazy + join문 x + batch size ( 1:n 에서의 fetch join 은 페이징 불가 -> join 문 삭제 후, batch size 로 in query 날려서 조회쿼리 하나만)
-
- 1:n 에서의 페이징 -> n:1 로 조회 후 페이징 가능
- 둘 이상의 컬렉션은 fetch join 불가 ex) from Team t join fetch t.members join fetch t.orders
-
@Transactional(readonly=true) : commit 시점에 flush 작동x (성능상 우위)
-
query method : 메소드 네임 규칙으로 조회쿼리 생성
-
@Query : 어플리케이션 로딩 시점에 에러 확인 가능 (엄청난 장점, named query와 비슷, but named query는 잘 사용x)
-
ex) @EntityGraph(attributePaths = {"team", "team.director"}) : fetch join (default : left join fetch)
-
@Modifying(clearAutomatically : true ) : executeUpdate() 실행 (update된 count수 반환) + em.clear()
-
Page, Slice, List : 페이징 조회 반환타입 3가지
-
Page의 경우 total query -> 성능이슈... countQuery를 통해 불필요한 조인쿼리 없애기 가능 / Slice의 경우 countQuery x
-
Page객체 그대로 api 반환 가능
-
SimpleJpaRepository (spring-data-jpa 구현체): save, delete 등 (트랜젝션처리) / save, delete -> @Transactional | default : readonly transactional
-
(dirty checking 외의 등록 삭제 조회 과정은 @Transactional 불필요 (이미 구현체에 달려있음)
-
id(pk)값이 존재하는 상태에서 save()호출 시, persist 대신 merge가 실행됨!!(주의)
-
merge : db에 엔티티가 존재한다는 가정 하에 동작 (db에서 조회 후 모든 필드값을 업데이트 - 사용 비추천)
-
generatedValue 전략 사용x --> persistable인터페이스 구현해서 id존재여부 검증 절차 필요 (검증 여부에 따라 로직 변경)
- JPAQueryFactory : (동시성 문제 해결) 다른 트랜젝션내에서는 동일한 entitymanager -> 각각 다른 영속성 컨텍스트 호출
- dto조회 시, property, field, constructor(3가지) 방식 가능 | dto에 기본생성자 존재해야함!!
- ex) Projections.contructor()
- querydsl - dto조회 : 생성자에 @QueryProjection -> 간편하게 조회가능 (but, querydsl에 의존성 생김 - 순수한 dto x, 아키텍쳐에 맞게 유연하게 선택)
- 동적쿼리 : BooleanBuilder , where절 활용(권장)
- querydsl - 자바코드로 구성 -> 동적쿼리문을 필요에 맞게 컴포지션 가능, 코드 재사용성 up