[TIL] 20220627 프로젝트 코드리뷰

wally·2022년 6월 27일
0

TIL

목록 보기
1/1
  1. dataJpa 쿼리 적용
Optional<SneakerStock> findBySneakerAndSize(Sneaker sneaker, int size);
  • dataJpa 를 사용하는 경우 findBy 를 사용해도 결국 id 를 통해 값을 가져오기 때문에 직접 쿼리를 적어주는것이 좋다.
  • 하지만 직접 쿼리를적어주면 dataJpa 가 제공해주는 기본기능을 사용하지 못하는 것이기 때문에 querydsl 을 활용하자
  • 또한 연관관계를 많이 활용하는것이 좋다. 즉 erd 를 통해 좀더 활용성을 높이자
  1. requestParam 검증
  1. 코드 개선
    private void saveSneakerItem(ServiceDrawSaveDto drawSaveRequest, Long sneakerId, Sneaker sneaker, Draw draw) {
        drawSaveRequest.sneakerItems().forEach(
                (sneakerItem) -> {
                    int size = sneakerItem.size();
                    SneakerStock sneakerStock = sneakerStockRepository.findBySneakerAndSize(sneaker, size)
                            .orElseThrow(() -> new EntityNotFoundException(
                                    format("SneakerStock 엔티티를 sneaker 와 size 로 찾을 수 없습니다. sneakerId : {0}, size : {1}", sneakerId, size)));

                    // SneakerStock 에서 재고를 가지고와 SneakerItem 을 만든다.
                    Stock stock = sneakerStock.getStock();
                    stock.decreaseQuantityBy(sneakerItem.quantity());
                    sneakerStockRepository.flush();

                    sneakerItemRepository.save(
                            SneakerItem.builder()
                                    .sneakerStock(sneakerStock)
                                    .quantity(sneakerItem.quantity())
                                    .draw(draw)
                                    .size(size)
                                    .build()
                    );
                }
        );
    }
  • stream 내부에서 변경된 엔티티를 새로운 엔티티의 매개변수로 넣으면 DataIntegrityViolationException 오류가 발생한다. 이를 방지하기 위해 중간에 flush 를 사용하였다.
  • 추가적인 코드 개선방법으로는 데이터 변경 로직을 stream 외부로 빼서 flush 를 제거하는 것이지만 현재 코드 흐름상 더 좋은 방법은 떠오르지 않았다.

추후 코드 개선을 시도하였지만 실패하였다. erd 초기 설계가 중요한것 같다.

profile
클린코드 지향

0개의 댓글