전체 글 954

커서

커서는 테이블의 한 행씩 처리하기 위한 방법. 이번엔 스토어드 프로시저에서 한 행씩 처리하는 방법 커서는 대부분 스토어드 프로시저와 함께 사용 됨 이게 커서 저 화살표 하나씩 처리하는 delimiter $$ create procedure cursor_proc() begin declare memnumber int; declare cnt int default 0; declare totNumber int default 0; declare endofrow boolean default false; declare memcursor cursor for select mem_number from member; declare continue handler for not found set endofrow = true; op..

DB 2023.11.15

스토어드 함수

스토어드 프로시저와 비슷하지만 차이가 있다. 스토어드 프로시저는 여러 SQL문이나 숫자 계산 등의 다양한 용도로 사용하지만, 스토어드 함수는 어떤 계산을 통해서, return을 통해 하나의 값을 반환하는데 주로 사용한다. 스토어드 프로시저는 call로 사용했지만 이거는 select로 사용한다. 마치 sql 내장 함수인 듯 하다. delimiter $$ create function sumFunc(num1 int, num2 int) returns int begin return num1 + num2; end $$ delimiter ; delimiter $$ create function 함수명(인자1 타입, 인자2 타입) returns 반환타입 begin return 반환값; end $$ delimiter ; ..

DB 2023.11.15

13. 컬렉션 페이징 한계돌파

컬렉션 패치조인은 결국 JPA는 데이터를 일단 다 가지고 와 메모리에서 페이징을 하기 때문에, 데이터가 많을 경우 out of memory도 날 수 있고 생각보다 굉장히 위험하다. 지금부터 페이징 + 컬렉션 엔티티 함께 조회하는 효율적인 방법을 알아보겠다. 먼저, ToOne관계는(즉 나에게 1인) 모두 join fetch한다. row수를 증가시키지 않는다. 그래서 페이징 해도 상관이 없다. 그 다음 컬렉션은 그냥 LAZY 로딩인 상태로 둔다. 여기서 뭔가 작업을 해 둘거다. 일단은, ToOne 관계는 그냥 join fetch해서 가져온다. @GetMapping("/api/v3.1/orders") public List ordersV3_page(){ List orders = orderRepository.fi..

12. 컬렉션 -> 엔티티 join fetch 최적화

그냥 join fetch 해서 가져올 거다. @GetMapping("/api/v3/orders") public List ordersV3(){ List orders = orderRepository.findAllWithItem(); return orders.stream() .map(o-> new OrderDto(o)) .collect(Collectors.toList()); } public List findAllWithItem() { return em.createQuery("select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi" + " join fetch oi.item..

11. 컬렉션 엔티티를 Dto로

@GetMapping("/api/v2/orders") public List ordersV2(){ List orders = orderRepository.findAllString(new OrderSearch()); return orders.stream() .map(o-> new OrderDto(o)) .collect(Collectors.toList()); } 변환 작업을 거쳐야 한다. OrderDto라는 것을 만들었다. 그런데, Order에 있는 OrderItems 또한 엔티티이다. 그래서 이것 또한 변환작업을 해야 한다. @Getter static class OrderDto{ private Long orderId; private String name; private LocalDateTime orderDat..

10. 컬렉션 조회 최적화

지금까지는 컬렉션 조회해오지는 않았음. 그런 것들의 경우 그냥 join fetch로 해결 가능 컬렉션 조회는 일대다 조회가 됨. 뭐 테이블도 대충 이런 느낌임. 일단 단계적으로 할거임. 마찬가지로 엔티티 직접 노출 먼저 할거임. @GetMapping("/api/v1/orders") public List ordersV1(){ List result = orderRepository.findAllString(new OrderSearch()); for (Order order : result) { order.getMember().getName(); order.getDelivery().getAddress(); List orderItems = order.getOrderItems(); for (OrderItem orde..

스토어드 프로시저2

좀더 자세히 나갈 듯. https://qwefdg3.tistory.com/815 매개변수, 반환값 부분 더 나갈 듯. 매개변수를 in, return을 out 다시 remind 해 보자면(전청조 아님) delimiter $$ create procedure user_proc() begin select * from member; end $$ delimiter ; call user_proc(); delimiter $$ create procedure 프로시저명() begin ~~~ end $$ delimiter ; call 프로시저명(); --프로시저 호출 걍 미리 정해두는 함수 같은거. 여기서 이제 매개변수, return을 추가할거임. DB는 저렇게 drop 이런거 테이블, 스키마등 공통적으로 사용하는 부분이 ..

DB 2023.11.14

9. 바로 Dto로 받기

@GetMapping("/api/v4/simple-orders") public List ordersV4(){ return orderRepository.findOrderDtos(); } 바로 리포지토리에서 Dto로 가져오는 걸 정의하는 거다. public List findOrderDtos() { return em.createQuery("select new jpabook.jpashop.repository.OrderSimpleQueryDto(o.id, m.name, o.orderDate, o.status, d.address)" + " from Order o" + " join o.member m" + " join o.delivery d", OrderSimpleQueryDto.class) .getResultLis..

8. fetch join 최적화

@GetMapping("/api/v3/simple-orders") public List orderV3(){ List orders = orderRepository.findAllWithMemberDelivery(); List result = orders.stream() .map(o-> new SimpleOrderDto(o)) .collect(Collectors.toList()); return result; } 똑같은 데, 저 DB에서 가져오는 걸 findAllWithMemberDelivery()라는 걸 만들어서 가져올 거다. 메소드 이름이 거지같긴 한데, 보통은 주문이면 member와 delivery 가져와야 한다 이정도로 어느 정도 자주 쓰는 객체 그래프가 정해져 있기 때문에 그냥 findAll이라고 이름..