반응형
현재 필자의 PDF 뷰어 프로그램은 PDF 책 파일을 열면 다음과 같이 해당 페이지의 이미지를 보여준다.(JavaFX GUI 라이브러리 + Spring Boot 사용) 페이지 이동은 다음과 같이 이동할 수 있는 상황이다.실제로 프로그램을 사용해보던 중 다음과 같은 문제가 있었다.페이지 이동 시 마다 이미지 렌더링 속도가 0.65초로 나왔고 이는 실 사용에서 버벅임이 느껴질 정도로 크게 체감됐다. 이 문제를 해결하기 위해 이미지를 캐싱해 렌더링 속도를 최적화하기로 했다.최적화하기 앞서 사용 패턴을 다음과 같이 분석해봤다.이전에 봤던 페이지들을 번갈아가며 이동한다.한 페이지씩 이동하며 페이지를 확인한다.이제부터 이 패턴을 바탕으로 어떻게 캐싱을 적용해 렌더링 속도를 최적화 했는지 포스팅하려한다.LinkedH..
현재 필자는 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가..
분산 시스템이 보편화되면서 효율적인 ID 생성 전략의 중요성이 더욱 커지고 있다.이번 포스팅에서는 DB에서 사용되는 여러 ID 생성 전략을 비교하고, Spring Boot와 JPA 환경에서의 구현 방법을 살펴보자.참고로, 각 전략의 장단점은 MySQL InnoDB 스토리지 엔진 기준으로 타 DBMS와는 차이가 있을 수 있다. Auto-Increment ID 전략Auto-increment는 가장 전통적인 ID 생성 방식이다.DB 테이블에 새 레코드가 삽입될 때마다 자동으로 증가하는 정수 값을 ID로 할당한다.@Entity@Table(name = "users")public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) /..