Spring/Spring Data JPA

JPA를 사용하여 페이징 처리를 할 때 Slice와 Page 두 가지 방법이 있다. SliceJPA와 QueryDSL을 사용하여 페이징 처리를 할 때 Slice를 반환하는 방법은 전체 결과의 개수를 쿼리하지 않아도 되는 특별한 접근 방식이다. 이 방식은 페이징 처리 시 필요한 데이터의 일부만 로드하면서 다음 페이지가 존재하는지 여부만을 알려주는 방법이다. 즉, 사용자가 요청한 페이지와 그다음 페이지의 데이터만 조회하여 현재 페이지 다음에 데이터가 더 있는지 여부를 판단한다.  Slice의 동작 방식Slice는 페이징 처리된 데이터 목록과 함께 다음 페이지의 존재 여부를 알려주는 방식으로, 전체 데이터의 수를 계산하지 않기 때문에 count 쿼리를 실행할 필요가 없다. 이는 특히 대용량 데이터를 다룰 때 ..
📌 서론QueryRepository로 커스텀 레파지토리를 생성하고 @DataJpaTest로 테스트를 진행하려고 보니까 해당 Repository의 빈을 찾아오지 못하는 이슈가 발생했다. 이 이슈를 해결하면서 놓쳤던 부분을 다시한번 정리해보려고 한다. QueryDLS란?QueryDSL은 Java 어플리케이션에서 타입 안전성을 보장하는 동시에 복잡한 쿼리를 간결하게 작성할 수 있게 해주는 프레임워크다.특히, 스프링 부트와 함께 사용할 때, 데이터 접근 로직을 구현하는 방법에는 크게 두 가지 접근 방식이 있다: 기존의 custom interface 방식과 단독 빈으로 등록하는 QueryRepository 방식이다. 이 두 방식은 각각의 장단점을 가지며, 사용하는 컨텍스트에 따라 선택이 달라질 수 있다. 이번 ..
📌 서론Java의 JPA에서 복합키를 관리하는 방법에는 주로 @Embeddable, @EmbeddedId 어노테이션을 사용한다. 복합 키, 즉 복수의 필드로 구성된 기본 키를 사용하는 경우에 이러한 어노테이션을 활용하여 테이블의 기본 키를 엔티티에서 표현할 수 있다.이번 글에서는 @Embeddable과 @EmbeddedId에 대해서 알아보자 @Embeddable과 @EmbeddedId의 역할@Embeddable복합 키를 정의할 때 사용하는 어노테이션. 이 어노테이션을 사용하여 클래스를 정의하면, 해당 클래스는 다른 엔티티에서 임베디드 타입으로 사용될 수 있다. 복합 키 클래스 자체는 어떠한 생명주기도 갖지 않으며, 단지 엔티티의 일부로서 기능한다. @EmbeddedId 엔티티에서 복합 키를 사용할 때,..
QueryDSL 사용 시 자동 업데이트 되지 않는 JPA Auditing 수정 날짜 문제 해결 방법 📌 서론 프로젝트를 개발하다가 업데이트 관련 로직은 거의 QueryDSL을 사용하고 있었다. 그러다가 updateDttm 컬럼값이 바뀌지 않는 걸 확인하고 이를 수정하려다 알게 된 사실을 정리해보려고 한다. Auditing 필드 선언 JPA와 QueryDSL을 사용하여 엔티티의 생성 날짜와 수정 날짜를 자동으로 관리하는 것은 매우 흔한 패턴이다. 다음 코드는 우리가 작성한 생성 날짜와 수정 날짜 클래스다. /** * Auditing 필드 - 생성시간 등록 * 이 필드를 상속받으면 생성시간만 auditing이 적용된다. */ @ToString @Getter @MappedSuperclass @EntityLis..
JPA와 Spring Data JPA의 차이 📌 서론 컨퍼런스를 다니며 종종 JPA와 Spring Data JPA를 다르게 구별해서 사용하는 것을 보고, 이 둘의 명확한 차이가 무엇인지 알아보기로 했다. JPA (Java Persistence API) 정의와 목적 JPA는 Java EE의 일부로, 자바에서 관계형 데이터베이스를 사용하는 표준화된 방식을 제공한다. 주 목적은 개발자가 데이터베이스와 상호 작용하는 방식을 단순화하고, 객체 관계 매핑(ORM)을 통해 객체 지향 프로그래밍과 관계형 데이터베이스 간의 간격을 좁히는 것이다. 기능 엔티티 매니저를 사용하여 데이터베이스의 CRUD 작업을 수행한다. 다양한 어노테이션을 활용하여 객체와 테이블 간의 매핑을 제공하며, JPQL을 사용하여 쿼리를 실행한다. ..
JPA N+1 문제 해결하기 (fetch join, entityGraph, batch size) 서론 사이드 프로젝트를 같이 하는 동료와 이것저것 얘기하다가 N+1 문제에 대해서 이야기가 나왔다. 굉장히 단순하고 간단하게 알고있던 개념이었는데 계속 얘기하다보니 조금 헷갈리고 기존에 잘못 이해하고 있던 개념들도 있다는걸 알게되어서 이번 기회에 N+1 문제에 대해서 정확한 해결 방법을 정리해보려고 했다. 이후 나올 예시 코드를 테스트할 수 있는 컨트롤러, 서비스, 레파지토리는 아래 링크 레파지토리 안에 [nplusone] 패키지에서 확인할 수 있다. GitHub - yijoon009/blog-coding Contribute to yijoon009/blog-coding development by creatin..
ResponseDTO에 기본 생성자가 있어야 하는 이유 ResponseDTO에 기본 생성자가 필요한 이유는 JPA의 동작 방식과 DTO의 역할에 기반을 둔다. JPA는 엔티티 객체를 관리하기 위해 내부적으로 프록시 객체를 생성한다. 이 프록시 객체는 실제 객체의 상태가 필요할 때까지 데이터베이스 로드를 지연시키는 데 사용된다. 프록시 객체를 만들기 위해서는 대상 엔티티에 기본 생성자가 필요하다. 왜냐하면 JPA는 리플렉션을 통해 객체를 만들고, 리플렉션 메커니즘은 기본 생성자를 호출하여 객체의 인스턴스를 생성하기 때문이다. ResponseDTO는 일반적으로 데이터를 전송하는 데 사용되며, 이는 엔티티와는 분리된 존재다. 그럼에도 불구하고 ResponseDTO에 기본 생성자가 필요한 이유는 Spring 프..
native query에서 @rank := 0, @rownum 처럼 사용자 정의 변수 사용할때 에러 발생 Spring data JPA에서 native query를 사용할 때 @rank 함수를 적용해서 SQL문을 작성하려고 할 때 실행이 안되고 에러가 터졌다. 원인 코드 @rank := IF(@current_category = category_sn, @rank + 1, 1) AS rank 에러 원인 @rank := 0는 MySQL에서 사용되는 사용자 정의 변수(user-defined variable)다. 이것은 SQL 쿼리 내에서 값을 임시로 저장하고 참조할 수 있는 변수를 선언하게 해주는데 Hibernate나 JPA에서는 이와 같은 문법을 지원하지 않기 때문에, 쿼리를 실행할 때 위와 같은 에러가 발생한..
평양냉면7
'Spring/Spring Data JPA' 카테고리의 글 목록