문제 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..
문제 Hibernate 사용 시 Query Plan Cache 객체를 너무 많이 생성하면, OutOfMemoryError가 발생할 수 있다. https://meetup.toast.com/posts/211 DBA와 개발자가 모두 행복해지는 Hibernate의 in_clause_parameter_padding 옵션 : NHN Cloud Meetup Java ORM 기술의 표준 명세인 JPA가 소개된 지 참 오래되었지만, 국내 현실상 대규모 시스템에서 적용되어 사용된 운영 경험이 충분히 쌓이지 않고 공유되지도 않는 것 같습니다. meetup.toast.com 따라서 Hibernate Query Plan Cache 옵션을 설정하여, OutOfMemoryError를 예방할 수 있다. https://medium.c..
프로젝트를 진행하다가 Entity를 제대로 설계하지 않아서 MappingException: Repeated column in mapping for entity 에러가 발생했고, 이와 관련해서 간단히 정리해봤습니다.문제 상황 (예시) EntityA @Entity @NoArgsConstructor public class EntityA { @Id @GeneratedValue private Long id; @Column(name = "member_id") private Long memberId; public EntityA(Long memberId) { this.memberId = memberId; } } EntityB EntityB에는 Long 타입의 memberId 필드를 선언했고, OneToOne 관계의 E..