책 source
@Getter @Setter
public class OrderHistDto {
public OrderHistDto(Order order){
this.orderId = order.getId();
this.orderDate = order.getOrderDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
this.orderStatus = order.getOrderStatus();
}
private Long orderId; //주문아이디
private String orderDate; //주문날짜
private OrderStatus orderStatus; //주문 상태
private List<OrderItemDto> orderItemDtoList = new ArrayList<>();
//주문 상품리스트
public void addOrderItemDto(OrderItemDto orderItemDto){
orderItemDtoList.add(orderItemDto);
}
}
이런 방법도 있어요~
=> 필드 위에 어노테이션으로 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
붙여주면 됩니다.
@Data
@AllArgsConstructor
public class ProjectDto {
private Long id;
private String name;
private String projectNumber;
private String clientItemNumber;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
private LocalDate protoStartPeriod;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
private LocalDate protoOverPeriod;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
private LocalDate p1StartPeriod;
하위 엔티티들을 첫 쿼리 실행시 한번에 가져오지 않고, Lazy Loading으로 필요한 곳에서 사용되어 쿼리가 실행될때 발생하는 문제가 N+1 쿼리 문제
출처 : https://jojoldu.tistory.com/165
사진 출처 : https://jojoldu.tistory.com/457
1) FetchType 을 모두 Lazy로 설정해준다.
2) 레포지토리에서 JPQL 쿼리문을 사용해서, JOIN FETCH문을 날려준다.
1) 패치조인 사용 시 페이지네이션 기능 사용 불가
2) 복수의 1:N 은 사용 불가하다.
(ToOne은 몇개든 사용 가능 / ToMany는 1개만 가능합니다.)
=> 이런 식으로 일대N의 관계가 두개 들어가면 서버가 돌아가지 않는다.
=> Batch 사용 (책에도 나와있던 것과 같이!)
@OnetoMany
위에 @BatchSize(size=정수)
형태로 명시를 해준다.설명 출처 : https://www.youtube.com/watch?v=IY-zs9dteOA
left 가 기존, 오른쪽이 join fetch 사용
=> 나중에 다 리팩토링 진행
1:N 관계에서
- N에 해당하는 엔티티를 Fetch join하면 문제없이 N+1문제를 해결 할 수 있다.
출처 : https://velog.io/@kshired/N1-%EB%AC%B8%EC%A0%9C%EB%A5%BC-%EC%9C%84%ED%95%9C-Fetch-Join-Test