OSIV(Open Session In View)란? JPA 하면 떠오르는 것이 영속성 컨텍스트입니다. 영속성 컨텍스트란 DB로부터 조회한 엔티티를 관리하는 저장소라고 생각하면 됩니다. 트랜잭션이 시작되어 조회된 엔티티는 영속성 컨텍스트(1차 캐시)에 저장하여 트랜잭션이 종료될 때까지 사용됩니다. 스프링을 사용한다면 기본적으로 OSIV가 켜진 상태로 사용됩니다. OSIV는 영속성 컨텍스트와 관련이 있는데 이에 대해서 알아보겠습니다. OSIV = true 먼저 사용자의 요청이 들어오면 이것을 처리하기 위해서 트랜잭션이 시작됩니다. 각 트랜잭션마다 영속성 컨텍스트가 생성되고, 트랜잭션이 살아있는 동안 영속성 컨텍스트가 살아있다는 의미가 됩니다. 영속성 컨텍스트가 살아있다면 엔티티의 조회 및 수정을 진행할 수..
들어가기 앞서, Proxy와 지연로딩의 개념을 알아야 합니다. 여기를 참고해 주세요! N + 1 문제란? JPQL을 사용하여 Entity를 조회할 때, 연관관계에 있는 Entity를 같이 조회할 때 발생하는 문제입니다. 연관관계에 있는 Entity를 즉시로딩(fetch = EAGER)로 조회하면 추가적인 쿼리문이 발생합니다. 즉, 조회된 Entity에 연관된 N개의 Entity를 조회하는 쿼리문이 N번 발생합니다. 예를 들어, Member Entity와 Order Entity가 존재합니다. Member Entity와 Order Entity는 1:N 관계라고 가정합시다. Member Entity @Entity @Getter @Setter public class Member { @Id @GeneratedVa..
주문 Entity 주문 Entity가 가지고 있는 필드는 다음과 같습니다. 연관관계에 있는 Entity를 집중해 봅시다. 주문 Entity는 회원(Member), 주문 상픔(OrderItem), 배송 정보(Delivery) Entity와 연관관계에 있습니다. @Entity @Table(name = "orders") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType...
DB에서 특정 엔티티를 조회하면 연관관계에 있는 엔티티 또한 같이 조회됩니다. 연관관계에 있는 엔티티도 조회하기 위해서는 DB에 join과 함께 쿼리문이 나가게 됩니다. 특정 상황에서는 굳이 연관관계에 있는 엔티티가 필요로 없는 상황이 있을 수도 있습니다. 이때 연관관계에 있는 엔티티까지 DB에서 조회하는 것은 효율적이지 않습니다. JPA는 이런 문제를 해결하기 위해 엔티티가 실제 사용될 때까지 DB에서 조회를 지연시키는 방법을 제공합니다. 이를 지연로딩이라고 합니다. 기존 조회 - 연관관계에 있는 엔티티까지 조회 EntityManager의 find() 메서드를 사용하여 엔티티를 조회합니다. clear()로 인해 영속성 컨텍스트가 초기화되었으므로 DB로부터 엔티티를 조회해서 1차 캐시에 저장합니다. 출력..