[트러블슈팅] JPA의 deleteAll() 대신 IN을 사용한 성능 최적화
·
프로젝트/FitTrip
📄 Describe작업 대상지금까지 별 생각없이 JPA의 일 대 다 관계, 엔티티들에 관해 JPA의 deleteAll()를 메소드를 사용했었다.하지만, API 테스트 중 로그의 쿼리를 확인하니 관련있는 엔티티 개수만큼 delete 쿼리가 나가는 것을 확인했다. FitTrip의 커뮤니티 서비스 기준 포럼 : 파일 -> 일 : 대 관계애서 포럼 한개를 삭제했을 때 파일의 개수만큼 delete 쿼리가 나간 것이다.이는 만약 한 포럼에 수십, 수백개의 파일이 존재한다면 쿼리 성능에 문제가 있을 수 있겠다는 생각이 들었다. 따라서, 단순하게 JPA의 deleteAll()를 사용하는 것이 아닌 IN을 사용하여 배치 삭제를 해야겠다는 생각이 들었다.  deleteAll() 예시 사진✅ Tasks작업 세부 내용위에서..
[QueryDSL] QueryDSL이란?
·
Spring/JPA
QueryDSL이란? 우선, DSL은 Domain Specific Language의 줄임말이다. 뜻은 특정 영역에 특화된 언어이다. 그렇기 때문에 QueryDSL은 쿼리 생성에 특화된 프레임워크이다. 우리가 QueryDSL를 사용하면 좋은 점이 무엇이 있을까? 그것에 관한 설명을 하기 전에 JPA와 JPQL에 관한 문제점에 대해 잠깐 알아보자. JPA JPA는 객체지향 어플리케이션과 RDBMS 사이의 패러다임 불일치를 해결해주는 역할을 하는 프레임워크이다. JPA 덕분에 우리는 객체지향 관점으로 개발할 수 있게 되고 JPA 프레임워크는 자동으로 SQL 쿼리문을 생성해준다. SQL문이 JPA에 의해 자동으로 생성되기에 개발자는 SQL 관점에서 프로그래밍을 하지 않아도 된다. 하지만, 그렇다하더라도 완전한 ..
Spring Pagination 연습
·
Spring/JPA
이번 포스팅에는 Spring Pagination에 대해 다뤄 볼 것이다. 구글, 네이버 카페, 커뮤니티 등 어떤 웹에서도 페이징 처리가 된 웹 형태를 자주 찾아볼 수 있다. 그렇다면 이렇게 페이징 처리하는 이유가 뭘까? 수많은 데이터가 DB에 존재한다고 했을 때, 페이징 처리를 하지 않고 모든 데이터들을 한 번에 뿌려준다면 해당 데이터들을 DB로부터 가져오는데 엄청난 시간이 소요될 것이다. 또한, 해당 데이터 자체를 들고 있어야 하기에 메모리에도 부담이 클 것이다. 하물며 사용자들이 그 수많은 데이터들을 다 보게 하는 것도 용이하지 못하다. 그래서, 모든 데이터들의 개수에 대한 기준을 만들어 해당 개수만큼 가져오는 페이징 형태를 사용하는 것이다. 페이징 처리를 적절히 활용하여 정렬 기준과 정렬 방식(오름..
Spring + Redis + S3 + 이메일 인증 + Docker + CI/CD - 5
·
프로젝트/토이 프로젝트
이번 글에서는 Order, Item에 관한 CRUD 구현과 관련 통합 테스트를 담은 내용이다. 하지만, 시작하기전에 앞 글에서 수정한 내용이 있다. 1. SecurityConfiguration 수정 주문과 관련된 사항들은 이메일 인증이 된 사용자들이 이용하는게 좋을 것 같다는 생각이 들어 관련하여 적용했다. public class SecurityConfiguration { ... @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ ... http.authorizeHttpRequests( authorize -> authorize.requestMatchers(EXCLUDE_URL.stream() .map(AntPa..
[SpringBoot] JPA Collection 페이징 처리
·
Spring/JPA
앞 JPA Collection 페치 조인 최적화 방법은 데이터가 뻥튀기 되기에 페이징 처리에 어려움이 있었다. 하지만, 다른 방법을 사용하면 Collection 페이징 처리가 가능한데 다음과 같은 방법을 따르면 된다. 방법 1. @XToOne(OneToOne, ManyToOne) 관계에 대해선 기존의 페치 조인을 활용한다. (컬렉션은 지연 로딩) @Override public List findAllWithMemberDelivery(Pageable pageable) { QOrder order = QOrder.order; QMember member = QMember.member; QDelivery delivery = QDelivery.delivery; return jpaQueryFactory .select(..
[SpringBoot] JPA Collection 페치 조인 최적화
·
Spring/JPA
Collection은 @ManyToOne가 아닌 @OneToMany를 사용하는 변수에 사용된다. 하지만, @OneToMany. 즉, 일대다 관계에서 Collection을 조회하면 데이터가 뻥튀기가 된다. 예를 들어, Order(주문), OrderItem(주문된 아이템)이 있다고 했을 때 관계의 주인은 OrderItem이다. 하지만, 관계의 주인(외래키)은 N인 OrderItem이 갖고 있으므로, Order를 기준으로 조인을 진행하면 데이터가 늘어난다. 그렇기에 반환시 중복된 데이터가 나오게 된다. 따라서, 기존의 페치 조인 최적화 쿼리와는 달리 jpql 혹은 querydsl에서 distinct를 추가 해주어야 한다. @Override public List findAllWithItem() { QOrder ..