문제 spring boot 3.2.1 버전을 사용하고 있으며, 이에 따라 org.hibernate.orm:hibernate-core:6.4.1.FINAL 버전을 사용하고 있었다. JVM 및 MySQL TimeZone 설정이 Asia/Seoul 값으로 되어 있음에도 UTC 값으로 저장되는 이슈였다. Hibernate 로그 살펴보기 application.yml 파일에 아래 옵션들을 추가하고, hibernate sql 로그를 살펴보기로 했다. logging: level: org: springframework: orm.jpa: debug hibernate: SQL: debug orm.jdbc.bind: trace # Spring Boot 3.x 이상 부터는 'orm.jdbc.bind' 를 사용해야 바인딩 된 쿼..
문제 사내에서 개발하던 중, @EmbeddedId가 선언된 Entity가 있었고, 해당 Entity는 @EmbeddedId를 기준으로 여러 개의 Row를 갖고 있는 상황이었다. 이때, Entity를 리스트로 조회하게 되면 아래와 같이 중복된 것처럼 보이는 조회 결과를 반환했다. (테이블과 소스 코드는 다시 재구성했다.) audit_revision 테이블 CREATE TABLE `audit_revision` ( rev BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY, created_datetime DATETIME(6) NULL ); AuditRevision 엔티티 @Entity @RevisionEntity @Table(name = "audit_revision") class Au..
분산된 서버 환경에서 트랜잭션 처리 분산된 서버 환경에서 현재 API의 트랜잭션 내부에서 쿼리를 실행하고, 외부 API 요청을 통해 또 다른 트랜잭션을 처리하는 상황에서 데이터 일관성을 어떻게 유지하며, 언급한 방법으로 처리할 때의 장점과 단점은 무엇인지 고민해 봤다. 그다음에 외부 API 요청에 의해 또 다른 트랜잭션이 실행되는 부분을 현재 API의 트랜잭션이 커밋되고 나서 실행시켰을 때 데이터 일관성을 어떻게 유지하며, 장점과 단점은 무엇인지 고민해 봤다. 정리한 내용 https://github.com/bestdevhyo1225/dev-log/blob/master/MSA/MSA-Distributed-Transaction.md
MySQL Architecture InnoDB 스토리지 엔진 복습 지금까지 InnoDB 스토리지 엔진을 사용하면서, Index는 In-Memory 구조에 생성되고, Table Data는 On-Disk 구조에 생성되는 줄 알았는데, 잘 못 알고 있었다. Table의 Data와 Index는 모두 InnoDB 스토리지 엔진 On-Disk 구조의 Tablespace에 생성된다는 것을 알게 되었으며, 조금 더 자세하게는 File-Per-Table Tablespace에 단일 파일(.ibd 파일)에 Table Data와 Index가 생성된다. 정리한 내용 https://github.com/bestdevhyo1225/dev-log/blob/master/MySQL/MySQL-Architecture-InnoDB-OnDis..
MySQL 쿼리 사용 시, IN절 최적화 MySQL 쿼리 사용 시, IN절을 자주 사용하는 편이다. 지금까지 알고 있었던 내용으로 IN절은 최대 1,000개까지 사용해도 성능에 크게 문제가 없을 줄 알았다. 그런데 1,000개를 사용해도 MySQL 옵션에 따른 옵티마이저의 실행 계획에 따라 성능이 좋지 않을 수도 있다는 것을 알게 되었다. 상황에 따라 1,000개까지 사용하고 싶다면, IN절의 개수를 조금씩 늘려가면서 성능 테스트를 진행해야 한다는 것도 추가로 알게 되었다. 주요 키워드 Index Range Scan, index dive Index Range Scan, index statistics MySQL의 eq_range_index_dive_limit 옵션 MySQL의 range_optimizer_..
Hibernate 구현체에서 Auto Commit 최적화 방법 Hibernate 사용하면서, 서비스 상황에 따라 Auto Commit 상태를 최적화하는 방법에 대해서 공부했고, Hibernate 구현체는 Database Connection Pool의 Auto Commit 설정 상태를 신뢰하지 않는다는 것을 알게 되었다. 정리한 내용 https://github.com/bestdevhyo1225/dev-log/blob/master/JPA/Hibernate_AutoCommit.md GitHub - bestdevhyo1225/dev-log: :memo: Record :memo: Record. Contribute to bestdevhyo1225/dev-log development by creating an acc..
Spring Batch 복습 Spring Batch의 Step에서 Chunk 처리를 하다가 에서 예외로 인해 처리가 실패한 경우, Batch Job을 재실행하면 실패한 Chunk부터 처리된다는 것을 알게 되었다. Spring Batch Starter 버전은 3.1.0이며, Spring Batch Core 버전은 5.0.2이다. 단일 Step chunkSize 값이 2이고 데이터가 10건이면, 2건씩 쪼개서 작업하기 때문에 총 5번을 통해 Batch 작업이 마무리된다. 근데 이때, 2번째 작업에서 실패한 경우, 재실행하면 2번째부터 이어서 작업한다. 파티셔닝 기반의 멀티 스레드 Step 파티셔닝 기반의 멀티 스레드로 Step을 병렬적으로 처리하는 경우에는 당연히 실패 지점부터 다시 처리되지 않을 줄 알았는..
강의 수강 패스트 캠퍼스의 백엔드 개발자를 위한 한 번에 끝내는 대용량 데이터 & 트래픽 처리 초격차 패키지 Online. 강의에서 Redis를 활용해서 LeaderBoard를 구현했다. 사용했던 Redis 명령어를 간단히 정리하고자 한다. 사용했던 Redis 명령어 Redis 자료구조에서 정렬을 잘 관리할 수 있는 SortedSet(ZSet) 자료구조를 사용했다. 유저의 스코어 등록 zadd(key, value, score) 특정 유저의 랭크 조회 zrevrank(key, value) 탑 랭커 리스트 조회 zrevrange(key, start, end) 정리 순위로 나타낼 수 있는 다양한 대상에 응용이 가능하다는 것을 배웠다. 최대 구매 상품순으로 유저에게 상품을 노출한다던지 상품의 리뷰순으로 유저에게..
2023.06.06 [OS] 컨텍스트 스위칭 복습 [OS] CPU Bound, I/O Bound 공부 2023.06.07 [OS] 스핀락, 뮤텍스, 세마포어 복습 2023.06.10 [Java] NIO 공부 및 실습 예제 만들기 [OS] 모니터 복습 [OS] 교착상태 복습 2023.06.12 [Java] 스레드 상태 정리 2023.06.13 [OS] 인터럽트와 시스템 콜 공부 2023.06.14 [OS] 스레드 종류(하드웨어, OS, 네이티브, 커널, 유저, 그린 스레드) 공부
JPA Batch Insert 복습 Batch Insert 지원하는 경우 @GeneratedValue(strategy = GenerationType.Sequence) @GeneratedValue(strategy = GenerationType.TABLE) @GeneratedValue 애노테이션을 설정하지 않고, 직접 ID 생성하는 경우 Batch Insert 지원하지 않는 경우 @GeneratedValue(strategy = GenerationType.IDENTITY) 테스트 환경 설정 spring.datasource.url 에 rewriteBatchedStatements=true 추가 spring.jpa.properties.jdbc.batch_size=50 설정 spring.jpa.properties.o..