JVM/JPA

JVM/JPA

[Hibernate] 설정 옵션 목록

spring: jpa: properties: hibernate: query: plan_cache_max_size: 1 plan_parameter_metadata_max_size: 1 주로 위와 같이 yaml, properties 를 사용해서 하이버네이트 옵션을 주곤 한다. 자주 사용하는 옵션 외에는 어떤 옵션이 있는지 헷갈릴 때가 있고, 혹은 코드로 직접 옵션을 줄 때 옵션 별로 상수로 직접 구현할 필요 없이 이미 구현된 상수를 발견해서 기록한다. 아래 AvailableSettings는 hibernate-core에 있는 하이버네이트 옵션을 상수로 표현한 인터페이스다. hibernate-envers 또한 상수로 정의되어 있다. 클래스명 - EnversSettings 수동으로 코드에서 옵션을 변경할 때 경로..

JVM/JPA

[JPA] 트랜잭션 overrideafterCommit, beforeCommit ...

커밋 이전/이후에 추가적인 작업을 진행하고 싶을 때가 있다. @Transactional fun test() { TransactionSynchronizationManager.registerSynchronization(object : TransactionSynchronizationManager(), TransactionSynchronization { override fun afterCommit() { // ... 로직 } }) // ... db 작업 시작 } 트랜잭션 시작하는 메소드 맨 위에 위와 같이 TransactionSynchronizationManager.registerSynchronization를 사용하면 된다. TransactionSynchronization 에서 다양한 메소드가 있으니 본인이 필..

JVM/JPA

[QueryDSL] return 으로 Map(집합) 받기

😀서론 테이블 목록을 가져와 목록에서 ID를 통해 내부 정보를 여러 번 조회할 일이 있었다. 쿼리에서 List 로 조회해서 for문으로 돌리기에는 중복된 ID를 여러 번 조회할 수도 있고, 결국 ID를 통해 다른 값들을 얻고 싶은 게 목표 이기에 QueryDSL에서 return으로 Map도 받을 수 있는지 찾게 되었고, 찾아서 정리를 해본다. 🙄준비 위 데이터를 기준으로 결과 값 확인을 진행합니다. 🙂본론 Querydsl에서는 결과 집합(aggregation) 이라는 걸 제공해주는 걸 알았습니다. 결과 처리 방법 쿼리에서 데이터 조회 후 메모리에서 결과에 대한 집합 연산을 수행하는 집합 함수를 의미 합니다. 간단한 예시로 살펴보겠습니다. 1️⃣Map Value 하나 받기 select는 transform에..

JVM/JPA

[JPA] save() isNew를 사용하여 성능개선 하기

😎 서론 사내 모든 프로젝트에서는 데이터베이스에 값을 저장할 때 아이디를 유니크한 값으로 자동생성해주는 로직을 만들어 별도로 태운 후 save()를 하게 된다. 결국 이로 인해 처음 INSERT를 하기 위해서 save를 보낸 모든 데이터 또한 SELECT를 꼭 호출하고, INSERT를 호출하게 되는 문제가 있다. 이는 데이터가 많으면 많을 수록 성능저하에 큰 문제가 있기에 이 로직을 파악하고 성능개선하는 방법을 공유해본다. 😉 본론 ⏳ save() 로직 파악하기. SimpleJpaRepository 클래스에 있는 save()메소드는 아래와 같이 동작을 한다. @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity ..

JVM/JPA

[QueryDSL]like, contains 차이

서론 회사에서 자체프레임워크를 사용하다보니 기본으로 제공되는 like와 contains를 잘 사용할 일이 없었다. 그러다 최근에 사용할 일이 있어 like를 사용하게 되었는데, 원했던 어디든 포함이 되는 like가 진행되지 않아 찾아보게 되었다. 본론 둘 다 쿼리가 날라가는 것은 LIKE로 날라가지만 contains는 앞 뒤로 %를 자동으로 붙여주고, ex) %튀김% like는 입력한 그대로 날라간다. ex) 튀김 사용 예 contains : 앞, 중앙, 뒤 상관 없이 문자가 포함이 되는지 확인하고 싶을 때 like : 앞, 중앙, 뒤 원하는 곳에 포함이 되는지 확인하고 싶을 때 직접 %를 붙여서 사용

JVM/JPA

[QueryDSL] 표현식 정리

queryDSL을 작성할 때 자주 안 쓰는 친구들은 쓸 때마다 헷갈려서 공식사이트에서 그대로 가져와봤습니다. //Standard Alternative expr isNotNull expr is not(null) expr isNull expr is null expr eq "Ben" expr === "Ben" expr ne "Ben" expr !== "Ben" expr append "X" expr + "X" expr isEmpty expr is empty expr isNotEmpoty expr not empty // boolean left and right left && right left or right left || right expr not !expr // comparison expr lt 5 expr ..

JVM/JPA

[JPA] PostgreSQL @Lob 에러

- 첫 작성일 : 21년 2월 14일 velog 블로그 @Lob 이란? JPA 어노테이션 중 하나로 db 문자열을 길이제한 없이 text로 사용할 수 있도록 연결해주는 녀석입니다. 버그내용 PostgreSQL에서 @Lob을 사용하여 get으로 정보를 불러올 때 Large Objects in auto-commit mode 와 같은 에러가 발생하게 됩니다. 해결방법 @Lob 대신 @Column(columnDefinition="TEXT") 사용 2021-04-23 추가내용 kdhyo98.tistory.com/35 [PostgreSQL] CLOB타입과 TEXT타입 - JPA 🤸‍♂️서론 예전에 @Lob 에러 관련 글을 적은 적이 있다. 당시에는 postgresql에서 @Lob을 아예 사용할 수 없는 줄 알고 @..

JVM/JPA

[QueryDSL] Date 별 Group By 는 Expressions.dateTemplate !! 혹은 StringTemplate ??

서론 --- 회사에서 일 별 합계를 구해야 하는 페이지를 제작 중에 시간까지 저장되어 있는 쿼리를 어떻게 변환하여 적용하는 지에 대해 꽤 오랜 시간을 찾다가 깨닫게 되어서 글을 작성해본다. 본론 -- dsl에 있는 메소드인 'Expressions.stringTemplate' 를 사용하면 된다. DateTemplate formattedDate = Expressions.dateTemplate(LocalDateTime.class, "DATE_FORMAT({0}, {1})", qItem.loadDt, "%d/%m/%Y"); DateTemplate formattedDate = Expressions.dateTemplate(LocalDateTime.class, "DATE_FORMAT({0}, {1})", qItem...

Hyo Kim
'JVM/JPA' 카테고리의 글 목록