본문 바로가기
728x90

전체 글110

[Spring] JPA 더티 체킹 (Dirty Checking) Querydsl 벌크 업데이트 대해서 글을 정리하려고 했는데 더티 체킹에 대한 내용이 있어서 먼저 더티 체킹에 대해 글을 써보려 한다. JPA 더티 체킹(Dirty Checking) Transaction안에서 Entity의 변경 상태를 확인하는 과정을 말한다. 즉, Entity의 상태 변경 검사를 뜻한다. Transaction은 두 가지 방식을 사용한다. 1. Class 또는 Method에 @Transactional Annotation을 사용하는 방식 @Transactional public void updateUser(Long id, String name) { Player player = playerRepository.findById(id); player.setName(name); } 2. EntityT.. 2022. 11. 25.
[Spring] Querydsl 서브 쿼리 적용하기 JPQL은 FROM절의 서브 쿼리를 지원하지 않는다. JPQL에서 지원하지 않는다는 것은 Querydsl도 동일하게 지원하지 않는다는 것이다. 그래서 서브 쿼리를 충족시키기 위해 Querydsl에 우회 코드를 만들어보자. SELECT * FROM shop s join (SELECT id FROM shop where id < 100 ORDER BY id LIMIT 10, 10) as tmp on tmp.id = s.id 위의 서브 쿼리 조건을 아래와 같이 Querydsl에 적용하였다. Cluster Key(PK)를 커버링 인덱스로 빠르게 조회한 PK 값들을 Where 절에 적용하여 별도로 필요한 SELECT 칼럼들을 추가 조회하였다. 즉, 위의 쿼리에서는 where, orderBy, limit 절 까지는 .. 2022. 11. 24.
[Spring] Querydsl Group By 성능 개선 기본적으로 Mysql에서 Group By를 실행하면 실행 계획 Extra 컬럼에 Using temporary 또는 Using filesort가 발생된다. Using Temporary (임시 테이블) Group By 할때 Mysql 엔진이 스토리지 엔진으로부터 받아온 레코드를 내부적으로 임시 테이블을 생성해서 사용한다. 메모리로 테이블을 생성했다가 테이블의 크기가 커지면 디스크로 옮겨지는 특성이 있기 때문에 디스크에 생성되면 이때 성능 이슈가 발생된다. Using filesort (드라이빙 정렬) 요구하는 조건이 인덱스를 통해 정렬을 할 수 없다면 FileSort를 사용하게 된다. 임시 테이블의 정렬도 FileSort에 해당된다. 그러므로 FileSort는 레코드가 많아질수록 성능이 많이 떨어지게 된다. .. 2022. 11. 23.
[Spring] Querydsl Select 성능 개선 1. 테스트 테이블 관계 생성 @Entity public class Shop { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long shopNo; private String name; @OneToOne(mappedBy = "shop") private License license; } @Entity public class License { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long licenseNo; private String name; @OneToOne @JoinColumn(name = "sho.. 2022. 11. 22.
300x250