본문 바로가기
반응형

개발/JPA16

[JPA] 변경감지와 병합(merge) 준영속 엔티티 식별자가 존재하지만 영속성 컨텍스트가 더는 관리하지 않는 엔티티 - JPA가 관리하지 않는다 - 변경감지가 일어나지 않는다 준영속 엔티티 수정하는 방법 1. 변경 감지 기능 사용 1) id 식별자를 이용해서 기존 entity를 조회 2) 조회한 엔티티는 영속성 컨텍스트에서 관리됨 3) 조회한 엔티티에 setter를 이용해서 값을 넣어주면 트랜잭션 커밋 시점에 flush를 날리면서 변경 감지 작동 2. 병합(merge) 사용 em.merge(item); JPA가 준영속 엔티티의 식별자 값으로 영속성 컨텍스트에서 entity를 찾고 없으면 DB에서 조회 후 모든 필드를 바꿔줌 (1번에 적어놓은 과정을 모두 JPA가 알아서 해줌) 주의! 병합을 쓸 경우 모든 필드를 교체 [꿀팁 번외편] 데이터를.. 2022. 10. 26.
[JPA] 즉시로딩과 N+1 문제 즉시로딩(FetchType.EAGER) 연관관계 맺을 때 즉시로딩 설정 시 연관 엔티티 즉시 조회 N+1 문제 주로 즉시로딩(FetchType.EAGER)으로 설정해두고, JPQL을 사용할 때 발생 JPQL의 경우 바로 SQL로 변환됨 예) Order entity에서 Member entity를 즉시로딩으로 설정했을 때 JPQL: select o From order o; → SQL: select * from order; EAGER 설정이 되어있어도 조인해서 읽어오지 않고, 단건 조회를 수행하게 됨 → 단건 조회한 후, 조회한 수 만큼 연관 테이블을 가져오는 쿼리를 N개 던지게 되서 성능이슈 발생 해결 fetch 조인 또는 엔티티 그래프를 이용해서 조회 주의 기본 fetch 전략 @xToOne(@ManyTo.. 2022. 10. 24.
실전! 스프링 부트와 JPA활용 1 :: JPA와 DB 설정, 동작확인 - 테스트 실행 도중 에러 정리 [ 에러 1 ] java.lang.IllegalStateException: Failed to load ApplicationContext 더보기 java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:98) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:1.. 2022. 10. 22.
[JPA] 지연로딩과 조회 성능 최적화 2 - fetch join, DTO로 조회 1. fetch join 을 이용해서 entity 조회 후 DTO로 변환 1 + N 문제 해결도 하고, 조인을 통해 쿼리 한번으로 조회 가능 - Controller 코드 (엔티티로 조회해 왔기 때문에 DTO로 수정 후 반환) @GetMapping("/api/v3/simple-orders") public List ordersV3() { List orders = orderRepository.findAllWithMemberDelivery(); List result = orders.stream() .map(o->new SimpleOrderDto(o)) .collect(Collectors.toList()); return result; } @Data static class SimpleOrderDto { privat.. 2022. 4. 19.
[JPA] 지연로딩과 조회 성능 최적화 1 - xToOne # 아래 상황에서 최적화 방법을 알아보자 * ManyToOne, OneToOne * 지연로딩 => xToOne 연관관계의 대상을 프록시 객체로 가져옴 ★Entity를 그대로 반환하는 것은 좋지 않음! # 컨트롤러에서 xToOne 관계가 있는 entity 반환하는 방법 1) 컨트롤러에서 entity를 그대로 반환 시 아래와 같은 오류 발생! com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to .. 2022. 4. 18.
[JPA] JPQL fetch join / 연관된 entity 한번에 select / distinct로 엔티티 중복 제거 / fetch join 페이징 안 될 때 @BatchSize 설정 fetch join을 설명하기전에 fetch type에 대해 복습을 해보자! # FetchType @ManyToOne, @OneToOne FetchType이 기본이 EAGER다 - FetchType.EAGER entity를 조회할 때 연관된 entity도 같이 조회해온다 이 경우 연관된 entity까지 select하는 쿼리가 나가야 하므로 성능이 좋지 않다 ex. member entity 조회 시 team entity까지 select 하므로 2번의 select 쿼리가 나간다 그래서 성능을 위해 모든 엔티티의 연관관계의 FetchType은 LAZY로 설정해두는 것이 좋다 - FetchType.LAZY 조회한 엔티티와 연관된 엔티티는 실제 사용 시에 조회해온다 ex. member 조회 -> member만 s.. 2022. 4. 12.