스프링부트 쇼핑몰 프로젝트 | 7 주문

Yunny.Log ·2022년 5월 30일
0

Spring Boot

목록 보기
61/80
post-thumbnail

동기 vs 비동기

1) 동기

  • 같은 일을 동시에 진행
  • 작업 처리 단위를 동시에 처리
    (ex) 입금, 송금 -> 두개가 다르게 일어나면 돈을 보내도 돈이 줄지 않고, 그런 요상한 상황 발생

2) 비동기

  • 서로의 행위(목적)가 다르기때문에 둘의 작업 처리 시간은 일치하지 않고, 일치하지 않아도 됩니다
  • 작업 처리 단위를 동시에 처리하지 않아도 된다.
    (ex) 시험과 채점!
    출처 블로그 :
    https://private.tistory.com/24

날짜 형식의 필드 받기

책 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;

성능 향상 part

N+1 문제란?

하위 엔티티들을 첫 쿼리 실행시 한번에 가져오지 않고, Lazy Loading으로 필요한 곳에서 사용되어 쿼리가 실행될때 발생하는 문제가 N+1 쿼리 문제
출처 : https://jojoldu.tistory.com/165

사진 출처 : https://jojoldu.tistory.com/457

=> so 연관관계가 맺어진 Entity를 한번에 가져오도록 해야한다

이를 해결하기 위한 방법은 ?

1) FetchType 을 모두 Lazy로 설정해준다.
2) 레포지토리에서 JPQL 쿼리문을 사용해서, JOIN FETCH문을 날려준다.

다만 문제점 존재

1) 패치조인 사용 시 페이지네이션 기능 사용 불가
2) 복수의 1:N 은 사용 불가하다.
(ToOne은 몇개든 사용 가능 / ToMany는 1개만 가능합니다.)

=> 이런 식으로 일대N의 관계가 두개 들어가면 서버가 돌아가지 않는다.

일대N의 관계가 두개이상에 대한 해결책은 ?

=> Batch 사용 (책에도 나와있던 것과 같이!)

  • @OnetoMany 위에 @BatchSize(size=정수) 형태로 명시를 해준다.
    : sql 의 in을 활용해서 join fetch에 포함시킬 수를 추가해주는 것
    => join fetch JPQL 쿼리문 대신 BATCH로 수행한다면 페이징도 가능해진다. (원하는 컬럼위에 BATCH를 명시해주면 됨)

설명 출처 : https://www.youtube.com/watch?v=IY-zs9dteOA

N+1 문제 해결하기

  • 전혀 이런 문제들을 고려하지 않고 마구 레포지토리를 짰던 결과 ..

left 가 기존, 오른쪽이 join fetch 사용

=> 나중에 다 리팩토링 진행

1:N 관계에서

  • N에 해당하는 엔티티를 Fetch join하면 문제없이 N+1문제를 해결 할 수 있다.
  • One To Many의 관계를 갖는 엔티티간의 조회를 할 때 발생하는 문제이다.
  • N개의 엔티티를 모두 가져오기위해 1개의 쿼리가 발생하고, 그 엔티티가 같이 조회되어 예상치 못한 N개의 쿼리가 추가로 나가게 된다.

출처 : https://velog.io/@kshired/N1-%EB%AC%B8%EC%A0%9C%EB%A5%BC-%EC%9C%84%ED%95%9C-Fetch-Join-Test

0개의 댓글