OSIV와 성능 최적화Open Session In View: 하이버네이트Open EntityManager In View: JPA(관례상 OSIV라 한다.) OSIV ON spring.jpa.open-in-view : true 기본값최신 스프링 부트 버전에서는 실행을 하면 아래 warn 로그가 출력된다.WARN 72686 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-i..
JPA/JPA 활용 2
서론이전까지는 컬렉션이 아닌 ManyToOne이나 OneToOne 관계에 대해서만 조인을 했다.이런 경우에는 fetch join으로 쉽게 해결할 수 있었다. 그런데 컬렉션 조회라는 건 OneToMany 조회이다.문제는 DB 입장에서 OneToMany 조인을 하면 데이터가 뻥튀기가 되어버린다.예를 들어 주문을 하나 했다고 하자. 이 Order는 OrderItem과 OneToMany 관계이다. 근데 Order에 딸린 OrderItem이 3개라고 한다면 주문을 하나 했는데 하나의 주문에 OrderItem 3개가 딸려 있어 최종결과가 3줄이 되어버린다. 이 경우에는 최적화하기가 어렵다. ManyToOne이나 OneToOne 같은 건 fetch join을 하거나 DB 입장에서는 left out join 해서 한 ..
주문 + 배송정보 + 회원을 조회하는 API를 만들어보자.그리고 위 API를 사용하여 지연 로딩 때문에 발생하는 성능 문제를 단계적으로 해결해 보자.엔티티엔티티 부분에는 모든 필드들은 작성하지 않았고 연관관계에 있는 엔티티 객체 타입 필드들만 적어놨다.Order@Entity@Getter@Setter@Table(name = "orders")@NoArgsConstructor(access = AccessLevel.PROTECTED)public class Order { @Id @Column(name = "order_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne(fetch = Fet..
조회용 샘플 데이터 입력@Component@RequiredArgsConstructorpublic class InitDb { private final InitService initService; @PostConstruct public void init() { initService.dbInit1(); initService.dbInit2(); } @Component @Transactional @RequiredArgsConstructor static class InitService { private final EntityManager em; public void dbInit1(..