반응형
현재 필자는 JavaFX라는 GUI 라이브러리를 사용해 PDF 책을 편하게 볼 수 있는 PDF 뷰어 프로그램을 만들고 있다.프로그램을 만들면서 처음 계층형 구조를 갖는 테이블을 구축하게 되었는데초기에는 어떤 문제가 있었고 이를 어떻게 점차 개선했는지에 대해 기록하려고 한다.계층형 구조를 가진 북마크 구현하기우선 계층형 구조를 가진 북마크의 구현은 다음과 같이 되어 있다.북마크의 계층형 구조를 구현하기 위해 자기 참조와 양방향 연관관계를 사용했다.@Entity@Getter@Table(name = "pdf_bookmark")@ToString(exclude = {"document", "parent", "children"})@NoArgsConstructorpublic class PDFBookmark { @..
MySQL Bulk Insert 적용하기spring: datasource: url: jdbc:mysql://localhost:3306/db?rewriteBatchedStatements=true jpa: properties: hibernate: jdbc: batch_size: 50 # 드라이버에 일괄 처리를 요청하기 전 hibernate가 일괄 처리할 쿼리의 최대 개수 order_inserts: true # 삽입되는 엔티티 유형과 기본 키 값을 기준으로 재정렬 order_updates: true # 변경되는 엔티티 유형과 기본 키 값을 기준으로 재정렬주의할점으로는 IDENTITY ID 전략은 배치 INSERT를 사용할 수 없다.I..
"@Transactional(readOnly = true)를 사용하면 성능이 좋아진다."라는 말들을 들어봤을 것이다.그렇다면 왜 성능이 좋아지는 걸까? 그리고 항상 좋을까?에 대해 이번 포스팅에서 알아보려한다.JPA, RDBMS 둘다 최적화가 이뤄지기 때문에 각각 어떤 성능 최적화가 이뤄지는지 알아볼 것이다.(참고로 RDBMS는 MySQL 8.0 버전에 대해 다룬다.)JPA 수준의 최적화일반 트랜잭션의 경우 트랜잭션이 커밋될 때 JPA는 FlushMode.AUTO가 기본값이기 때문에 영속성 컨텍스트를 자동으로 플러시한다.하지만 @Transactional(readOnly=true)로 설정하면 Hibernate가 FlushMode를 MANUAL로 설정하여명시적으로 flush를 호출하지 않는 이상 flush가..
저번 포스팅에서 순수 JPA를 통해 페이징을 적용하는 방법에 대해 알아보았다. Spring Data JPA를 사용하면 정말 편리하게 PageRequest를 따로 만들필요없이 페이징 적용이 가능하다. 하지만 Spring Data JPA도 Page와 Pageable 인터페이스를 사용하기 때문에 해당 인터페이스에 대한 설명은 아래 포스팅을 참고하는 걸 추천한다. [JPA] 페이징과 정렬에 대해 알아보자. 페이징 (Pageable, Page, Slice ) 데이터베이스의 대용량 데이터를 처리할 때, 데이터를 효율적으로 로드하고 출력하기 위해 페이지 단위로 데이터를 분할하여 가져오는 기능을 페이징이라고 한다. 페 hstory0208.tistory.com 페이징 적용 파라미터로 Pageable 인터페이스를 받고 다..
Spring Data JPA는 JPA가 제공하는 엔티티 그래프 기능을 편리하게 사용하게 도와주는데, 이 기능이 바로 @EntityGraph이다. JPQL로 fetch join을 직접 작성하지 않고 @EntityGraph 어노테이션을 붙임으로서 fetch join을 편리하게 사용할 수 있다. 즉, @EntityGraph는 fetch join을 적용해주기 때문에 N + 1 문제를 해결하고, 성능 최적화에 도움을 줄 수 있다. (fetch join의 간편 버전) fetch join 이란? => 2023.06.12 - [JAVA/JPA] - [JPA] JPQL의 fetch join(패치 조인)이란? 사용 방법 Member와 Team 엔티티가 있고 이 둘은 "1 : 다" 양방향 관계를 갖는다고 가정해보자. 이 때..