JPA
-
하이버네이트 flush 순서에 주의하자JPA 2024. 10. 19. 20:20
대상독자하이버네이트 동작원리를 잘 모르고 사용했을 때 어떤 일이 발생할 수 있는지 궁금하신 분들 개요애플리케이션을 개발하던 중 하이버네이트의 동작원리를 잘 몰랐기 때문에 버그가 발생하게 되었습니다. 하이버네이트의 동작원리를 알아보면서 버그를 재현해보고 어떻게 해결할 수 있는지 정리해보고자 합니다. 하이버네이트란?하이버네이트(Hibernate)는 자바 애플리케이션과 관계형 데이터베이스 간의 상호작용을 간소화하기 위한 객체-관계 매핑(ORM) 도구입니다. 자바 클래스와 데이터베이스 테이블을 매핑하여, 자바 객체를 데이터베이스의 레코드로 변환하고 그 반대의 작업도 처리합니다. 이를 통해 개발자는 직접 SQL 코드를 작성할 필요 없이 데이터베이스와의 복잡한 상호작용을 처리할 수 있습니다. 하이버네이트를 ..
-
JPA로 JSON Column CRUD 해보기JPA 2024. 1. 3. 00:01
개요 JPA를 활용하여 JSON Column을 만들어보고 CRUD 튜토리얼을 수행해보고자 합니다. 실제 코드는 github을 참고해 주세요 RDB에서 JSON을 사용하는 이유는? 일부 비정형데이터가 예상하지 못하게 생긴 경우에는 NoSQL의 기술스택을 추가하여 사용하기보다는 RDB에 JSON 타입을 사용해 볼 수 있습니다. JSON을 사용했을 때 단점은? 데이터를 조회 후 핸들링하기가 기존보다 복잡해진다. JSON 타입 vs TEXT 타입 일반적으로 대용량 칼럼, 소용량 칼럼으로 비교해 보았을 때 JSON보다 TEXT 타입이 성능적으로 더 좋은 모습을 보여줍니다. 하지만 일부분을 변경하고자 해도 TEXT는 통째로 UPDATE 해야 하지만 JSON 타입은 특정 필드만 UPDATE 할 수 있고, 인덱스를 활..
-
QuerydslRepositorySupport FetchResults Deprecated 대안JPA 2023. 11. 12. 00:01
개요 QuerydslRepositorySupport를 활용하여 Paging을 구현하다가 FetchResults의 Deprecated를 발견하고 어떻게 대처했는지 기록하고자 합니다. QuerydslRepositorySupport란 무엇인가? QuerydslRepositorySupport에서 Paging을 처리하는 방법 FetchResults가 Deprecated 된 이유 대안 및 해결방안 QuerydslRepositorySuppprt란? public abstract class QuerydslRepositorySupport 추상클래스로써 QueryDsl을 편하게 사용하기 위해 구현된 클래스입니다. QuerydslRepositorySupport에서 Paging을 처리하는 방법 public JPQLQuery a..
-
[JPA] Page vs SliceJPA 2023. 10. 8. 00:01
개요 페이징을 처리하면서 Page, Slice, Window의 차이에 대해 명확하게 이해하고 넘어가고자 합니다. TestEntityRepository 준비 interface TestEntityRepository: JpaRepository { fun findPageBy(pageable: Pageable): Page fun findSliceBy(pageable: Pageable): Slice } Page Page는 일반적인 게시판 형태의 페이징에서 많이 활용됩니다. 예시 코드 @DataJpaTest class TestEntityTest @Autowired constructor( private val testEntityRepository: TestEntityRepository, ){ @PostConstruct..
-
QueryDSL 페이징에 QuerydslPredicateExecutor 활용하기JPA 2023. 10. 3. 00:01
QuerydslPredicateExecutor란? Predicate 인스턴스를 실행할 수 있도록 spring data에서 지원하는 인터페이스입니다. 반환값들을 보면 Page로 Predicate를 통해 페이징 된 결과를 받을 수 있습니다. 인터페이스의 네이밍을 보았을 때 Predicate를 기반으로 실행한다!라고 이해할 수 있습니다. Predicate란? Predicate를 직역하면 서술어라는 의미를 가집니다. 간단하게는 where 절에 들어가는 조건문을 뜻합니다. BooleanBuilder, BooleanExpression이 Predicate 인터페이스를 구현하고 있습니다. 사용법 QuerydslPredicateExecutor 인터페이스 상속받기 @Repository interface DeliveryJp..
-
QueryDSL으로 페이징 구현하기JPA 2023. 9. 18. 00:01
개요 페이지네이션에 대해 알아보다 보면 상황에 따라 offset 기반과 cursor 기반의 방식으로 구현할 수 있습니다. 이때 offset 방식을 활용하여 QueryDSL으로 쿼리를 구현해보고자 합니다. Offset과 Limit 그리고 성능 SELECT * FROM TABLE_NAME LIMIT 10 OFFSET 5000; offset절은 만약 N이 들어온다면 N번째행부터 읽겠다는 의미입니다. 예를 들어 5000이라면 5000번째 행부터 읽겠다는 의미입니다. Limit 절은 쿼리 결과에서 지정된 순서에 위치한 레코드만 가져오고자 할 때 사용됩니다. Limit에는 클라이언트가 요청한 크기 N이 들어가게 되고 offset을 통해 가져온 전체 데이터에서 상위 N개를 가져옵니다. 위 둘을 조합하게 되면 5000..
-
QueryDSL으로 동적쿼리 작성하기JPA 2023. 9. 17. 00:01
개요 조회쿼리를 작성해야 하는데 다음과 같은 요구사항이 있었습니다. 날짜를 저장하는 A칼럼, B칼럼이 존재한다. "A칼럼 조회", "B칼럼 조회"와 같은 Client의 입력으로 A칼럼 또는 B칼럼에 대해 특정기간에 해당하는 Entity를 조회한다. 동적 조건에 따라 2가지 케이스를 쿼리해야 합니다. A칼럼 조회가 들어오면 where 절에 A필드를 특정기간에 조회하는 쿼리 B칼럼 조회가 들어오면 where 절에 B필드를 특정기간에 조회하는 쿼리 A칼럼 조회가 들어오면 where 절에 A필드를 특정기간에 조회하는 쿼리예시 select * from my_table WHERE A = BETWEEN 조회시작시간 AND 조회끝시간 B칼럼 조회가 들어오면 where 절에 B필드를 특정기간에 조회하는 쿼리 select..
-
JPA Persistable으로 성능최적화 해보기JPA 2023. 9. 4. 00:01
개요 JPA에서 @GenerateValue를 사용하지 않고, ID를 직접 생성하는 경우 save = insert를 수행할 때 select 쿼리가 한번 나가는 경험을 하게 되어 왜 그런지? 어떻게 개선할 수 있는지 알아보고자 합니다. JPA에서 Save는 어떻게 동작할까? 저장하려는 엔티티가 새로운 엔티티라면 persist 저장하려는 엔티티가 새로운 엔티티가 아니라면 merge @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null"); if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { r..