JPA9 JPA 인덱스 걸기 참고로 findAllById 같은 경우에는 id는 pk라서 색인이 되있어서 성능상 문제가 없지만 findAllByPost, findAllByUser 같은 경우에는 인덱싱이 걸려있지 않아서 인덱스를 걸어줘야한다. 인덱싱을 걸지 않으면 일일이 테이블을 스캔하면서 post나 user를 찾아야하는데 인덱싱을 걸면 인덱스 한것만 찾으면 된다. 다음과 같이 인덱싱을 한다. @Entity @Table(name = "\"comment\"", indexes = { @Index(name = "post_id_idx", columnList = "post_id") // name : 인덱스 이름, columnList : 인덱스를 어떤 컬럼에 걸건지 }) @Getter @Setter @SQLDelete(sql = "UPDATE \.. 2022. 9. 26. JPA 사용 시 쿼리 방식 선택 권장 순서(컬렉션 조회 할 때) 정리 엔티티 조회 엔티티를 조회해서 그대로 반환: V1 엔티티 조회 후 DTO로 변환: V2 페치 조인으로 쿼리 수 최적화: V3 컬렉션 페이징과 한계 돌파: V3.1 컬렉션은 페치 조인시 페이징이 불가능 ToOne 관계는 페치 조인으로 쿼리 수 최적화 컬렉션은 페치 조인 대신에 지연 로딩을 유지하고, hibernate.default_batch_fetch_size , @BatchSize 로 최적화 DTO 직접 조회 JPA에서 DTO를 직접 조회: V4 컬렉션 조회 최적화 - 일대다 관계인 컬렉션은 IN 절을 활용해서 메모리에 미리 조회해서 최적화: V5 플랫 데이터 최적화 - JOIN 결과를 그대로 조회 후 애플리케이션에서 원하는 모양으로 직접 변환: V6 권장 순서 1. 엔티티 조회 방식으로 우선 접근.. 2022. 8. 14. JPA 사용 시 쿼리 방식 선택 권장 순서(컬렉션 조회 안할 때) JPA 사용 시 컬렉션 조회 안할 때 쿼리방식 선택 권장 순서 1. 우선 엔티티를 DTO로 변환하는 방법을 선택한다. 2. 필요하면 페치 조인으로 성능을 최적화 한다. 대부분의 성능 이슈가 해결된다. 3. 그래도 안되면 DTO로 직접 조회하는 방법을 사용한다. 4. 최후의 방법은 JPA가 제공하는 네이티브 SQL이나 스프링 JDBC Template을 사용해서 SQL을 직접 사용한다 (4번 까지 갈일은 거의 없다.) 2번 까지 사용하는 경우와 3번 까지 사용하는 경우를 비교하면 2번 까지 사용하는 경우는 다음처럼 엔티티를 fetch join해서 엔티티 전체 컬럼 값을 가져오는 것이다. // v3 방법 public List findAllWithMemberDelivery() { /* 프록시도 아니고 진짜 객체.. 2022. 8. 3. @JsonIgnore 사용과 지연로딩 에러 JPA 사용 시 양방향 관계를 조회하면 양방향 참조로 인한 무한 루프가 발생할 수 있다. ex) 다음 API를 호출하면 @GetMapping("/api/v1/simple-orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); return all; } 이렇게 Order 의 List를 조회하게 되면 Order 클래스에 있는 Member를 조회하게 되는데 public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = LAZY) // 지연로딩이면 진짜 Member 객체를 안.. 2022. 8. 1. No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - c.. JPA 관련 학습 도중에 테스트 코드를 작성하는데 다음과 같은 에러가 발생했다. org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call 내용.. 2022. 7. 9. 다양한 연관관계 매핑 연관관계 매핑을 다시 한 번 정리해보려고 한다.연관관계 매핑 시 고려할 3가지다중성 결정하기다대일일대다일대일다대다단방향, 양방향 정하기테이블의 경우 : '방향'이라는 개념 없음, 그냥 외래키로 조인하면 두 테이블이 연관관계를 맺음객체의 경우 : 연관관계 매핑을 객체 참조하는 방식으로 하여,참조가 2군데 있어야함 ( A->B, B->A )→ 연관관계의 주인을 만들어야함→ 외래키를 뭐로 할지, 누가 외래키를 관리할 지 정해줘야 함연관관계의 주인 정하기양방향의 경우, 누가 주인( = 외래키를 관리하는 쪽)인지 정해주자 다대일 @ManyToOne• 다대일 단방향 [N:1] : 주인인 '다'쪽에서는 '일'쪽 참조 가능하나, 반대는 조회도 불가능!• 다대일 양방향 [N:1, 1:N] : 서로 참조하면 주인아닌 쪽에.. 2022. 7. 7. 이전 1 2 다음