1. 상황외부 API를 사용할 때마다 로그를 DB에 저장 -> 데이터가 너무 많이 쌓여서 데이터를 삭제하는 스케줄러 작성 ->데이터를 한번에 70만 건을 삭제하려고 하니깐 OutOfMemoryException이 발생! 2. 원인public interface ApiLogRepository extends JpaRepository, CustomApiLogRepository{ void deleteApiLogsByRegistrationDateLessThan(LocalDateTime localDateTime);} 위 메서드가 문제였다. 나는 쿼리를 DB에 직접 날려서 삭제하는 줄로 알았더니 위와 같이 작성하면 데이터를 모두 조회한 다음에 delete 쿼리를 일일이 날림! 즉 메모리에 대용량 데이터를 불러오니깐..
JPA
예제 Entity [Querydsl] 환경설정 및 기본 문법 프로젝션과 결과 반환 - 기본 결과 반환의 타입이 여러개인 경우엔 Querydsl에서 제공해주는 Tuple 사용 // 프로젝션과 결과 반환 -기본 // Tuple은 외부로 노출 되는 것은 바람직하지 않음(querydsl에서 제공해주는 tuple이기 때문) @Test public void eimpleProjection(){ List result = queryFactory .select(member.username) .from(member) .fetch(); for (String s : result) { System.out.println("s = " + s); } } @Test public void tupleProjection(){ List res..

환경설정연습용 프로젝트 준비 start.spring.io에서 Dependencies 추가spring.web lombokh2data jpabuild.gradle에 querydsl 추가 plugins { // queryDSL 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"}// spring boot 3.x 버전 이상 Querydsl 추가dependencies { implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl..
사용법 실습용 Member Entity // Member Entity package study.demo.Entity; import jakarta.persistence.*; import lombok.*; @Entity @Setter @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id","username","age"}) public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne @JoinColumn(name = "team_id") ..

컬렉션 조회 - Dto OrderItems는 Order와 1대다 관계이며, 지연로딩 전략을 사용하고 있는 Entity이다. 따라서 프록시를 초기화 때마다 쿼리문이 나감(성능 이슈) OrderItems도 Entity이기 때문에 외부에 그냥 노출이 되지 않게 조심해야함. @GetMapping("/api/v2/orders") public List ordersV2() { // 쿼리가 많이 나가는 버전. List orders = orderRepository.findAllByString(new OrderSearch()); List collect = orders.stream().map(o -> new OrderDto(o)) .collect(Collectors.toList()); return collect; } @Da..

목표 주문, 배송정보, 회원을 조회하는 API 만들기 지연 로딩 때문에 발생하는 성능 문제를 단계적으로 해결해보기(중요) 샘플 데이터 입력 package jpabook.jpashop; import jpabook.jpashop.domain.*; import jpabook.jpashop.domain.item.Book; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import javax.persistence.Enti..