Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 혼자 공부하는 C언어
- Serialization
- C 언어 코딩 도장
- R
- s
- list 컬렉션
- buffer
- 이스케이프 문자
- datastructure
- JSON
- 알기쉬운 알고리즘
- Algorithm
- insertion sort
- C programming
- 윤성우 열혈자료구조
- 이것이 자바다
- coding test
- stream
- Stack
- 윤성우의 열혈 자료구조
- Selection Sorting
- 메모리구조
- Graph
Archives
- Today
- Total
Engineering Note
[JPA] 지연로딩 개념 본문
지연로딩(Lazy loading)
: 객체와 연관된 데이터가 실제로 사용될 때까지 데이터베이스에서 로드하는 것을 지연시키는 전략.
아래와 같이 Order Entity가 있고, Member Entity와 Delivery Entity가 연관관계를 맺고 있다.
package jpabook.jpashop.domain;
import static jakarta.persistence.FetchType.LAZY;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table(name = "orders")
@Getter
@Setter
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "member_id")
private Member member;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne(fetch = LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "delivery_id")
private Delivery delivery;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus status;//주문상태 [ORDER, CANCEL]
//==연관관계 메서드==//
public void setMember(Member member) {
this.member = member;
member.getOrders().add(this);
}
public void addOrderItem(OrderItem orderItem) {
orderItems.add(orderItem);
orderItem.setOrder(this);
}
public void setDelivery(Delivery delivery) {
this.delivery = delivery;
delivery.setOrder(this);
}
//==생성 메서드==//
public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) {
Order order = new Order();
order.setMember(member);
order.setDelivery(delivery);
for (OrderItem orderItem : orderItems) {
order.addOrderItem(orderItem);
}
order.setStatus(OrderStatus.ORDER);
order.setOrderDate(LocalDateTime.now());
return order;
}
//==비즈니스 로직==//
/**
* 주문 취소
*/
public void cancel() {
if (delivery.getStatus() == DeliveryStatus.COMP) {
throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능합니다.");
}
this.setStatus(OrderStatus.CANCEL);
for (OrderItem orderItem : orderItems) {
orderItem.cancel();
}
}
//==조회 로직==//
/**
* 전체 주문 가격 조회
*/
public int getTotalPrice() {
int totalPrice = 0;
for (OrderItem orderItem : orderItems) {
totalPrice += orderItem.getTotalPrice();
}
return totalPrice;
}
}
List<Order> all = orderRepository.findAllByString(new OrderSearch());
Order 테이블을 조회하는 findAllByString메서드를 사용하는 API를 호출 할 때, Lazy 로딩이 설정되어 있다면, Order Entity가 Member와 Delivery로 연결되어 있다고 하더라도 실제 데이터베이스에서 Member 테이블과 Delivery 테이블을 조회하지 않는다.(proxy 객체로 채워진체 인스턴스를 생성한다.)
@GetMapping("/api/v1/simple-orders")
public List<Order> ordersV1() {
List<Order> all = orderRepository.findAllByString(new OrderSearch());
return all;
}
String jpql = "select o From Order o join o.member m";
지연 로딩 설정된 데이터를 조회하는 시점.
아래 처럼 order객체를 조회하고 order객체에서 .getMeber().getName() 호출 하면 이때 실제로 Member 테이블에 대한 조회 쿼리가 실행된다.(.getMember()까지 조회한 시점에는 아직 프록시 객체로 채워지고 데이터베이스에 쿼리가 실행되지 않는다.
@GetMapping("/api/v1/simple-orders")
public List<Order> ordersV1() {
List<Order> all = orderRepository.findAllByString(new OrderSearch());
for (Order order : all) {
order.getMember().getName(); //Lazy 강제 초기화
order.getDelivery().getAddress();
}
return all;
}
'Server > JPA ORM' 카테고리의 다른 글
[JPA] JPA 동작 방식 (0) | 2025.09.08 |
---|---|
[JPA] 지연로딩(Lazy Loading)으로 인한 N+1 문제 (0) | 2025.08.22 |
[JPA] EntityManagerFactory, EntityManager (0) | 2025.07.10 |
[JPA] @Enumerated 어노테이션 (0) | 2025.06.21 |
[JPA] 데이터베이스 스키마 자동 생성 - 속성 (0) | 2025.06.21 |
Comments